过拟合检测 — 基于日收益序列
基于投资策略的单条日收益序列,执行三项独立且互补的过拟合检测:PSR、蒙特卡洛模拟、衰减曲线+标准误分析。
触发场景
- 用户提供了策略的日收益序列(DataFrame/CSV/数组),希望评估过拟合风险
- 用户提到"过拟合检测""PSR""蒙特卡洛回测""夏普衰减""策略诊断"等关键词
- 用户想判断策略是否可投入实盘
前置条件
执行检测前确认以下条件满足:
- 日收益序列长度 ≥ 3 年(756 个交易日),PSR 和衰减曲线适用;蒙特卡洛建议 ≥ 5 年
- 日收益序列为 pandas Series 或可转换的数组,索引为日期
- 若无风险利率数据,默认假设为 0
若数据不足,告知用户当前样本量下哪些检测无法执行,哪些仍可提供参考。
检测流程
按顺序执行三项检测,每项输出独立结论,最后汇总为诊断报告。执行脚本位于 scripts/overfitting_detect.py。
检测 1:PSR(概率夏普比率)+ 稳健回退
目的:排除纯运气——策略的真实夏普比率是否显著大于 0?
执行步骤:
1. 计算日收益的均值、标准差、偏度、超额峰度
2. 年化夏普比率 SR_obs = (μ_d / σ_d) × √252
3. 代入 PSR 公式:PSR = Φ( (SR_obs − SR_bench) × √(T−1) / √(1 + γ₃/6·SR_obs − γ₄/24·SR_obs²) )
4. 其中 Φ 为标准正态 CDF,T 为观测年数
5. (v1.1) 失效回退:若 PSR 分母 1 + γ₃/6·SR − γ₄/24·SR² ≤ 0(极端厚尾+左偏常见),经典 PSR 数学失效,自动降级为 日收益均值 t 检验(t = μ̄/(σ/√n),p = 2·(1−T_{n−1}(|t|))),并输出可容忍回测次数 N* = 0.05/(1−Φ(t))
解读标准:
- PSR > 0.99(或回退后 t>2.6 且 p<0.01)→ ✅ 1% 显著性水平下显著有效
- PSR > 0.95(或回退后 t>2.0 且 p<0.05)→ ✅ 5% 显著性水平下显著
- PSR 0.90–0.95 → ⚠️ 显著性较弱,需谨慎
- PSR < 0.50(或回退后 t<1.96)→ ❌ 很可能只是运气
检测 2:蒙特卡洛模拟回测(零 Alpha 原假设,v1.1 修正)
目的:排除幸运路径——策略表现是否显著优于随机(真实 Alpha 是否存在)?
执行步骤:
1. 零 Alpha 原假设 Bootstrap:对去均值收益 r − μ 无参数有放回重抽样生成 M 条路径,其 SR 期望为 0
2. M ≥ 5000,每条路径长度与原始序列相同,计算每条路径年化 SR → 零 Alpha 分布
3. 统计真实 SR 落在零 Alpha 分布中的百分位;> 95% 即真实 Alpha 显著存在
4. (估计精度) 原始收益 Bootstrap:对原始收益重抽样,仅用于 SR 的标准误与 95% 置信区间
> ⚠️ v1.1 修正:旧版直接对"策略自身收益"做 Bootstrap,真实 SR 必落中位≈50%,只测 SR 估计误差、不能检验是否战胜随机,会把有效策略误判。现已改为零 Alpha 基准。
解读标准(基于零 Alpha 分位):
- > 95% 分位 → ✅ 真实 Alpha 显著存在
- 90%–95% 分位 → ⚠️ 有一定 Alpha 信号,需进一步验证
- 80%–90% 分位 → ⚠️ 可能只是随机波动
- < 80% 分位 → ❌ 过拟合或运气成分极高
输出:零 Alpha 分布直方图(PNG),标注真实 SR 位置与零 Alpha 中位线。
检测 3:夏普比率衰减曲线 + 标准误分析
目的:排除阶段过拟合——策略 Alpha 是否随时间持续衰减?
执行步骤:
1. 按年度(252 交易日)拆分子窗口,计算每个子窗口的年化夏普比率
2. 绘制衰减曲线图(PNG),横轴为时间,纵轴为年化 SR
3. Bootstrap 法计算夏普比率标准误 SE_SR
4. t 检验:t_stat = SR_total / SE_SR
解读标准:
- 各年度 SR 稳定在 0.5–2.0,无明显下降 → ✅ 策略稳健
- 前段 SR > 1.5,近 3 年 SR 降至 0.5 以下 → ❌ 强衰减信号
- 最近 2 个年度 SR 连续为负 → ❌ 强预警
- 近 3 年 SR < 总期 SR 的 50% → ❌ 强烈衰减
综合诊断
三项检测完成后,按权重汇总:
| 检测维度 | 权重 |
|---|---|
| PSR | 40% |
| 蒙特卡洛模拟 | 35% |
| 衰减曲线+标准误 | 25% |
诊断分级:
- 三项通过 → 策略有效性高,可实盘配置较高仓位
- 两项通过、一项预警 → 实盘时需严格止损 + 仓位控制
- 仅一项通过或均不通过 → 过拟合风险极高,不可直接投入实盘
输出规范
完成后输出:
1. 标准诊断报告(Markdown 表格,含三项检测的关键定量结论和信号方向)
2. 蒙特卡洛分布直方图 → /sandbox/workspace/outputs/mc_histogram.png
3. 衰减曲线图 → /sandbox/workspace/outputs/sr_decay_curve.png
4. 完整 JSON 结果 → /sandbox/workspace/outputs/overfitting_report.json
参数默认值
| 参数 | 默认值 | 说明 |
|---|---|---|
| PSR 基准 SR | 0 | 判断策略是否好于无风险 |
| 蒙特卡洛模拟次数 M | 5000 | 5000 以上稳定 |
| 衰减曲线子窗口 | 252 天(年度) | 最小 63 天 |
| 标准误估计方法 | Bootstrap | 最稳健 |
| 随机种子 | 42 | 确保可复现 |
执行方式
直接运行检测脚本:
python3 overfitting_detect.py --returns <文件路径>
或在 Python 中导入使用。脚本接受 pandas DataFrame(含日收益列)或 CSV 文件路径。详细用法见 methodology.md。