3、过拟合的根源:数据窥探偏差、参数过度优化、样本内选择偏差、幸存者偏差
做策略回测,最怕什么?
不是亏钱,是你以为能赚钱,实则是幻觉。
我见过太多人,拿着回测曲线兴奋地冲进来,实盘一个月就灰头土脸地出去。问题出在哪?说白了,就是过拟合。而过拟合的根源,我总结下来就四个:数据窥探偏差、参数过度优化、样本内选择偏差、幸存者偏差。咱们一个一个拆开聊。
3.1 数据窥探偏差
这玩意儿,我习惯叫它「偷看答案」。什么意思?就是你用未来的数据去指导过去的决策。
举个例子。你写策略的时候,先看了2023年的行情,发现某指标在某个阈值下表现特别好。然后你把这个阈值写进策略,回测2022年的数据。结果当然漂亮——因为你已经知道2023年什么参数好,你只是假装不知道。
嗯,这里要注意。数据窥探偏差最常见的场景是:
- 多次回测同一段数据:你跑100次,总有一次曲线好看,你选那次。
- 根据全样本选择参数:你用全部历史数据调参,然后说「这个参数历史表现很好」。
- 事件驱动型后见之明:你知道某次黑天鹅发生了,于是策略里专门加了应对逻辑。
核心问题:数据窥探偏差让策略「记住」了历史,而不是「学习」了规律。
我在项目中遇到过一件事。有个同事,回测某商品期货策略,夏普比干到3.5。我问他参数怎么选的,他说「我试了200组参数,选了最好的一组」。我说你试试样本外。结果一出,夏普比直接掉到0.6。这就是典型的数据窥探——你用同一段数据既当训练集又当测试集,不出问题才怪。
避坑指南:我曾经犯过同样的错。后来我强制自己:回测数据必须切分成训练集、验证集、测试集三部分。训练集调参,验证集选模型,测试集只做最终评估。测试集只能用一次,用完就封存。
3.2 参数过度优化
参数过度优化,说白了就是「把策略调得太精细,精细到只适合某一段历史」。你想想看,一个策略如果有10个参数,每个参数取10个值,那就是100亿种组合。你总能找到一组参数让回测曲线完美向上。
但问题是,市场不会重复历史。那些参数可能只是拟合了噪声,而不是信号。
我总结了几种常见的参数过度优化表现:
- 参数数量过多:策略逻辑越复杂,参数越多,过拟合风险越大。
- 参数取值过于精确:比如移动平均线周期设为17.38天——这明显是拟合出来的。
- 参数在不同品种间差异巨大:同一个策略,在螺纹钢上参数是A,在铁矿石上参数是B,且两者毫无关联。
| 参数数量 | 过拟合风险 | 建议做法 |
|---|---|---|
| 1-3个 | 低 | 可以手动调参,但要做敏感性分析 |
| 4-6个 | 中 | 建议使用交叉验证或正则化方法 |
| 7个以上 | 高 | 强烈怀疑策略是否过度复杂,考虑简化 |
警告:参数越多,不代表策略越好。我见过有人用20个参数的神经网络做高频策略,回测曲线美如画,实盘直接崩盘。记住:简单策略往往更鲁棒。
我个人习惯的做法是:先固定大部分参数,只调1-2个核心参数。调完之后,做一次「参数敏感性分析」——把参数上下浮动10%,看看策略表现是否稳定。如果稍微一变就崩,那说明你过拟合了。
3.3 样本内选择偏差
样本内选择偏差,听起来高大上,其实很简单:你只选了「好做」的样本,回避了「难做」的样本。
举个例子。你做股指期货策略,只回测了2015年到2017年的数据。为什么?因为那几年趋势明显,策略表现好。2018年震荡市呢?你故意跳过了。这就是样本内选择偏差。
常见的表现有:
- 只选牛市回测:策略在牛市中表现好,但熊市中呢?
- 只选流动性好的时段:避开流动性枯竭的极端行情。
- 只选特定品种:某个品种历史走势特别「规整」,你只做它。
核心问题:你选择的样本不能代表真实市场的全貌。策略在样本内表现好,不代表在样本外也能赚钱。
我记得有一次,一个朋友给我看他的ETF套利策略,回测年化收益30%。我问他回测区间是什么,他说「2019年到2020年」。我说你试试加上2021年。结果加上之后,年化收益直接降到8%。为什么?因为2021年市场风格切换,他的策略失效了。这就是样本内选择偏差的典型后果。
避坑指南:我曾经只选「好行情」做回测,后来我强制自己:回测必须覆盖至少一个完整的牛熊周期。如果数据不够长,那就用多个品种的数据来补充。记住,策略要能在各种市场环境下生存,而不是只在顺风局里风光。
3.4 幸存者偏差
幸存者偏差,这词儿你可能听过。但在量化里,它有个更具体的含义:你只看到了「活下来」的标的,忽略了「死掉」的标的。
举个例子。你回测A股选股策略,用的是当前还在交易的股票。那些退市的、ST的、暴跌的股票呢?你根本没把它们纳入回测。结果你的策略表现当然好——因为你只选了「幸存者」。
幸存者偏差在量化中的常见表现:
- 只考虑当前存续的股票/期货合约:忽略了已经退市或下架的品种。
- 只考虑当前存续的基金:那些清盘的基金,你根本看不到它们的业绩。
- 只考虑当前表现好的策略:那些已经失效的策略,你不再关注。
警告:幸存者偏差会让你的回测结果虚高10%-30%。我见过有人用「当前中证500成分股」回测一个因子策略,结果夏普比2.0。但如果你用「历史上所有中证500成分股」回测,夏普比可能只有1.2。那消失的0.8,就是幸存者偏差带来的幻觉。
怎么解决?我个人习惯的做法是:使用「无偏」的数据集。比如做股票回测,必须包含所有曾经上市过的股票,包括已经退市的。做期货回测,必须包含所有曾经交易过的合约,包括已经下架的。虽然数据获取成本高,但这是必须付出的代价。
3.5 知识体系总览
说了这么多,咱们用一张图来总结一下这四个根源的关系。我画了个框架图,方便你理解。
你看,这四个根源其实有一个共同点:它们都让你高估了策略的真实表现。数据窥探让你「偷看答案」,参数过度优化让你「死记硬背」,样本内选择偏差让你「挑软柿子捏」,幸存者偏差让你「只看活下来的英雄」。
嗯,说到这,我想起一个真实的教训。几年前我做CTA策略,回测时用了当时还在交易的所有期货品种,夏普比1.8。结果实盘半年,夏普比只有0.7。后来复盘发现,我犯了两个错:一是用了全样本调参(数据窥探),二是忽略了那些已经下架的品种(幸存者偏差)。从那以后,我每次回测都会问自己三个问题:
- 我有没有用未来的信息指导过去的决策?
- 我的参数是不是太多、太精确?
- 我的样本是否覆盖了各种市场环境,包括极端行情?
一句话总结:过拟合的根源,说白了就是「你让策略记住了历史,而不是理解了规律」。记住这一点,你就能避开80%的坑。
好了,这一章的内容就到这里。下一章咱们聊聊怎么用具体的方法来识别过拟合——毕竟,知道问题在哪只是第一步,能动手解决才是真本事。