朋友跟我吹了好几次,说他的公式能精准捕捉"主力低位吸筹、即将拉升"的那一刻。
代码很长,逻辑很复杂,变量名很唬人。
我帮他用沪深300实测了10个月——信号数是 0。
代码很长,逻辑很复杂,变量名很唬人。
我帮他用沪深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)。
把这两行改掉,它才真正变成一个"超卖 + 动量转折"的工具。
