先区分两件事:算得对不对,和算出来稳不稳

通达信公式信号稳定性讨论的不是公式算得对不对,而是同一段算式在不同数据区段上给出的结果是否一致。这是两个独立的问题。一段算式可以完全正确地实现了设计意图,同时在早期数据上给出与近期差别很大的结果,原因出在数据本身而不是算式。

把这两个问题分开,是因为它们的检查手段完全不同。算得对不对要用复算核对,逐层输出变量、手工比对数值;稳不稳要用分段对照,把同一段算式放到不同时间范围上跑,看结果的分布有没有系统性变化。本文只讲后者。文中写法以通达信 PC 版的公式系统为准,不同版本与券商定制版在函数签名与数据精度上存在差异,请以你所用客户端帮助文档里的说明为准。

要回答的问题 检查手段 改动方向
算式实现是否符合设计 逐层输出 + 手工复算 改语句、改字段、改窗口
结果是否稳定 分段跑 + 分布对照 改窗口长度、加边界保护
是否用了未来信息 逐根检查取值时点 换成不含未来信息的写法
参数是否敏感 参数扫描,看结果漂移幅度 换参数或加大窗口

影响通达信公式信号稳定性的第一项:未来函数

未来函数指那些在当前根上会用到后续根数据的函数。它们的特点是画出来的历史形态与实际使用时可得的信息不一致:事后看图,标记打在了转折之前;实时使用时,那个标记在当天并不出现。

判断一段算式有没有用到未来信息,可以看它在计算当前根时引用了哪些数据位置。只引用当前根与更早根的函数,不含未来信息;引用了更大偏移量的,要逐条确认。

{偏移量为正表示向未来取数,是未来信息的直接标志}
向前取:REF(CLOSE,-1);        {负偏移=未来一根,含未来信息}

{向历史取数,不含未来信息}
向后取:REF(CLOSE,1);         {正偏移=前一根,安全}

{用 ZIG 一类转折点函数时,最后一个转折点的位置会随后续数据变化}
转折:ZIG(CLOSE,5);
含未来信息的算式,其特征是历史区段上的标记位置漂亮、实时使用时标记消失或滞后。判断办法是选一个历史日期,把图表截到那个日期为止,看标记是否已经出现在截图里。若截到该日期时标记还没出现,那是正常;若截到该日期时标记已经出现、而实际当时看不到,说明用到了未来信息。

第二项:窗口长度与数据可得性的关系

窗口长度越大,算式在历史早期需要的预备数据越多。图表最左端那些根上,可用数据不足一个完整窗口,函数的取值方式决定了它们会得到什么。

以移动平均为例,窗口长度 20 的均值在第 15 根上无法由 20 个数据算得。不同的实现处理方式不同:有的用现有数据求平均,有的返回空值,有的返回零值。三种处理在这段区间上给出的曲线形状完全不同。

{窗口长度对早期数据的影响}
短期:MA(CLOSE,5);
长期:MA(CLOSE,60);

{第 30 根上:短期有完整 5 个数据,长期不足 60 个}
{两条线在最左端的形状差异,来源是窗口而非行情}

检查办法是把图拉到历史最左端,观察窗口大的那条线在哪个位置开始出现。出现的起始位置应当与窗口长度对应。若某条线从一开始就贴着某个固定值,说明那一段取到的是空值或零值的替代。

第三项:参数敏感性扫描

参数敏感性指把某个窗口或阈值上下调整若干档之后,结果分布的漂移幅度。漂移幅度大的参数,意味着公式的表现对参数选择高度依赖,换一组参数会得到另一个结论。

参数 上调后的表现 下调后的表现 判断
平滑窗口 曲线更平缓,迟滞增大 曲线更贴价格,抖动增多 观察迟滞与抖动能否同时接受
阈值倍数 条件触发根数减少 条件触发根数增多 看触发根数对倍数的变化斜率
回看长度 对最近状态的反应变慢 对噪声更敏感 看同一根上取值是否跨档跳变

做参数扫描时每次只改一个参数,其余保持不动。同时改两个参数,观察到的漂移无法归因到具体哪一项。

用分段对照检验通达信公式信号稳定性

分段对照的做法是把同一段算式放到三个不同长度的时间范围上跑,把每一段的结果统计出来对比。

  1. 取一段较长的历史数据,记录条件成立的根数与相邻两次成立之间的间隔分布。
  2. 取最近的一段较短数据,做同样的统计。
  3. 比较两段的间隔分布形状。间隔分布的形态差异,比总数差异更能说明问题。
  4. 把算式挂到不同的周期图上重复前两步,观察差异是否随周期放大。

第三项是这套检查里信息量最大的一步。总数差一点可能是数据长度造成的,间隔分布的形状变了,说明公式在不同数据密度下的行为方式发生了变化。

边界数据上的三类异常

第一类是停牌与无成交区段。成交量为零的根上,任何以量为分母的算式都会取到异常值。处理方式是在算式里加分母保护。

{分母保护:把零值替换成非零常量}
安全量:=IF(VOL=0,1,VOL);
比值:=CLOSE/安全量;

{判断分母是否为零,再决定是否输出}
有效:VOL>0;

第二类是除权除息的处理。价格类字段在复权设置变化时数值会改变,而量的字段不变。以价格为输入的算式在切换复权设置后结果会整体平移,这不是公式问题,是口径变了。

第三类是上市初期的数据不完整。这段区间的处理方式与窗口长度那一项相同,办法是把图拉到最左端观察。

把检查做成一份可复用的清单

每一项检查都对应一个动作,做完打勾即可。

{检查动作清单}
1. 截取历史时点截图,确认标记不提前出现(未来函数)
2. 拉长图表到最左端,确认窗口大的线起始位置与长度对应
3. 单个参数上下调 2~3 档,记录触发根数变化
4. 分三段长度跑,比较相邻触发间隔的分布形状
5. 找到一段停牌区段,确认无异常大值
6. 切换复权设置一次,确认结果平移的幅度可解释

这六项里,第一项和第四项是最能暴露问题的两项,也最容易被跳过。

稳定性与样本数量的关系

分段对照的结论受每段样本数量影响。取一段很短的数据做统计,得到的分布形状不具备参考价值,因为样本量小的时候分布本身就是抖动的。

{样本量的判据}
1. 一段数据里条件成立的次数偏少时,间隔分布的形态不可靠
2. 把该段再切一半分别统计,若两半的形状差别很大,说明样本不足
3. 样本充足时,相邻两半的形状应当接近,只是尺度不同

判断办法是把同一段数据切一半分别统计,比较两个半段的分布形状。形状差别大说明样本不足,需要把时间范围扩大再统计。

参数与数据密度的对应关系

同一组参数在不同数据密度下的表现不同。密度高的数据上,相邻两根的差异小,窗口内的变化幅度也小;密度低的数据上,单根的变化幅度大。把为高密度数据选的窗口直接用到低密度数据上,等价于缩短了观察区间。

{对应关系的核对方式}
高密度数据(分钟级):窗口 20 覆盖的时间跨度短
低密度数据(日级):窗口 20 覆盖的时间跨度长

{换算思路:按时间跨度而不是按根数来设定窗口}
目标跨度 := 需要的观察时长;
根数 := 目标跨度 / 当前周期一根代表的时长;

按时间跨度折算窗口,可以让同一组观察目的在不同周期上保持一致。这与直接沿用根数是两种不同的做法,前者在跨周期使用时更稳定。

记录一次稳定性检查的结果

检查做完之后应当留下记录,否则下次改动无法对照。

{记录模板}
检查时间:____
数据范围:____ 到 ____
周期:____
条件成立根数:____
相邻成立的间隔:最小值____ 中位数____ 最大值____
参数档位与触发根数:____
异常区段:____(位置 + 表现)
结论:____(稳定 / 需换窗口 / 需加保护)

这份记录的价值在于:几个月后再看同一段算式,能把当时的判断依据还原出来,而不是只记得「当时看还行」。

相关写法可以对照 通达信公式编写教程 一栏;取值异常时的排查顺序,见 报错与卡顿排查 一栏;跨周期引用在验证阶段的注意事项,见 跨平台对比与公式转换 一栏。

通达信公式信号稳定性不是一个可以在写完公式后顺手确认的项,它需要单独安排一次分段对照。把上面六项做完,对这段算式的适用范围就有了一个基于观察的判断,而不是凭最近几根图上的印象。

文中函数名与语法按通达信 PC 版公式系统的常见写法描述;不同版本与券商定制版在函数签名、数据精度与复权处理上存在差异,具体请以你所用客户端帮助文档为准。本文只讨论公式机制与验证方法,不构成任何投资建议。

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