通达信区间涨跌幅公式算出来的数,首先取决于用的是哪一种口径,其次才取决于源码写得对不对。同一段区间,用首尾收盘算、用区间最高最低算、按交易日数折成日均算,是三个不同的量,写在同一张图上也不会重合。先把这三种口径分开,再谈源码怎么写。

这篇从最简的端点比值拆起,讲清 REF 的位置怎么决定起算点,再讲极值口径与折算口径各自回答什么问题,最后落到除权、停牌、数据起点这几处会让数值失真的地方。文中的函数语义以通达信金融终端内置的公式说明为准,不同版本在上限与提示措辞上可能有差别。

一、三种口径各自回答什么问题

口径 写法骨架 回答的问题 常见误用
端点 末收盘 ÷ 首收盘 − 1 从起点看到终点,价格整体移动了多少 当成区间内最大可获得的幅度
极值 区间最高 ÷ 区间最低 − 1 区间内价格摆动的总宽度 当成持有区间内的收益
折算 端点结果 ÷ 区间根数 把长短不一的区间拉平到同一尺度 用算术折算代替几何折算

三者的关系可以一句话说清:端点口径量的是位移,极值口径量的是摆幅,折算口径量的是速度。拿位移去比其他长度不同的区间,长度越长数值越大,比较本身没有意义;折算口径就是为了消掉这个长度影响而存在的。

二、端点比值:REF 的位置决定起算点

端点口径是最常用的一种通达信区间涨跌幅公式写法,最简的一版是这样写的:

{ 端点口径:近 N 个交易日的区间涨跌幅 }
N:=60;
RATE:(C/REF(C,N)-1)*100;

REF(C,N) 取的是 N 根 K 线之前的收盘价。这里有一个容易忽略的细节:N 取 60 时,起点是 60 根之前那一根,区间实际覆盖的是 60 根 K 线的位移,而不是 61 根。差一根在短区间里影响不大,在需要与别的口径对齐时会对不上。

对齐的办法是把起算点写死到一个具体日期上,用日期定位而不是用根数定位:

{ 以区间起点当根为基准,起点之后不再回看 }
K:=BARSLAST(DATE=1250103)+1;
RATE2:(C/REF(C,K)-1)*100;

这段里的 DATE=1250103 是按本机日期格式写的示例值,通达信的 DATE 返回的是压缩后的年月日整数,写之前先在公式管理器里把 DATE 单独输出一次,看本机返回的位数与格式,再照着写。日期写错位,BARSLAST 永远返回 0,整条结果会退化成当日涨跌幅,看上去像是公式没生效。

三、极值口径:HHV 与 LLV 的区间宽度

{ 极值口径:区间最高相对区间最低的宽度 }
N:=60;
HI:=HHV(H,N);
LO:=LLV(L,N);
WIDTH:(HI-LO)/LO*100;

这个量描述的是区间内价格摆得有多宽,与「在这个区间里持有能拿到多少」不是一回事。极值出现在哪一天、先高后低还是先低后高,都不影响这个数。把它当成波动幅度的描述可以,当成收益的描述就会高估。

想区分方向,可以把最高点与最低点的先后顺序也取出来:

{ 判断极值先后:HHVBARS 与 LLVBARS 的位置比较 }
NH:=HHVBARS(H,N);
NL:=LLVBARS(L,N);
ORDER:IF(NH<NL,1,-1);

HHVBARS 与 LLVBARS 返回的是「最高(最低)值出现在多少根之前」。数值小的那个出现得更晚,比较两个数的大小就能知道区间内是先见低还是先见高。这一段只做先后判断,不构成任何方向结论。

四、折算口径:把长短不一的区间拉平

比较两个长度不同的区间,直接比端点结果会把长度差异算成强弱差异。折算是把结果摊到每一根 K 线上:

{ 折算口径:端点结果按区间根数摊平 }
N:=60;
RATE:=(C/REF(C,N)-1)*100;
PERBAR:RATE/N;

这种算术折算在数值很小的时候与几何折算接近,数值越大偏差越大。区间端点结果接近 100 个点、长度 250 根时,算术折算给出的是每根 0.4 个点,而按复利反推的日均值要更低一些。做跨区间比较时,用算术折算已经能把长度影响压下去大半,需要精确到小数点后两位时才需要换成几何折算。

折算后的单位是「每根 K 线几个百分点」,不是「每天」。换成月线或周线,一根 K 线的长度变了,同一个数代表的节奏也变了。跨周期比较之前,把折算的分母统一下来。

五、除权除息会把区间涨幅算成假的

不复权序列里,除权当日的开盘价被折算下来,前一日收盘价还是除权前的价格。这一段跨过除权日,端点口径算出来的区间涨跌幅会出现一个台阶,台阶的高度与送转比例相关,与价格的实际变化无关。

处理办法有两层。第一层是把序列切到前复权再算,历史价格被折算到当前口径,台阶消失。第二层是跨区间比较时把除权日标出来,含除权日的区间单独看,不与不含除权日的区间并排。前复权会把历史价位改写,做历史核对时的数值与当时盘面上的真实成交并不一致,这一点在站内讲复权口径的几篇里已经说过。

分红派息同样会造成小幅台阶。比例小的时候容易被当成正常波动忽略,做长区间统计时累积起来就不是小数。区间越长,这一项越要交代清楚。

六、核对顺序与失效场景

算出来的数与预期不符,按下面的顺序查,一步只排除一类原因。

  1. 先对端点:把 REF(C,N) 单独输出,看这个价格落在哪一天。落在数据起点之前,返回值无效,整条结果失效。
  2. 再对区间:在 K 线图上按住右键拖选同一段区间,看软件自带的区间统计给出的涨跌幅。两个数对不上,先查复权设置是否一致。
  3. 最后对极值:把 HHV 与 LLV 单独输出,看最高最低分别是多少、出现在哪一天。极值日期落在区间之外,说明 N 的写法与预期差了根数。

软件自带的区间统计还有一个用处:它同时给出区间的振幅与换手,把这三个数与本机公式算出来的结果并排放一次,哪一项对不上就能定位到口径。图上的区间统计靠右键拖选触发,选完之后弹窗里逐项列出,与本机公式的输出对照着看。

停牌。N 是 K 线根数,不是自然日天数。区间中间有停牌,K 线根数不变,覆盖的自然日却被拉长。按根数描述区间时要把这一点写进注释,否则「近 60 个交易日的涨幅」读起来像一个自然月,实际可能跨了三个月。

新股与次新股。上市不足 N 根 K 线时,REF(C,N) 取不到值,结果为空。这一条在筛选时表现为「次新股整体不出现在结果里」,不是公式写错了。

数据起点。本机日线数据的起点决定最长可算的区间。要算三年以上的端点区间,先确认本地数据够不够;不够就补下日线历史,公式不改也能出结果。

通达信区间涨跌幅公式给的是「在你选定的一段 K 线上,价格移动了多少」,它不判断这段移动是否可持续,也不替人比较两只票的优劣。把口径写清楚、把除权处理交代清楚,同一个区间隔一段时间重算还能得到同一个数,这条公式才算可用。

延伸阅读:通达信公式编写教程 讲中间量输出与参数化写法,通达信指标原理与参数 讲复权与数据口径,指标回测与风险验证 讲样本区间怎么固定。

本文只作技术研究口径,内容是指标字段的取数与区间统计口径,不涉及也不构成对任何标的的判断。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。