回测过拟合检测体系从样本内外到组合稳健性评估 IG50免费开源股票数据API接口

回测过拟合检测体系,从样本内外到组合稳健性评估

做量化研究这几年,见过最离谱的事是:回测胜率 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

gitee开源地址

github开源地址

相关推荐
zmzb01031 小时前
C++课后习题训练记录Day199
开发语言·c++
数字融合1 小时前
透明化数字孪生:未来医疗的核心平台
大数据·人工智能·virtualenv
richard_first1 小时前
Transformer 与大语言模型:第7章 Multi-Head Attention 多头注意
人工智能·深度学习·机器学习
大江东去浪淘尽千古风流人物1 小时前
【HMD-Poser】CVPR2024 头显端实时全身动捕:可伸缩稀疏观测、LSTM+Transformer 时空解耦与在线体型估计
人工智能·lstm·transformer·vr·人体姿态估计
Zane1994121 小时前
`ClassName()` 只是一步?拆开看 `__new__` 和 `__init__` 各自在干什么
开发语言·python
Mr数据杨1 小时前
酒店房间图像识别辅助人口贩卖调查
人工智能·数据分析·kaggle竞赛
qq7422349841 小时前
Gradio 极简入门:三分钟为AI模型打造交互界面,并对比Streamlit与Dash如何选型
人工智能·算法·大模型·交互·dash
mengge.cloud1 小时前
云计算&服务器基础小白教程
android·linux·运维·服务器·网络·云计算
月亮和九磅十五便士1 小时前
朝闻 AI|2026-08-26
人工智能·大模型·ai agent