一、回测陷阱概述:为什么回测会骗人?
做量化的人,谁没被回测骗过?
我刚入行那会儿,写了个套利策略,回测曲线漂亮得像教科书里的范例。年化30%,最大回撤不到3%,夏普比率3.5。我当时觉得,这不得财务自由了?结果实盘跑了三个月,亏了15%。
嗯,这就是典型的回测陷阱。
回测本身不会骗人,骗人的是我们对回测的理解。说白了,回测只是用历史数据模拟了一遍交易。历史会重演,但不会简单重复。你想想看,如果回测结果完美到不真实,那它大概率就是假的。
我见过太多人,拿着回测报告就敢上杠杆。结果呢?市场分分钟教你做人。
核心观点:回测不是预测,它只是帮你排除明显不靠谱的策略。一个策略能通过回测,不代表它能赚钱;但一个策略通不过回测,它大概率会亏钱。
1.1 常见陷阱分类
我把回测陷阱分成四大类。每一类我都踩过坑,今天一次性说清楚。
| 陷阱类别 | 典型问题 | 危害程度 |
|---|---|---|
| 数据陷阱 | 幸存者偏差、前视偏差、数据清洗不当 | 极高 |
| 执行陷阱 | 滑点估计不足、流动性忽略、交易成本低估 | 高 |
| 统计陷阱 | 过拟合、多重比较、数据窥探 | 极高 |
| 认知陷阱 | 确认偏误、后见之明、过度自信 | 中等 |
我个人习惯,每次回测前先对着这个表自查一遍。少踩一个坑,实盘就多一分胜算。
1.2 数据陷阱:最隐蔽的杀手
数据陷阱里,最要命的是幸存者偏差。
什么意思?就是你的回测数据里,只包含了活到现在的股票。那些退市的、暴跌的、被ST的,早就被剔除了。你用这些「幸存者」做回测,结果当然好看。
我在项目中遇到过一件事。有个同事做多因子选股,回测年化收益25%。我让他把退市股票加回去,结果收益直接掉到8%。他当时脸都绿了。
还有一个是前视偏差。就是你用未来的信息去回测过去。比如你用今天的财报数据去回测昨天的交易,这不就是作弊吗?
避坑指南:我曾经犯过这个错。写代码时不小心用了shift(-1),把未来数据挪到了过去。回测曲线漂亮得不像话,实盘直接崩。后来我养成了一个习惯:每次回测前,手动检查数据的时间戳对齐。
1.3 执行陷阱:理想很丰满,现实很骨感
回测里你按收盘价成交,实盘里你只能按对手盘的价格成交。这中间的差距,就是滑点。
套利策略对滑点尤其敏感。你想想看,套利赚的就是几个bp的价差。滑点一吃,利润就没了。
我建议,回测时至少按双边千分之二算交易成本。别嫌多,实盘只会更高。
流动性也是个坑。回测里你一键买入100万股,实盘里你挂单能把价格推高3%。尤其是小市值股票,流动性差得离谱。
个人经验:我做套利策略时,会专门加一个流动性过滤器。日均成交额低于5000万的股票,直接剔除。虽然会错过一些机会,但至少不会在关键时刻卖不出去。
1.4 统计陷阱:过拟合是最大的敌人
过拟合,说白了就是你让策略去「背诵」历史数据,而不是去「理解」市场规律。
怎么判断过拟合?有个简单的方法:把回测数据分成两段,前70%做训练,后30%做验证。如果训练集表现很好,验证集表现很差,那就是过拟合。
我见过最夸张的一个案例。有人写了50个参数,在1000只股票上做优化。结果呢?回测夏普比率5.0,实盘夏普比率-0.5。这就是典型的「数据挖掘」。
多重比较陷阱也很常见。你试了100个策略,总有一个能通过统计检验。但这只是运气,不是能力。
# 一个简单的过拟合检测代码
def detect_overfitting(train_returns, test_returns):
train_sharpe = np.mean(train_returns) / np.std(train_returns) * np.sqrt(252)
test_sharpe = np.mean(test_returns) / np.std(test_returns) * np.sqrt(252)
# 如果训练集和验证集差异过大,说明过拟合
if abs(train_sharpe - test_sharpe) > 1.0:
print("警告:可能存在过拟合")
return False
return True
1.5 认知陷阱:我们天生就不适合做交易
确认偏误,就是只找支持自己观点的证据。你做了一个策略,就拼命找数据证明它好。那些不好的信号,你自动忽略了。
后见之明更常见。看到行情走出来了,觉得「我早就知道会这样」。其实你根本不知道,只是事后解释起来很轻松。
我有个习惯:每次回测完,先找三个理由证明这个策略是错的。如果找不到,说明我还没想清楚。
核心建议:回测报告写完后,放三天再看。三天后,你会发现很多之前没注意到的问题。这是我用真金白银换来的教训。
1.6 知识体系总览
下面这张图,是我整理的回测陷阱知识体系。每次做策略前,我都会过一遍。
1.7 如何规避这些陷阱?
说了这么多陷阱,总得给点解决方案。我总结了三条铁律:
- 数据要干净:用全量数据,包含退市股票。时间戳要对齐,不要用未来信息。
- 成本要真实:滑点按实际流动性估算,交易成本往高了算。别怕回测结果难看,难看才是真实的。
- 验证要严格:样本外测试、交叉验证、蒙特卡洛模拟,能用的都用上。一个策略如果经不起折腾,那它就不值得上实盘。
最后说一句:回测最大的价值,不是让你相信策略能赚钱,而是让你知道策略在什么情况下会亏钱。搞清楚这一点,你才算真正入门了。