参数越多,回测为什么越容易过拟合?
做量化策略时,很容易掉进一个看起来非常合理的循环:
先跑一个基础版本,发现收益不够高;然后调整持有天数、调仓周期、止损线、因子权重和过滤条件。每改一次,回测曲线似乎就好看一点。直到年化收益提高、最大回撤下降、夏普比率也变得漂亮,我们终于选出了“最佳参数”。
问题是,这个最佳参数到底找到了规律,还是刚好迎合了这一段历史?
这就是回测过拟合最常见的来源。
参数本身不是问题,反复挑选才是
策略当然需要参数。均线需要周期,动量需要观察窗口,止损需要阈值,组合需要持仓数量。没有参数,很多策略根本无法运行。
真正的问题不是“用了参数”,而是:在同一份历史数据上尝试了多少种组合,最后又只展示其中最好的一组。
假设一套策略没有真实优势,每次回测结果都只是围绕零上下波动。如果只测试一次,结果通常不会特别惊艳;但如果测试500组参数,总会有几组因为运气而表现很好。
这就像让500个人同时抛硬币,每人连续抛20次。即使所有硬币都完全公平,也可能有人连续多次抛出正面。不能因为他这次成绩最好,就认为他掌握了抛硬币的技巧。
Halbert White 在《A Reality Check for Data Snooping》中讨论了数据窥探问题:当同一份数据被反复用于模型选择时,最终找到的优秀结果可能只是偶然,而不是模型真的具有预测能力。论文链接
五个参数,不只是五次尝试
参数数量增加以后,组合数量会迅速膨胀。
假设策略中有以下设置:
- 动量周期:5种选择;
- 调仓周期:4种选择;
- 止损比例:6种选择;
- 持仓数量:5种选择;
- 趋势过滤周期:5种选择。
如果把它们全部组合起来,需要测试:
\[ 5\times4\times6\times5\times5=3000 \]
这还没有计算因子权重、股票池、手续费、交易时间和过滤规则。表面上只是增加了几个参数,实际上已经从几次试验变成了几千次竞争。
试验次数越多,最优结果被运气抬高的可能性越大。
Bailey 和 López de Prado 提出的折损夏普比率(Deflated Sharpe Ratio),就是为了修正多重试验、非正态收益和选择偏差对夏普比率的夸大。论文链接
它提醒我们:夏普比率1.8是否可信,不只取决于1.8这个数字,还取决于你为了找到它试过多少个版本。
人工修改也是参数搜索
有些人没有使用网格搜索,就认为自己不存在过拟合。其实手工调策略同样可能构成参数搜索。
例如:
- 看到2018年回撤太大,增加大盘过滤;
- 看到2020年错过行情,放宽过滤条件;
- 看到2022年换手太高,延长持有周期;
- 看到某个月连续止损,再增加一个特殊规则。
每次修改单独看都有道理,但如果修改依据都是“看完历史结果以后再决定”,那么策略就在不断记忆历史中的具体答案。
机器搜索会留下3000组参数记录,人工搜索往往不会留下记录,所以更容易低估自己到底试了多少次。
最危险的不是参数多,而是只有一个尖峰
判断参数是否可靠,我更关注附近参数的表现。
假设动量周期25天表现最好:
- 23天、24天、26天、27天表现也相近,说明这里可能是一片稳定区域;
- 只有25天特别好,24天和26天都明显变差,说明这个结果可能依赖历史巧合。
真实的市场规律通常不会精确到“第25天有效,第24天和第26天立即失效”。如果参数稍微变化,策略表现就完全不同,那么实盘中的成交偏差、数据误差和市场结构变化都可能让优势消失。
所以,我更愿意选择稳定平台中间的参数,而不是最高的那个尖点。即使它的历史收益少一点,未来继续有效的概率可能更高。
样本外测试为什么仍然会失效?
最常见的做法是把数据分成样本内和样本外:
- 样本内用于设计和选择参数;
- 样本外只用于最后检验。
这个方法有效,但有一个容易忽略的问题:如果样本外表现不好以后,我们回去修改策略,然后再次查看同一段样本外结果,这段数据就不再是真正的样本外了。
反复执行以下过程:
修改策略 → 查看样本外 → 再修改 → 再查看
本质上是在逐渐把样本外信息泄漏进策略。
真正干净的样本外数据只能使用一次。个人研究很难拥有无限的新数据,因此更现实的做法是结合滚动检验、分阶段检验和不同市场环境验证,而不是把希望全部寄托在一次固定切分上。
我会怎样检查参数稳健性?
1. 先写清楚参数的经济含义
每个参数都应该回答一个真实问题。例如动量周期是在测量多长时间的趋势,止损是在限制哪类风险。解释不出作用、只因为能改善回测而存在的参数,应该优先删除。
2. 查看一片区域,不只看冠军
不要只保留最优组合。把相邻参数结果一起列出来,观察收益、回撤、换手和夏普是否平滑。如果结果形成稳定平台,可信度通常高于孤立尖峰。
3. 记录试验次数
建立实验表,记录测试日期、修改原因、参数和结果。失败版本也要保留。只有知道自己试过多少次,才能正确理解最后那个好结果有多少选择偏差。
4. 做时间滚动测试
不要只使用一个开始日期。可以检查不同起点、不同结束时间、滚动一年和滚动三年的结果,观察策略是否只靠少数年份贡献收益。
5. 改变费用和成交假设
提高佣金、滑点和冲击成本,延迟一个交易时点,检查策略是否仍然成立。如果稍微增加交易摩擦,收益就完全消失,那么历史优势可能缺乏实盘空间。
6. 检查不同市场阶段
分别观察上涨、下跌、震荡、流动性宽松和流动性收紧时期。策略不需要在所有环境都赚钱,但应该能解释它在哪些环境有效、在哪些环境会失效。
7. 保留简单基准
复杂版本应该与简单版本比较。如果增加五个条件以后,收益改善很少,或者改善主要来自一个特殊年份,那么复杂度可能不值得。
参数少,也不代表一定不过拟合
只有一个参数的策略,也可能经过几十个股票池、起止日期和交易规则的筛选。相反,一套参数较多的策略,如果每个参数都有明确逻辑、在独立数据上验证,并且相邻设置表现稳定,也可能具有较好的稳健性。
因此,不能机械地认为“参数少就是好策略、参数多就是坏策略”。更重要的是:
- 参数从哪里来;
- 总共尝试过多少版本;
- 是否只报告了最好结果;
- 相邻参数是否稳定;
- 换一个时期或市场是否仍有解释力。
我的理解
回测优化最容易产生一种错觉:每解决一个历史问题,策略就离完美更近一步。
但市场历史只有一条。我们不断针对这条路径修改规则,既可能是在提炼规律,也可能是在记住答案。两者在回测图上很难区分,只有进入未来以后才会露出差别。
所以,优化策略时我更关心的不是“最高收益是多少”,而是:
- 好结果是否覆盖一片参数区域;
- 换一个时间段是否还能工作;
- 增加交易成本后是否仍有余量;
- 删除一两个条件后,核心逻辑是否还成立;
- 我能否用一句话解释每个参数为什么存在。
一个回测特别漂亮的参数,不一定是答案,也可能只是历史给出的奖品。
真正值得实盘的策略,未必在历史比赛中拿第一,但它不应该因为参数偏离一点、成交晚一点或市场换一种节奏,就立刻失去全部优势。
免责声明: 本文仅用于量化方法研究和个人经验交流,不构成任何投资建议。历史回测和模拟结果均不代表未来表现。
参考资料
- White, H. (2000). A Reality Check for Data Snooping. Econometrica, 68(5), 1097–1126.
- Bailey, D. H., & López de Prado, M. (2014). The Deflated Sharpe Ratio: Correcting for Selection Bias, Backtest Overfitting and Non-Normality. The Journal of Portfolio Management, 40(5), 94–107.