拿到一份名字带 roc 的指标或条件选股,先别急着往公式管理器里导入。通达信roc选股公式选择这件事真正要核对的只有三处:源码能不能读、参数能不能改、算出来的数值是不是 ROC 本身。这三处都过了,这份公式才是一段能自己维护的代码;三处里有一处对不上,它就只能当黑箱用,改不了也查不了。
一、ROC先算清楚:它到底是哪个比值
通达信内置的 ROC 指标定义写在系统公式里,计算形式是收盘价相对前 N 个周期收盘价的变动率,乘 100 之后以百分数显示。原始写法如下:
ROC:100*(CLOSE-REF(CLOSE,N))/REF(CLOSE,N); MAROC:MA(ROC,M);
拆开看三处。CLOSE 是当前周期收盘价,REF(CLOSE,N) 取的是 N 个周期之前的收盘价,两者的差除以基准再乘 100,得到的就是这段时间的变动百分比。N 与 M 两个参数分别决定比较的跨度与平滑的周期数,默认值随客户端版本给出的内置参数而定,可以在公式管理器里打开系统公式核对。
搞清楚这一层,后面的核对才有参照物。凡是名字里带 roc 的公式,最终都要回到这条算式上来对:它输出的数值,与用同一个 N 手工算出来的 100*(CLOSE-REF(CLOSE,N))/REF(CLOSE,N) 是否一致。数值对不上,说明它算的不是 ROC,只是借了这个名字。
二、三个维度一:源码能不能读、函数是不是标准写法
通达信roc选股公式选择的第一个维度看源码可读性。把公式导入公式管理器之后,按 Ctrl+F 打开公式管理器,选中这条公式点「修改」,编辑框里应当能看到完整的公式文本,包括参数声明、变量定义与输出语句。如果编辑器里只有一行调用、指向另一个文件或一串加密字符,说明这段逻辑没有以源码形式交付,改不了参数也查不了中间变量。
看到源码之后,接着核对函数名。ROC 类的公式会用到的函数集中在这几个:REF 取历史值,MA 求算术平均,CROSS 判断两条线是否交叉,HHV 与 LLV 取区间内最高值与最低值,VOL 与 FINANCE 取成交量与财务字段。这些是通达信的标准函数,语法与参数顺序在公式管理器自带的函数说明里能查到。看到不认识的函数名,先在函数列表里搜一遍,搜不到就说明这段公式依赖了当前版本之外的东西。
三、三个维度二:参数能不能调、改动之后数值跟不跟着变
第二个维度看参数可调性。可调不等于界面上有个输入框,判据是改完之后重算,输出跟着变。做法是把 N 从一个值改成另一个值,挂到副图上看曲线的位置与幅度是否发生位移。曲线上没有任何变化,说明这个参数没有被算式真正引用,或者被写成了常量。
{参数可调性核对步骤}
1. 公式管理器 Ctrl+F,选中公式点「修改」
2. 在参数列表里把 N 由 12 改为 6,保存
3. 挂到副图,看 ROC 曲线幅度是否变化
4. 再把 M 由 6 改为 12,看 MAROC 平滑是否变化
5. 两处都变,参数有效;有一处不变,追查算式里的常量
写死常量是这一步常见的拦路点,形态大概是这样:算式里直接出现 100*(CLOSE-REF(CLOSE,12))/REF(CLOSE,12),跨度固定为 12 而不接受外部传入。这种写法仍然算 ROC,只是失去了通过参数调整观察口径的能力。核对时把这类常量挑出来,改成引用参数,公式才回到可调状态。
下游的选股条件同样受影响。ROC 类的条件选股常见写法是判断 ROC 是否上穿某个水平线,或者是否连续若干周期为正:
{用 ROC 构造条件选股的可调写法}
N:=12;
M:=6;
ROC:=100*(CLOSE-REF(CLOSE,N))/REF(CLOSE,N);
MAROC:=MA(ROC,M);
XG:CROSS(ROC,0) AND ROC>MAROC;
这段里 N 与 M 是变量声明而不是参数,改的时候要在源码里改,改完之后用「测试公式」跑一遍语法,再进条件选股验证结果是否随参数变化。参数做成界面上可输入的还是写在源码里,取决于这份公式的交付形式,两种形式在核对时的检查点不同。
四、三个维度三:有没有未来函数、信号会不会重画
第三个维度看未来函数。所谓未来函数,指公式在计算当前周期的输出时引用了当前周期之后的数据,后视类的函数是典型代表。含这类函数的公式在历史图上显示的结果,在当时的那个时点并不成立,因为那部分数据当时还不存在。
核对方法落在函数名上。逐个扫一遍算式里用到的函数,出现取未来数据的后视类函数,就要把这处标出来。通达信标准函数中的 REF、MA、HHV、LLV、CROSS 都是基于当前与历史数据的写法,不会引入未来数据;真正需要处理的,是那些从外部带进来的、名称陌生的函数。
{未来函数核对:把可疑函数名逐个列出}
REF(X,N) 取 N 周期前的 X,方向指历史 正常
MA(X,N) N 周期算术平均 正常
HHV(X,N) N 周期内最高值 正常
LLV(X,N) N 周期内最低值 正常
CROSS(A,B) A 上穿 B 正常
(其他函数名)先在公式管理器的函数列表里搜一遍
还有一处与未来函数无关但会让人误判。通达信的信号显示方式里有只做当日与固定显示两种口径,同一段公式在不同显示方式下,历史信号的位置可能出现差异。核对时把显示方式固定下来,再比较同一条件下的结果,差异就不再来自显示设置。
五、名字叫 roc 但算的不是 ROC,要对到哪一步
市面上以 roc 命名的公式有几类偏离。一类是把价格换成成交量再算变动率,算式变成 100*(VOL-REF(VOL,N))/REF(VOL,N),本质是量能的变动率;一类是把分母改成区间极值,变成类似 (CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N)) 的形态,算出来的是当前价在区间里的相对位置,取值落在 0 到 1 之间;还有一类把 ROC 用 MA 做一次平滑,输出曲线与原始 ROC 的形状接近但幅度被压缩。
三类都能作为可用的公式存在,问题只出在名字与实际算的东西不是一回事。挑的时候按算式归类,不要按名字归类。核对到位的判据是:这份公式输出数值的取值区间与变化方向,能不能用它的算式解释清楚。取值为 0 到 1 的,不可能是 ROC;随成交量波动的,算的是量能变动率。
还有一处容易漏掉:同一段算式在日线、周线、分钟线上的结果不同,因为 REF(CLOSE,N) 取的是 N 个周期而不是 N 天。核对参数与周期时把当前的周期设置一并记下来,换个周期再看一次数值,两次结果的差异就能对上。
六、一份可核对清单
把上面三处收敛成一条可执行的核对线:导入后先看源码,再改参数,最后扫函数名。三步都过,这份公式归到可维护那一类;中间任何一步走不通,先把对应的那一处修好,再往下走。
{导入前的核对清单}
源码: 公式管理器 Ctrl+F「修改」,看得到完整公式文本
参数: 参数声明齐全,改 N 与 M 后重算输出跟着变
函数: 只用 REF / MA / CROSS / HHV / LLV 等标准函数
算式: 输出数值可用 100*(CLOSE-REF(CLOSE,N))/REF(CLOSE,N) 复算
口径: 记下当前周期设置,日线结果与其他周期结果不混用
这条线走下来,通达信roc选股公式选择剩下的就是取舍:源码能读的留,参数能调的留,函数名能对上的留;三项里缺哪一项,就看自己能不能接受它在那一处的限制。核对本身不需要额外的工具,公式管理器里的「修改」「测试公式」与函数说明三处,就够把这三个维度走完。
本文只作技术研究口径,不涉及也不构成对任何标的的判断。
