1. 回测与实盘的鸿沟:为什么回测赚钱实盘亏?
说实话,这个问题我几乎每周都会被问到。
「老师,我的策略回测曲线漂亮得像教科书,年化50%,最大回撤不到5%。结果一上实盘,三天亏了8%。」
嗯,这太典型了。我自己入行头两年,至少踩过七八次这样的坑。今天咱们就把这个「回测赚钱实盘亏」的谜底彻底揭开。
1.1 回测不是真相,是「后视镜」
回测的本质是什么?
说白了,就是用历史数据验证你的交易逻辑。但历史数据有个致命问题——它已经发生了。你拿着今天的策略去回测昨天的行情,就像拿着答案去对题目,当然全对。
我见过最夸张的一个案例:有人用2015年股灾数据做回测,策略在暴跌中赚了3倍。他兴奋地实盘,结果2016年熔断行情一来,策略直接崩了。为什么?因为2015年的暴跌是「流动性危机」,2016年是「情绪性踩踏」,看似都是跌,但微观结构完全不同。
1.2 六大鸿沟,一个比一个致命
我根据自己的实战经验,把回测到实盘的坑归纳为六类。你想想看,你的策略中了几个?
| 鸿沟类型 | 回测中的表现 | 实盘中的真相 | 杀伤力 |
|---|---|---|---|
| 滑点与手续费 | 按收盘价成交,手续费忽略 | 实际成交价差0.1%,高频策略直接废掉 | ★★★★★ |
| 流动性陷阱 | 假设无限流动性,想买就买 | 小盘股一买就拉涨停,一卖就砸跌停 | ★★★★★ |
| 过拟合 | 参数优化到极致,曲线完美 | 换个时间段就失效,参数敏感 | ★★★★☆ |
| 幸存者偏差 | 只用了当前还在的股票 | 退市的、ST的都没算进去 | ★★★★☆ |
| 未来函数 | 无意中用了未来数据 | 比如用当天收盘价做开盘信号 | ★★★★★ |
| 心理与执行 | 机器自动运行,毫无情绪 | 实盘时手抖、犹豫、提前平仓 | ★★★☆☆ |
1.3 滑点:回测里最隐蔽的杀手
我刚开始做高频策略时,回测年化收益120%。当时觉得自己要发财了。
结果实盘第一天,亏了2%。我查了半天,发现是滑点问题。回测里我假设按卖一价成交,但实际交易时,我的订单量稍微大一点,就把卖一吃掉了,成交在卖二、卖三。一来一回,每笔交易多亏0.3%。
高频策略一天交易几十次,这0.3%的滑点累积起来,就是毁灭性的。
1.4 过拟合:曲线越漂亮,实盘越危险
你见过那种回测曲线吗?
净值曲线45度角向上,最大回撤几乎看不见,夏普比率3.0以上。很多新手看到这种曲线就兴奋,觉得找到了圣杯。
但我的经验是:回测曲线越完美,过拟合的概率越高。
为什么?因为市场本质上是随机的。一个真正有效的策略,它的回测曲线应该是「有波折的上升」,而不是「平滑的直线」。平滑意味着你用了太多参数去拟合历史数据,把噪音当成了信号。
1.5 幸存者偏差:你看到的都是活下来的
这个问题在A股尤其严重。
很多人在回测时,直接用了当前沪深300的成分股。但你想过没有?十年前的那些成分股,有多少已经跌成渣了?有多少已经退市了?
我做过一个实验:用同样的策略,一组用「当前成分股」回测,另一组用「历史成分股」回测。结果前者的年化收益是后者的2.3倍。为什么?因为当前成分股都是经过市场筛选的「幸存者」,它们本身就比历史成分股表现好。
1.6 未来函数:最愚蠢也最常见的错误
嗯,这个错误我自己也犯过。
有一次我写了一个策略,信号是「如果今天收盘价突破20日均线,明天开盘买入」。回测结果非常好,年化40%。
但后来我发现代码里有个bug:我用的「今天收盘价」实际上是「明天收盘价」——因为数据索引搞错了。也就是说,我的策略是用未来的数据去预测过去,当然百发百中。
这种错误在回测中非常隐蔽,尤其是当你用pandas做数据对齐时,一不小心就会引入未来数据。
assert (signal.index[-1] < data.index[-1]),确保信号时间永远早于数据时间。这个小技巧救了我好几次。
1.7 心理鸿沟:人不是机器
最后这个坑,说实话,最难克服。
回测时,你看着曲线下跌,心里毫无波澜,因为你知道它最终会涨回来。但实盘不一样。当你的账户真金白银在亏,当浮亏达到10%、20%,你的手会抖,你的心会慌。
我见过太多人,策略回测时严格执行,实盘时却提前平仓、追涨杀跌、甚至手动干预。结果就是:回测赚的钱,实盘全亏回去了。
1.8 核心逻辑图:回测到实盘的鸿沟
下面这张图,是我自己总结的「回测到实盘鸿沟全景图」。你可以把它当成一个检查清单,每次迁移策略前,逐项核对。
1.9 小结:别把回测当圣杯
回测是一个工具,不是答案。它告诉你「过去这样能赚钱」,但市场不会重复过去。
我个人习惯是:回测只用来排除明显无效的策略,而不是用来选择「最优策略」。如果一个策略在回测中表现平平,但逻辑清晰、参数稳定,我反而更愿意实盘试试。
记住一句话:回测是筛选器,实盘是试金石。
1. 回测时加入0.1%~0.3%的滑点
2. 用历史成分股,而不是当前成分股
3. 检查代码中是否有未来函数
4. 用不同时间段做交叉验证
5. 实盘前先跑三个月模拟盘