通达信条件选股公式测试这件事,卡点不在代码写得多复杂,而在「算不算通过」这句话没有定义清楚。公式管理器点一下「测试公式」跳出通过提示,这只是一个语法结论;拿一段历史行情回看,公式在那天有没有触发,是另一个结论;临界值附近、停牌断档、新股上市首日这类边角情形,又是第三个结论。三个结论混在一起,测试就变成走过场。下面的内容只处理判据这一侧:测试之前把标准写死,测完对着标准核,不回头改标准去迁就结果。

一、测试公式按钮到底验了什么

公式管理器里的「测试公式」按钮,做的事是编译。编辑器把公式源码逐行读进来,按语法规则解析标识符、括号配对、参数个数与数据类型,再核对用到的函数名在当前版本里有没有注册。这三步走通,按钮给出通过提示。

它不核对的是逻辑。一段写法合法、函数调用齐备的公式,条件本身写反了,编译器一样放行。例如把两个时间序列的位置对调,写成今天的量和昨天的量直接比较,编译同样不报错,但打开的条件已经不是原来那个。

报错信息也要看是哪一类。提示里出现「缺少」,指向的是括号或参数没配对;出现「未定义的标识符」,指向的是变量名拼错,或用了当前版本没有的实现。这两类报错都能在编辑器里定位到行。

编译通过只说明公式「能被读懂」,不说明公式「算得对」。把这两件事分开,后面的测试才有对象。

二、逻辑测试:拿已知日期回看条件是否成立

逻辑测试的做法是找一个结果已知的历史日期,把公式的日期区间设到那一天,看输出是否与预期一致。入口在公式管理器里选中公式点「测试公式」,或把公式挂到副图之后按键盘方向键逐日回看。

找日期的方法是从条件本身反推。公式写的是「收盘价在二十日均线之上」,那就先在主图上看均线,挑一段价在均线上方的区间和一段在下方的区间,两个日期都要测。只测一个方向,测不出条件是否写反。

{逻辑测试选点示例:先定日期,再看结果}
条件文字: 收盘价在 20 日均线之上
成立区间: 主图上价格线连续位于均线上方的阶段
不成立区间: 价格线位于均线下方的阶段
做法: 两个日期各看一次,成立与不成立都要对上
输出位置: 条件选股公式输出为条件,挂副图或看选股结果条数

测的时候要把判断条件与显示条件分开。一段公式里若前面写了若干中间变量,最终只有一个赋值决定输出,回看时确认真正被判定的是哪一行。这一步在编辑器里从下往上找最后一个赋值语句即可定位。

三、边界测试:临界值、停牌、新股与除权

边界测试针对的是主区间之外的情形。临界值这一处,条件里凡是带比较符号的地方,都有取等与不取等的差别,把回看日期设到数值接近临界的那几天,确认取等行为符合预期。

停牌日的处理看数据侧。个股停牌期间不产生新的成交数据,公式按周期往前取数时,取到的是停牌前最后一根 K 线还是空值,取决于取数方式。用昨收作参照的写法,在停牌段会被反复引用同一个数,回看时表现为条件连续多天成立或连续不成立,与真实交易日的含义不同。

新股上市首日的数据不全,这是取数长度的问题。以二十日均线为例,上市首日往前只有一天数据,均线在数学上没有定义,公式此时取到的值由取数规则决定。把回看日期设到某只标的的上市初期,看条件在第几根 K 线开始才有确定值。

除权日影响的是价格序列的连续性。未做复权处理的收盘价在除权日出现跳空下移,以价格与均线比较为条件的写法,会在除权日附近产生与价格变动无关的判定变化。回看时把除权日单独列出来看一遍,能区分是条件本身的问题还是数据口径的问题。

边界项 要问的问题 判据怎么写
临界值 比较符号取不取等 把日期设到数值接近相等的 K 线,确认取等行为与预期一致
停牌日 停牌段取到的是哪根 K 线 停牌段的条件结果与恢复后首个交易日分开记录
新股首日 需要的历史长度够不够 从上市起逐根看,记录条件从第几根 K 线起有确定值
除权日 价格序列是否连续 除权日单独回看,与相邻交易日比较结论差异

四、把判定标准写死在测试之前

判定标准要在动手测试之前落到纸面。标准里写清三件事:测哪几个维度、每个维度用什么输入、什么结果算通过。写完再测,测出来的结果才有接受与不接受之分。

{测试判定标准模板:测试前先填好}
维度一 语法:   输入 = 公式源码
               通过标准 = 「测试公式」按钮无报错
维度二 逻辑:   输入 = 指定的历史日期区间
               通过标准 = 成立区间触发,不成立区间不触发
维度三 边界:   输入 = 临界值日 / 停牌段 / 新股初期 / 除权日
               通过标准 = 上述各日期结果与预期记录逐条一致
改参数前提: 上述三项全部记录完毕

顺序不能倒过来。看到测试结果之后再回头调参数,调完再测,测完再调,这个过程可以一直继续,因为标准在跟着结果移动,碰不到终点。把标准先写死,测出来不符合就改公式或改条件文字,改动也要记录。

还有一处容易被绕过:改了判定标准应当记为一次新的测试。标准从「二十日内触发」放宽成「六十日内触发」,这是两个不同的判定,两次结果要分别留档。

五、测试通过但结果不对的三层排查

现象是按钮通过、回看结果不合预期,这是通达信条件选股公式测试里卡住的一类僵局。排查按三层往下走,顺序是数据类型、周期、复权,三层都过才算收口。

第一层:数据类型

先核对公式取的是哪一类数据。收盘价、成交量、成交额、换手率、市值这些字段在通达信里各有取值范围,字段混用,数值量级对不上,比较结果就不对。做法是打开数据窗口,把公式中每个字段在指定日期的取值逐一对上。

第二层:周期

周期这一层看的是公式写在哪个周期上算。同一段以均线为条件的公式,放在日线上算与放在分钟线上算,均线代表的时长不同,触发位置也不同。条件选股公式在选股器里执行时的周期,要与回看时的周期一致,两边不一致,结果就对不上。

第三层:复权

复权这一层排在后面,因为它影响的是价格序列本身。同一只标的在除权前后,前复权与不复权的收盘价数值不同,公式里凡是直接写价格数字的阈值,在这两种口径下的含义不同。回看时先把图表的复权方式确认一次,选股器里若另有复权相关设置,也要与回看时保持一致。

三层的顺序可以换一下也无妨,关键是别跳层。数据类型没对齐就去看复权,会把字段口径的问题误判成分红送转的问题。

六、测试记录应该留下哪几栏

测试做完要留下记录。记录按列留:公式名称与版本、测试日期、测试维度、输入参数、实际输出、是否通过、以及不通过时的改动说明。公式名称带上改动次数,便于区分同名公式的不同版本。

栏位 填写内容
公式名称 公式名 + 版本序号,与公式管理器里的名称一致
测试维度 语法 / 逻辑 / 边界,一次一行
输入 语法填源码;逻辑与边界填具体日期区间与当日条件
实际输出 按钮提示原文、选股结果条数、副图上的输出值
判定 与测试前写下的标准逐条比对后填通过或不通过
改动 不通过时记下改了哪一行、从什么改成什么

记录本身要与公式文件一起备份。用户公式落在 T0002 目录下,备份在 T0002\gs_bak,改动前的版本可以从备份目录取回。

七、常见误判与对应处理

几类误判按现象列在下面。按钮通过被当成逻辑正确,是判据没有分层;回看日期只挑一段,是逻辑测试没有覆盖不成立的一侧;改了参数不提改动,是标准跟着结果移动。这三类都能靠写死的记录表发现。

现象 含义 处理
按钮通过,回看结果不对 语法结论被当成了逻辑结论 按数据类型 / 周期 / 复权三层依次核对
只在一个日期对上 只测了成立的一侧 补一段不成立区间,两个方向都测
边界情形没记录 停牌、新股初期、除权日未纳入输入 把这四类日期加入测试输入清单
改完参数就宣布通过 标准在测试后被放宽 把放宽后的标准记为一次新测试,分别留档

回到开头那句,通达信条件选股公式测试的产出不是一个「通过」的提示,而是一份写明了输入、输出与判定标准的记录。把语法、逻辑、边界三个维度各自的标准在测试前定好,测完按标准核,不通过就改公式并留痕。这样一轮测试下来,公式在任何版本上重新打开,判定依据仍然在原地。

本文只作技术研究口径,不涉及也不构成对任何标的的判断。

站内还有 指标回测与风险验证 的条目,选股公式与预警 里讲条件的落地写法,公式编写教程 里讲语法与函数,可对照查看。

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