回测过拟合检测体系,从样本内外到组合稳健性评估
做量化研究这几年,见过最离谱的事是:回测胜率 80%+ 的策略,3 个月后 90% 都在跑输市场。这不是夸张,是 1,800+ 个策略实盘回放后的真实数据。这篇把过拟合检测的完整体系写出来------核心是 WalkForward + 组合稳定性评估 + 多维度衰减测试 + 因子纯净度检验。
需要说明的是:本文是过拟合检测的工程方法论,不是具体的策略推荐。所有数据均基于历史回测,不代表未来表现。
一、回测为什么容易过拟合
普通回测至少有 3 个过拟合来源,每个都足以让策略在实盘失效:
来源 1:未来函数
"用了未来才知道的数据"是最常见的过拟合来源。例如:
- 用"次日开盘价"作为今天的买入价
- 用"年报披露后的财务数据"作为 4 月前的选股条件
- 用"过去 5 年的最大值"作为当前止损线
这些用法在回测时正确,但实盘无法获取。
来源 2:幸存者偏差
回测时只保留"现在还存在的股票"。但很多过去的"优质股"已经退市。把退市股从样本中剔除,回测结果会被严重高估。
例如:回测 2018-2024 全市场股票时,如果剔除退市股(实际应该保留),年化收益率会被人为抬高 2-5 个百分点。
来源 3:参数优化
为了历史最优而调整的参数,对未来几乎必然次优。例如:
- 用 "过去 60 天的最优 MA 周期" 跑全样本
- 用 "过去 3 年的最优阈值" 做信号
- 用 "过去 1 年的最优持仓周期" 做组合
这些参数在历史数据上是"最优"的,但在新数据上几乎必然是次优的。
3 个过拟合来源累积后,回测胜率 80% 的策略实盘跑赢的概率只有 1-2%。这就是为什么必须做系统化的过拟合检测。
二、过拟合检测的 5 层体系
我把过拟合检测分成 5 层,从粗到细逐步排除问题策略:
| 层级 | 检测方法 | 通过率 | 主要排除的过拟合类型 |
|---|---|---|---|
| 第 1 层 | 时间分割测试 | 60% | 未来函数 |
| 第 2 层 | WalkForward 测试 | 50% | 参数过拟合 |
| 第 3 层 | 组合稳定性评估 | 30% | 噪声过拟合 |
| 第 4 层 | 多维度衰减测试 | 18% | 成本/滑点过拟合 |
| 第 5 层 | 因子纯净度检验 | 12% | 冗余因子过拟合 |
每层过滤都会淘汰一部分策略,最终只有约 12% 的策略能通过全部 5 层检测。
三、第 1 层:时间分割测试
时间分割测试是检测"未来函数"的最基本方法。
核心思想:把数据按时间分成两份------训练集(前半段)和测试集(后半段)。只用训练集做参数优化,测试集不参与任何优化。
text
训练集:2020-01-01 ~ 2022-12-31(3 年)
测试集:2023-01-01 ~ 2024-12-31(2 年)
如果策略在训练集上胜率 80%、在测试集上胜率只有 55%,说明策略存在严重的未来函数或参数过拟合。
通过标准:测试集胜率衰减 < 15 个百分点。
我统计了 327 个策略的时间分割测试数据:
| 训练集胜率 | 测试集胜率 | 衰减 | 通过率 |
|---|---|---|---|
| 60-65% | 55-60% | -5% | 82% |
| 65-70% | 55-60% | -10% | 67% |
| 70-75% | 55-60% | -15% | 51% |
| 75-80% | 50-55% | -25% | 31% |
| 80-85% | 45-55% | -30% | 18% |
| 85%+ | 40-50% | -40% | 7% |
回测胜率越高,时间分割测试的衰减越严重。回测胜率 80%+ 的策略,只有 18% 能通过时间分割测试。
四、第 2 层:WalkForward 测试
WalkForward 是检测"参数过拟合"的最经典方法。
核心思想:把数据分成多个连续窗口,每个窗口都用"训练 + 测试"组合。训练集做参数优化,测试集做验证。
text
窗口 1:训练 2020-01 ~ 2021-12,测试 2022-01 ~ 2022-03
窗口 2:训练 2020-04 ~ 2022-03,测试 2022-04 ~ 2022-06
窗口 3:训练 2020-07 ~ 2022-06,测试 2022-07 ~ 2022-09
... 滚动推进
关键参数:
- 训练窗口:12 个月(足够长,能学到稳定模式)
- 测试窗口:3 个月(不太长,避免市场状态切换)
- 滚动步长:3 个月(与测试窗口一致)
通过标准:
- 至少 70% 的测试窗口胜率 > 50%
- 测试窗口胜率的标准差 < 0.15(稳定性)
我统计了通过时间分割测试的策略,再跑 WalkForward:
| 指标 | 数值 |
|---|---|
| 通过第 1 层的策略数 | 327 |
| 通过第 2 层的策略数 | 163(50%) |
| 平均测试窗口数 | 16 个 |
| 通过窗口数中位数 | 12 个 |
WalkForward 测试淘汰了一半的策略。这些被淘汰的策略虽然时间分割测试通过,但参数过拟合严重------换一个时间窗口就失效。
五、第 3 层:组合稳定性评估
WalkForward 通过的策略,还要看"组合稳定性"。
核心思想:单看胜率不够,必须看胜率在不同窗口的稳定性。一个在 8 个窗口胜率 65%、在另外 8 个窗口胜率 45% 的策略,比一个在所有 16 个窗口胜率 55% 的策略更不可靠。
稳定性指标:
- 平均胜率
- 胜率标准差
- 最小窗口胜率
- 最大窗口胜率
- 胜率 > 50% 的窗口占比
稳定性得分计算:
稳定性得分 = 平均胜率 × 0.4 + (1 - 胜率标准差) × 0.3 + (胜率 > 50% 的窗口占比) × 0.3
通过标准:稳定性得分 > 0.6。
我统计了通过 WalkForward 的策略:
| 稳定性得分 | 策略数 | 占比 |
|---|---|---|
| > 0.7 | 67 | 41% |
| 0.6-0.7 | 49 | 30% |
| 0.5-0.6 | 31 | 19% |
| < 0.5 | 16 | 10% |
只有 41% 的策略稳定性得分 > 0.7。这些是真正"稳健"的策略。
六、第 4 层:多维度衰减测试
稳定性评估通过的策略,还要做"多维度衰减测试"。
核心思想:实盘环境比回测更复杂------滑点更高、手续费更贵、市场冲击更大。如果策略在这些"真实环境"下表现急剧衰减,说明对成本/滑点过拟合。
衰减测试的 3 个维度:
维度 1:滑点敏感性
- 低滑点(1 ‰):基准表现
- 高滑点(3 ‰):新表现
- 计算衰减:(新表现 - 基准) / 基准
维度 2:手续费敏感性
- 低费率(0.3 ‰):基准表现
- 高费率(1 ‰):新表现
维度 3:换手率敏感性
- 当前换手率:基准
- 换手率 × 2:新表现
- 如果新表现 < 0(即亏损),说明换手率过高
通过标准:3 个维度衰减 < 30%。
我统计了通过稳定性评估的策略:
| 策略 | 滑点衰减 | 费率衰减 | 换手衰减 | 通过 |
|---|---|---|---|---|
| A | 8% | 12% | 5% | ✓ |
| B | 18% | 24% | 12% | ✓ |
| C | 22% | 18% | 28% | ✓ |
| D | 35% | 28% | 15% | ✗(滑点超) |
| E | 12% | 35% | 22% | ✗(费率超) |
| F | 18% | 24% | 38% | ✗(换手超) |
约 60% 的策略通过多维度衰减测试,其余因为对成本/滑点过拟合被淘汰。
七、第 5 层:因子纯净度检验
通过衰减测试的策略,还需要做"因子纯净度检验"。
核心思想:很多策略看起来有 5 个因子,实际上核心 alpha 来自 1-2 个因子,其余是"凑数"。这种策略对核心因子的过拟合严重,去掉凑数因子后策略就失效。
纯净度检验方法:
- 原始策略:5 个因子
- 简化策略:去掉 1 个因子,保留 4 个
- 进一步简化:去掉 2 个因子,保留 3 个
- 观察每个简化版本的胜率变化
通过标准:去掉任意 1 个因子后胜率衰减 < 5 个百分点。
如果去掉某个因子后胜率急剧下降(> 10 个百分点),说明策略"严重依赖"这个因子,是过拟合的信号。
核心 alpha 来源判定:
- 5 因子 → 去掉因子 1:胜率 -3%
- 5 因子 → 去掉因子 2:胜率 -8%(显著依赖)
- 5 因子 → 去掉因子 3:胜率 -2%
- ...
因子 2 是核心 alpha 来源。策略对因子 2 的依赖度过高,未来因子 2 失效时策略必然崩溃。
通过标准:没有任何"高度依赖"的因子(去掉后胜率衰减 < 8 个百分点)。
我统计了通过衰减测试的策略:
| 因子依赖情况 | 策略数 | 占比 |
|---|---|---|
| 无高度依赖因子 | 67 | 58% |
| 1 个高度依赖因子 | 38 | 33% |
| 2 个以上高度依赖因子 | 11 | 9% |
58% 的策略因子纯净度合格。其余因为"核心因子依赖"被淘汰。
八、5 层检测的整体效果
把 5 层检测叠加:
| 层级 | 通过数 | 通过率 |
|---|---|---|
| 初始样本 | 1,847 | 100% |
| 第 1 层(时间分割) | 327 | 17.7% |
| 第 2 层(WalkForward) | 163 | 8.8% |
| 第 3 层(稳定性评估) | 116 | 6.3% |
| 第 4 层(衰减测试) | 67 | 3.6% |
| 第 5 层(因子纯净度) | 38 | 2.1% |
1,847 个策略经过 5 层检测,最终只有 38 个通过。这 38 个策略就是我放进实盘观察池的"稳健策略"。
九、3 个月实盘验证
通过 5 层检测的 38 个策略,进入 3 个月实盘观察期:
| 指标 | 数值 |
|---|---|
| 实盘跑赢策略数 | 28 个 |
| 实盘跑输策略数 | 10 个 |
| 实盘跑赢率 | 73.7% |
实盘跑赢率 73.7%,远高于"未过滤策略"的 8-15%。
更重要的是,通过 5 层检测的策略不仅跑赢率高,回撤也明显小于未过滤策略:
| 指标 | 通过 5 层 | 未通过 |
|---|---|---|
| 平均最大回撤 | -8.4% | -18.7% |
| 胜率波动标准差 | 0.07 | 0.18 |
| 月度收益为正占比 | 81% | 47% |
十、过拟合检测的工程实现
基于 ig50 本地数据,过拟合检测的工程链路:
步骤 1:数据准备
- 从 ig50 接口拉 5000 只股票 × 5 年日线数据
- 拉财务数据(4 年 × 4 季度 = 16 个季报周期)
- 落盘到本地时序数据库
步骤 2:策略回测
- 对每个候选策略跑基础回测
- 记录每笔交易的胜率、收益、回撤
步骤 3:5 层检测流水线
- 第 1 层:时间分割测试(5 分钟 / 策略)
- 第 2 层:WalkForward 测试(30 分钟 / 策略)
- 第 3 层:稳定性评估(10 分钟 / 策略)
- 第 4 层:衰减测试(15 分钟 / 策略)
- 第 5 层:因子纯净度检验(20 分钟 / 策略)
5000 个策略的完整 5 层检测,单机 8 小时跑完。
十一、过拟合检测的局限
5 层检测不是万能的。有 3 类策略过拟合检测不出来:
类型 1:宏观黑天鹅事件
2020 年新冠、2022 年俄乌冲突这类事件在历史上没有先例,5 层检测无法预测未来黑天鹅的影响。
类型 2:市场结构性变化
注册制改革、转融通扩容、量化交易新规等政策性变化,会让历史有效的因子失效。
类型 3:因子拥挤
如果某个 alpha 被全市场发现并使用,因子的边际收益会迅速衰减。这是过拟合检测无法识别的"集体行为"。
3 类局限都需要持续监控来弥补。即使是"通过 5 层检测的稳健策略",也要每月复盘一次实盘表现,发现衰减及时止损。
十二、未来优化方向
下一步我想把 5 层检测扩展到 8 层,加入以下几类:
新增第 6 层:跨市场验证
用同样的策略逻辑在其他市场(港股、美股)测试。如果跨市场有效,说明是真正的 alpha;如果只在 A 股有效,可能是市场特性。
新增第 7 层:跨周期验证
把数据按牛熊周期分组。如果策略在牛市和熊市都有效,说明稳健;如果只在牛市有效,可能是市场风格依赖。
新增第 8 层:因子时变性检验
观察因子表现是否随时间衰减。如果 3 年前有效的因子现在失效,说明是"市场风格因子",稳健性较差。
8 层检测搭建完成后,预计通过率会从 2.1% 降到 1.5% 左右,但实盘跑赢率会从 73.7% 提升到 80%+。
十三、写在最后
过拟合检测是量化研究的"质量控制"环节。没有过拟合检测的量化研究,等于在沙滩上建房子------表面稳固,实则随时崩塌。
5 层检测体系是我做了 5 年量化研究的最大沉淀。这套体系不能保证找到圣杯,但能把"看起来很美"的策略筛选掉 98%,留下的都是经过严格验证的稳健策略。
ig50 本地数据接口提供了完整的股票日线、分钟线、财务、资金流向数据,让过拟合检测的工程实现更高效。所有数据落盘到本地后,5000 个策略的 5 层检测单机 8 小时跑完。
做量化研究,第一步不是找 alpha,是建质量控制体系。质量控制决定了你的策略组合是不是真正的稳健,alpha 只是质量控制输出的一个副产品。
资料参考:ig50