同一份公式、同一段行情,两次运行给出的清单长度可能相差很大:一次几十条,一次只剩两三条。遇到通达信选股公式不准,先不要动公式本身。下面这七处设置与数据,不改一行代码就能把一部分原因排除掉;剩下的部分再回到表达式里去找,范围会明显缩小。

文中的界面项与菜单路径以通达信金融终端个人版为准,券商定制版的菜单位置与默认设置可能有差异。全文只讨论公式的求值与结果核对,不涉及任何标的的判断。

一、先把「不准」分成三类再动手

「不准」这个词本身没有指向。通达信选股公式不准至少包含三种不同的现象,而三种现象对应的检查起点不一样。先归类,能省掉一圈试错。

现象 表现 先查哪里
数量不对 清单明显偏长或偏短,条目的性质看着没问题 选股范围、本地数据完整度
条目不对 数量接近,但清单里的条目不符合预设条件 参数取值、运算符边界
复算不一致 同一套设置,换一次运行结果就不一样 复权方式、周期与数据根数

第三类的排查优先级高于前两类。一份每次运行结果都不同的公式,先不谈结果是否符合预期,它本身就不具备可核对性。把第三类解决掉,前两类才有比较的基准。

二、参数取值:界面上显示的值与设想的差距

公式编辑器里的参数表定义的是缺省值,条件选股界面上的参数是本次运行实际使用的值,两者可以不同。改动过的参数会跟着选股方案一起保存,下次打开时界面显示的是上次保存的值,而不是参数表里的缺省值。

核对方式很直接:把条件选股界面上显示的每一个参数值抄下来,与公式编辑器参数表里的缺省值并排比对,不一致的项逐个确认是有意设定还是残留。

还有一层是单位。参数阈值按百分数写成 3,而表达式算出的是小数 0.031,两者比较时条件不会成立;反过来把阈值按小数写成 0.03 配上乘以 100 之后的表达式,条件则会全部成立。这一类差异在界面上看不出异常,因为参数值本身是合法数字。

{ 阈值按百分数写,表达式要跟着乘 100 }
涨幅1:=(C-REF(C,1))/REF(C,1)*100;
条件1:=涨幅1>3;

{ 阈值按小数写,表达式不乘 100 }
涨幅2:=(C-REF(C,1))/REF(C,1);
条件2:=涨幅2>0.03;

{ 两段条件在数值上等价,混搭则不等价 }

三、周期与 K 线根数

条件选股界面上有周期选项,公式编辑器里也可能写了带周期参数的函数。两处都要核对。

  • 界面周期。选股按日线执行还是按其它周期执行,在界面上选定。界面选日线而公式里引用了周线数据,两者并不冲突,但要确认写清了周期参数。
  • 数据根数。公式里出现 LLV(C,120) 这类写法时,本地该周期的 K 线根数不足 120 根,往回取值就取不满窗口,条件在这一段的表现与填满窗口后不同。
  • 上市时间较短的情况。新上市品种的 K 线根数天然不足,落在窗口内的判定与老品种不是同一件事。核对时把这一部分单独看。

四、复权方式

前复权以最新价为基准回溯调整历史价格,后复权以上市首日为基准向前调整,不复权保留原始价格。三种设置下,同一根 K 线的价格数值不同。

均线类函数的相对关系在等比缩放后不变,所以「两条线谁在上方」这类判断在三种设置下结论一致。会变的是与价格数值直接比较的判断:涨幅计算、与固定价位比较、除以价格得到的比例,这些在除权日附近会因复权方式不同而出现差异。

条件选股界面的复权设置与公式的预期要对齐。用前复权数据算出的比例,去和不复权设置下记录的阈值比较,两者的基准不同,结果自然对不上。核对时把两边设置调成同一项,再谈清单差异。

五、选股范围设置

范围设置决定扫描的对象集合,它解释的是清单「多出来」的那一部分。

设置项 影响
市场与板块 勾选的市场数量决定扫描范围,少勾一个市场,对应条目整体消失
自选股与全部品种 切换后清单基数变化,与条件本身无关
停牌与无行情条目 未过滤时,清单里会出现当日没有行情记录的条目,这类条目的字段取值为空,参与运算的结果没有意义
名称前缀过滤 启用后按名称前缀剔除,剔除规则会影响清单长度

范围变化造成的清单差异有一个特征:变化是成片的,不是零散的。清单里成批出现或成批消失,先回范围设置看;清单里只差几条,再往条件和数据上查。

六、本地数据完整度

行情数据存放在安装目录下的 T0002 文件夹中,日线与分钟线都在这里。数据缺段是通达信选股公式不准里可以直接观察到的一类:往回取值的函数取不到数据,条件在这一段恒不成立,清单上表现为该品种整体缺席。

确认方式:

  1. 打开「系统 → 盘后数据下载」,确认日线数据的覆盖区间与最近一次更新时间。
  2. 对清单里「应该出现却没有出现」的品种单独调出 K 线图,检查图表上是否有中断或空白的区段。
  3. 补齐数据后重新执行一次条件选股,把两次清单并排对比。补齐后新增的条目,就是数据缺段造成的。

这一步要先做,再做参数层面的核对。数据缺段时调参数,等于在一个不完整的结果上做比较。

七、运算符与边界条件

表达式本身的问题集中在这几处:

  • AND 与 OR 混用。含两种运算符的表达式,括号位置改变分组结果。逐项加括号,读起来慢一点,求值顺序确定。
  • 大于与大于等于。C>REF(HHV(H,N),1) 与 C>=REF(HHV(H,N),1) 在恰好相等的价位上给出不同结果。这一点在清单里表现为个别条目的进出。
  • 除以可能为零的分母。分母含 REF(C,1) 时,新上市首日与复牌当日可能取不到值。写成 DIV(分子,分母),或先加分母不为零的判断。
  • 输出变量与内置字段重名。输出命名为 C、H、V 一类会与行情字段冲突。编译未必提示,取值可能取到内置字段。
排查到第七处时,把条件拆开单独运行:把三项合并的条件先只留第一项,看清单是否与预期相符,再逐项加上去。哪一项加进去之后清单性质变了,问题就在那一项上。

八、条件选股与预警的求值差异

同一段逻辑放在条件选股公式里和放在预警条件里,求值方式不同。条件选股是对选定范围做一次完整扫描,按收盘后的完整数据求值;预警是按设定的轮询间隔持续判断,依赖实时行情推送,未收盘时最后一根 K 线的字段是变化的。

这个差别会直接反映在结果上:用预警在盘中看到的清单,与收盘后跑同一份公式得到的清单不一致,属于求值时点不同造成的,不是公式写错了。核对时前后两种情况要分开,不要混在一张表里比较。

预警侧还有两个变量:轮询间隔与本地计算量。公式引用的历史根数越长、扫描的品种越多,单轮求值耗时越长,两次判断之间的时间间隔会相应拉大。这部分与公式的写法有关,与条件本身的对错无关。

把七处按顺序走完,通达信选股公式不准这件事已经能定位到具体一段:范围设置造成的成片差异、数据缺段造成的整体缺席、参数与单位造成的成批成立或不成立,这三类的表现各不相同,对着清单就能区分。剩下仍然对不上的部分,才需要回到表达式里逐行核对——而到这一步,你手上的已经是一份排除了外部变量的清单。

本文讲的是结果核对与设置排查,不涉及具体标的的判断,公式输出的是一份满足表达式的清单,不含任何参与与否的结论。站内还有 选股公式与预警 里讲条件与预警对应关系的条目,指标回测与风险验证 里讲历史数据上怎么复算,公式报错与卡顿排查 里讲其它故障的对照表,可对照查看。

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