任何回测结果,先别急着兴奋。回测数字天然偏乐观,因为有四个偏差藏在里面,它们会让历史绩效系统性虚高:
| 偏差 | 表现 | 对结果的影响 | 怎么排除 |
|---|---|---|---|
| 未来函数 | 公式用了当时不存在的数据 | 信号失真,胜率虚高 | 逐根 K 线核对信号是否收盘即固定 |
| 前视偏差 | 用当日收盘价产生信号、当日就买入 | 买点永远"精准" | 信号次日开盘价成交 |
| 幸存者偏差 | 只测现在还活着的股票池 | 退市股亏损被剔除 | 用含退市股的历史成分池 |
| 成本忽略 | 不算手续费、滑点、印花税 | 高换手策略假盈利 | 双边万三到千一成本入模 |
这四个偏差叠加,一个平庸的策略也能回测出 80% 胜率。所以第一步不是优化公式,是把回测环境做干净——信号、成本、股票池都得贴近实盘。
把 1000 组参数组合在历史数据上挨个跑一遍,选收益最高那组——这不是发现了规律,是玩了一场多重比较:1000 次随机尝试里,总有一组"碰巧"表现好。统计上这叫多重比较问题,你试得越多,撞大运的概率越大。
过拟合公式的共同特征:参数被精调到历史噪声上,换一段行情就失效。五个信号帮你快速识别:
防过拟合没有捷径,只有一条:样本外验证——用没参与过调参的数据来检验公式。三种主流做法:
| 方法 | 做法 | 优点 | 缺点 |
|---|---|---|---|
| 时间分割 | 前 70% 调参,后 30% 验证 | 简单直观 | 只测一段行情,运气成分大 |
| 滚动前推 | 每半年滚动一次窗口,前 3 年调参、后 1 年验证 | 覆盖多段行情,最接近实盘 | 工作量最大 |
| 分段交叉 | 把历史切成 4-5 段,轮流留一段验证 | 样本利用充分 | 对行情结构变化不敏感 |
把上面内容串成一条可执行的流水线,任何新公式按这七步走:
七步里任何一步不过,公式就回炉。多数被淘汰的公式,都倒在第五步之前。
不同工具做法不同,但原理一致:
无论用哪个工具,记住一条:回测报告里没有"样本外"三个字的,等于没验证。
A: 大概率是过拟合:公式在历史数据上被反复优化,记住了过去的具体走势而不是规律。同时可能混入未来函数、前视偏差、没算手续费滑点。回测 90% 的胜率如果没做样本外验证,参考价值很低。
A: 三个快速测试:参数动 10% 到 20% 看绩效是否剧烈变化,剧烈变化就是过拟合;把时间切两段只拿前 70% 调参,后 30% 直接跑,绩效大幅缩水就是过拟合;换一段完全没见过的行情(如不同牛熊阶段)验证,失效就是过拟合。
A: 最推荐滚动前推:用前 3 年定参数,在接下来的 1 年验证;然后窗口前移,每半年重复一次。这样覆盖了不同行情阶段,比单次切分更接近真实使用场景。注意验证段任何参数都不许再调整。
A: 不是一回事但经常同时出现。未来函数是公式用了当时不存在的数据(如 ZIG、XMA),属于数据污染,回测直接失真;过拟合是参数被优化到历史噪声上,属于方法论问题。未来函数是硬伤,过拟合是软伤,都要排除。
A: 至少覆盖一个完整行情周期或 3 到 6 个月,且经历过一次与回测段不同的市场风格。跟踪期小仓位运行,逐笔记录实际信号与回测对比,胜率差在 10 个百分点以内、最大回撤在预期内,才算初步验证通过。