把一段公式装进软件、看到图上有信号,并不等于它可靠。通达信公式测评要回答的是另一类问题:把参数、周期、复权方式固定下来之后,它在不同行情段上的输出是否一致;遇到除权、停牌、数据不足时会不会给出无效结果;换一台机器、换一个版本,同一段行情能不能得到同一份清单。这三件事测完,才算对这个公式有了基本判断。

下面按测评目标、前置条件、样本选择、输出改造、判定口径、复现步骤、记录方式逐段展开。文中菜单路径与文件名以通达信金融终端个人版为准,券商定制版的函数集与菜单位置可能有差异,以该版本自带的说明为准。全文只讨论公式的行为可复现性,不涉及任何标的的判断。

一、测评要回答的三个问题

先把测评和另一个相邻的动作分开。回测关心的是历史上按某个规则执行会得到什么结果,它的输出是一组统计量;测评关心的是公式的行为是否可预期,它的输出是一份判定记录。前者问「效果如何」,后者问「行为是否稳定」。两者可以都做,但混在一起谈会让判定标准变得模糊。

通达信公式测评要回答的问题是三个:

  1. 输出是什么。在给定的参数取值下,公式在某段行情上输出多少个信号、出现在什么位置。这是基准值,后面所有比对都以它为参照。
  2. 边界行为如何。数据根数不足以填满窗口时、处在除权日前后的位置时、处在停牌复牌的位置时,公式给出的是有效值还是无效值。这一段没有提示可看,需要专门测。
  3. 换环境是否一致。同一段行情,在另一台机器上、另一个版本上、另一个周期上,输出是否逐根对得上。对不上时差异集中在哪一段。

三个问题里,第一个是准备工作,第二个和第三个才是测评的实质。只做第一个,等于确认「公式能编译、能出结果」,这与「公式可靠」之间还隔着两段距离。

二、前置条件:把四项变量固定下来

测评的可比性来自条件恒定。四项变量在开始之前必须写下来,中途不改:

变量 在哪里读到 为什么要固定
软件版本 菜单「帮助 → 关于」,读出版本号与版本类型(个人版 / 券商定制版) 不同版本的函数集不同。官方更新记录里出现过按版本新增函数的情况,例如 V7.62 加入 SUMBARSX、修正 IFC 函数行为;用到了这类函数的公式在旧版本上无法得到同一结果
K 线周期 K 线图左上角的周期按钮,或按周期快捷键切换 EMA 一类递推函数在每个周期上重新递推,日线与周线的 DIF 数值水平不同
复权方式 「系统 → 盘后数据下载」附近的复权设置,或行情报价右键菜单中的复权项 前复权以最新价为基准回溯调整,后复权以上市首日为基准向前调整,除权日附近的涨跌幅计算结果不同
本地数据完整度 「系统 → 盘后数据下载」,或对单只股票按右键查看「数据下载」状态 本地日线缺段时,REF、LLV、HHV 往回取值会取到不足的根数

公式本身挂在哪一类也要先确认。打开「功能 → 公式系统 → 公式管理器」,左侧按类型分树:技术指标公式、条件选股公式、五彩 K 线公式、交易系统公式。同一段逻辑放在技术指标里可以带绘图语句,放进条件选股公式里则不允许保留绘图语句,编译阶段就会拦下来。测评开始前先确认公式归属的类别与预期一致。

四项变量写成一行记录再开始:版本号 / 周期 / 复权方式 / 数据截止日期。后面每次比对,先核对这一行是否完全相同,再谈结果差异。

三、样本区间怎么选

样本区间选择的目标不是让公式表现好看,而是让公式的边界行为暴露出来。一段平稳上行的行情测不出什么东西。

区间里应当包含四类位置:

  • 除权日。价格在当天发生跳变,均线与价格类函数在跳变前后的关系会改变。
  • 停牌与复牌。停牌区间没有行情数据,复牌当日与停牌前的价格之间隔着一段空档,按根数取值的函数会跨过这段空档。
  • 连续单边行情。用于观察条件长时间成立或不成立时,公式输出的连续段长度是否符合预期。
  • 成交清淡的区间。部分公式引用了成交量或金额类函数,在清淡区间这些量级明显变小。

还要单独处理数据起点。以 EMA 为例:它的第一个值取第一根 K 线的收盘价,之后按权重递推,因此靠近数据起点的位置数值尚未收敛。窗口取 30 根时,从数据起点往后数 30 根之内,LLV、HHV、REF 这类往回取值的语句都取不满窗口。这一段的结果与两边的数据长度有关,比对时把它单独排除,只看其后部分。

样本区间的长度要明显大于公式里最长的窗口。公式中出现了 LLV(C,120) 一类的写法,区间只取 60 根,前一半的输出全是无效值 —— 这不是公式的问题,是取样的问题。

四、把输出改造成可逐根比对的形式

原始公式带有绘图语句,图上看得见,但没有办法逐根对数。测评的第一步改造是把输出统一为同一个可读形式:条件成立输出 1,不成立输出 0。

{ 原始写法:图上能看到图标,但没法逐根对齐 }
DRAWICON(CROSS(DIF,DEA),L*0.98,1);
DRAWTEXT(CROSS(DIF,DEA),L*0.96,'交叉');

{ 改造后:成立输出 1,不成立输出 0 }
交叉:=CROSS(DIF,DEA);
对照:IF(交叉,1,0);

{ 只在对照输出上比对,绘图语句全部去掉 }
{ 条件选股公式里本来就只允许保留最后一行逻辑输出 }

改造时注意三处:

  1. 中间变量与输出变量的区别。用 := 赋值的是中间变量,不输出;用 : 赋值的是输出变量,会画到图上。测评时只保留一个输出变量,其余全部改成中间变量。
  2. 输出变量名不要与内置名冲突。输出变量命名为 C、O、V 一类会与行情字段重名,编译阶段未必报错,运算时取到的可能是内置字段而不是本意。
  3. 除零的写法。公式里有除法时,分母在新股首日、复牌当日可能取不到值,直接用会得到一个无效结果。写成 DIV(分子,分母),或者先加一个分母不为零的判断。

五、判定口径:什么算通过

判定口径要在测之前写下来,否则通达信公式测评的结果会被事后解释。建议按三项判定:

判定项 通过标准 记录方式
事件数 同一段行情、同一组参数下,输出为 1 的根数与基准一致 记下基准根数与实测根数,两者直接相比
位置一致性 两边输出为 1 的位置逐根相同;若不同,差异根的位置与相邻 K 线的周期、复权设置有关 把两边的输出并排放,标出差异根的日期
边界行为 数据不足时不输出无效值;除权日附近的行为与设定一致 单独截取边界段比对,与主区间分开记录

「看起来差不多」不能作为判定。信号数量差一根,就是差一根;差异根集中在最左边,指向数据起点;集中在除权日附近,指向复权方式;整体平移,指向周期或参数取值不同。把差异定位到段,比笼统说「对不上」有用得多。

六、复现:换环境是否得到同一结果

复现要动到公式文件本身。通达信的自定义公式与相关数据存放在安装目录下的 T0002 文件夹中,其中 PriGS.dat 保存自定义公式的数据,gs_bak 是同目录下的备份文件夹。换机器复现时按下面的顺序处理:

  1. 先在原机器上用公式管理器把公式导出,导出时记录它所属的类别与参数表的取值。
  2. 在目标机器上导入,导入后回到公式管理器逐项核对参数表:参数名、缺省值、最小值、最大值。参数表不随源码本身走,这一步容易漏。
  3. 按第二节的四项变量把目标机器的版本、周期、复权、数据截止日期调成与源机器一致。
  4. 重新下载本地数据,确认日线根数不少于源机器。

结果仍然对不上时,排查顺序是:先查四项变量是否真的对齐,再查本地数据是否等长,最后才怀疑公式。顺序颠倒会把时间花在改写一段本来没有问题的逻辑上。原机器的公式文件建议按官方给出的方式保留一份备份,即 T0002 目录下的 gs_bak;需要恢复时从该目录取回对应的数据文件。

七、测评记录表与下一步

一次测评结束时留下一张表,比留下一句结论有用。表的列建议固定为:

列 填写内容
版本与类型 版本号 + 个人版 / 券商定制版
周期与复权 日线 / 周线 / 分钟线 + 前复权 / 后复权 / 不复权
样本区间 起止日期、数据根数、数据截止日期
基准事件数 原环境下输出为 1 的根数
差异根 日期列表,若为空写「无」
边界表现 数据不足段与除权日附近的行为描述
结论 可复现 / 条件依赖 / 未通过

下一步动作按结论分两种。判定为可复现的公式,把记录表和参数表一起存档,此后换版本时按同一张表重测一次即可;判定为条件依赖的公式,把依赖的条件写进记录表——例如「仅在不复权设置下与基准一致」——并按该条件使用。

通达信公式测评的产出是一份可以复核的记录,而不是一句评价。记录里最有价值的两列是差异根与边界表现:前者说明公式对环境有多敏感,后者说明它在数据不完整时会不会给出无效输出。

本文讲的是公式行为的可复现性与边界验证,不涉及具体标的的判断。站内还有 指标资源选择与会员 里关于资源筛选的条目,指标回测与风险验证 里讲历史数据上怎么核对结果,公式编写教程 里讲输出变量与中间变量的写法差异,可对照查看。

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