量化回测的六个陷阱:为什么回测漂亮的策略上线就废
未来函数、幸存者偏差、参数过拟合、基准选择、交易成本、beta 泄漏。前三个大部分人知道,后三个才是回测和实盘之间那道真正的坎。附一个我们自己跑了两年数据最后判定证伪的案例。
更新于 2026-08-01
回测和实盘之间的差距,大部分不是因为市场变了,是因为回测本身就算错了。下面六条按被发现的难度排序,前三条通常自己能查出来,后三条得靠对抗性验证。
一、未来函数
在计算某天的信号时用到了那天收盘之后才能知道的信息。最常见的形态是拿当天收盘价算指标,然后假装当天开盘就能按这个信号买入。稍微隐蔽一点的:用了「本周最高价」这类需要整周结束才能确定的量,或者用了会被后续数据修正的字段。
自查方法是把时间轴切断——生成第 T 天信号时,只允许程序访问第 T 天及之前的数据,物理上拿不到未来数据。靠人工检查代码逻辑很容易漏。
二、幸存者偏差
股票池只包含今天还在市场上的标的。退市的、被并购的、长期停牌后摘牌的,全都不在样本里。这会让任何「持有并等待」类策略的收益凭空变好,因为最坏的那批结果被提前删掉了。A 股退市率历史上不高,所以这一条的影响比美股小,但 ST 股和已摘牌标的仍然会带来偏差。
三、参数过拟合
在同一段数据上试了几百组参数,挑出表现最好的那组,然后拿这组参数在同一段数据上报成绩。这个成绩衡量的是拟合程度,不是预测能力。参数越多、试的组合越多,这个数字越好看,也越没意义。
对策是留出样本外数据,并且用 Deflated Sharpe Ratio 这类指标对「试了多少次」做惩罚。但要注意:样本外只要你反复看、反复调,它就变成样本内了。真正的样本外只能用一次。
四、基准选错
这一条开始就不容易自查了。一个策略如果偏好小市值股票,在小盘占优的年份会跑赢沪深 300,但那不是选股能力,是市值暴露。我们复核自己的主力模型时就撞上了这个:用沪深 300 当基准时超额收益为正,换成中证 500 和中证 1000 之后,样本外超额转为负的 0.3% 到 0.5%。
换句话说,那部分正收益买的是小盘 beta,而这个东西用指数基金就能拿到,不需要选股模型。基准必须和策略的风格暴露匹配,否则你测的是风格,不是 alpha。
五、交易成本被低估
佣金、印花税、过户费是明面上的,容易算。真正吃掉收益的是滑点和冲击成本,尤其是高频调仓的策略。一个日均换手一次的策略,单边成本按万分之五估,一年 240 个交易日就是 24% 的成本消耗——很多回测里这一项直接被设成了零。
还有一类容易忽略的:一字板买不进、停牌卖不掉、涨停封单排队排不上。回测里这些都是可以成交的,实盘里不是。
六、beta 泄漏(最难发现的一个)
策略看起来有预测能力,实际上只是在换一种方式复制某个已知因子的走势。我们有一个案例:给一只大盘股做日内交易信号,拿两年的 5 分钟数据、回归和动量两个方向、加上 DSR 惩罚和对抗性验证一起跑。回归方向直接失败,动量方向通过了所有关卡。
然后我们做了一件事——把这个「通过」的信号和大盘同期走势做相关性检验,相关系数 +0.97。它没有捕捉任何日内规律,只是把趋势方向换了个形式表达出来。剔除掉 45 个事件驱动的交易日之后仍然是亏的,而同期简单买入持有反而是正收益。
通过所有统计检验,不等于发现了规律。也可能只是换了个方式在描述你已经知道的事。
一份可以照着走的自查清单
- 1把时间轴物理切断,让程序在生成信号时拿不到未来数据。
- 2股票池包含已退市和已摘牌标的。
- 3记录你一共试了多少组参数,并对夏普做相应惩罚。
- 4样本外只跑一次,跑完不管结果如何都不再调参数。
- 5基准换三个:沪深 300、中证 500、中证 1000,看超额是否稳健。
- 6成本按实际费率加滑点代进去,不要设成零。
- 7把最终信号和大盘、和主要风格因子做相关性检验,相关系数超过 0.8 就要怀疑是 beta 泄漏。
- 8剔除事件驱动的极端交易日,看剩下的部分是否还有效。
最后一句边界:这份清单能帮你排除掉大部分假发现,但排除假发现和找到真规律是两件事。一个策略通过了全部八条,只说明它还没被证伪,不说明它一定有效。