朋友用了三年的通达信公式,我帮他回测了一下,信号数把我愣住了

数据支持:沪深300 · 300只股票 × 180根日K · 前复权 · 共54000个样本
朋友跟我吹了好几次,说他的公式能精准捕捉"主力低位吸筹、即将拉升"的那一刻。

代码很长,逻辑很复杂,变量名很唬人。

我帮他用沪深300实测了10个月——信号数是 0

一个信号都没有。

不是效果不好,是零信号,根本没法用。

朋友听了半天说不出话。

问题出在哪?两行代码两个坑

公式的设计逻辑其实挺清晰的:

KDJ 金叉 = 短周期动量转折

乖离均值过滤 = 只在价格没有严重超买时做

超卖区间 = 股价在相对低位

三连阳 = 短期已经有资金进场迹象

突破近两日高点 = 确认启动

逻辑没问题。问题出在两行代码。

坑一:乖离均值 >= 20,是一个几乎永远不会触发的条件

乖离均值是把5日、12日、24日三条均线乖离率加权平均,再做3日指数平滑。

实测沪深300,这个指标的历史分布:

最小值:-14.76

最大值:30.18

平均值:-0.02(几乎就是零)

中位数:约 0

大于等于20的样本:8个(占全量54000个的0.1%)

0.1%,相当于每1000个交易日才出现1次。

这个条件本身就把整个公式的信号数压成了零。

坑二:IF 那条语句,把条件变成了随机触发

原版有这一句:

乖离过滤:=IF(乖离均值, 20, 0);

在通达信里,IF(非零数字, 20, 0) 返回 20,IF(0, 20, 0) 返回 0。

所以"乖离过滤 >= 20"实际等价于"乖离均值 ≠ 0"——只要指标不是正好等于零,这个条件就成立。

乖离均值在0附近的交易日占约43%。

也就是说,这行代码本意是"乖离在高位才做",实际变成了"乖离均值不在正中间的时候随机做"。

这不是条件,这是随机数。

还有一个约束太严:超卖 <= 10

超卖区间用34日威廉指标,要求低于10才算超卖。

实测54000个样本,只有13.6%的日子满足这个条件。

把它放宽到20,能覆盖27%的交易日,信号才会出现。

优化版:两行代码的修复

核心就改两处:

{=== 乖离过滤修复 ===}
{原版 IF(乖离均值,20,0) 改为真正的多头逻辑}
乖离多头:=乖离均值>0 AND 乖离均值>乖离均值[1];

{=== 超卖放宽 ===}
超卖阈值:=20;   {原版10极稀有,改为20覆盖27%样本}

{=== 完整选股 ===}
主力吸筹选股:
  CROSS(J值,K值)         {KDJ金叉}
  AND 乖离多头           {修复:零轴上方+动量向上}
  AND 超卖<超卖阈值     {放宽至20}
  AND C>REF(H,2)       {突破两日高点}
  AND (C>O AND REF(C,1)>REF(O,1) AND REF(C,2)>REF(O,2));  {三连阳}

一句话总结

朋友用了三年的公式,信号数是零。

不是他的判断有问题,是代码里有两行写错了。

一行把条件设成了不可能触发的阈值(>=20);

一行把条件变成了随机数(IF写法bug)。

把这两行改掉,它才真正变成一个"超卖 + 动量转折"的工具。


相关阅读

服务热线

18020657357

微信客服

微信客服