大多数回测系统把反过拟合当作可选的附加检查——跑完回测再测一下。QuantGPT 把它内建到评分系统和进化引擎里:反过拟合结果直接影响因子得分,进化引擎读反过拟合指标决定下一步策略。不验证稳健性的因子,连参与迭代的资格都没有。

“跑完回测再测一下"的问题

标准流程:生成因子 → 回测 → 看 Sharpe → 满意就用。反过拟合检查?可选。觉得有必要再跑。

这个流程有一个结构性缺陷:反过拟合检查与决策解耦了。 你可以看到 Sharpe 2.5 的因子,心里已经决定用了,然后反过拟合测试告诉你"可能过拟合”——但你已经有了认知偏差,倾向于找理由解释掉这个结果。

更严重的问题:当 LLM Agent 自治迭代时,如果反过拟合只是一个可选步骤,Agent 会倾向于跳过它——因为跳过能更快地进入下一轮迭代。Agent 的目标是"找到高分因子",不是"找到稳健的高分因子",除非你在架构层面强制它。

四层反过拟合检验

QuantGPT 的反过拟合不是单一测试,而是四项独立检验的组合:

1. IC 稳定性

按年度计算 Spearman IC(因子值与未来收益率的秩相关),要求:

  • 正 IC 占比 ≥ 55%
  • |平均 IC| ≥ 0.02
  • 不存在年度 IC 符号反转

一个因子如果在 2020 年 IC 为正、2021 年 IC 为负,说明它捕捉的不是稳定的 alpha 信号,而是特定市场环境下的偶然关联。

2. 子样本压力测试

将数据按市场状态(牛市/熊市/震荡)和波动率(高/低)切分为多个子样本,分别计算 IC。通过条件:60% 以上子样本的 IC 符号与整体一致。

这直接回答"这个因子是不是只在牛市有效"的问题。

3. 安慰剂检验

生成 20 组时间序列的随机排列,计算各自的 IC。真实因子的 IC 必须超过随机排列 IC 的 95 百分位。同时检测时间偏移后的 IC 衰减——如果偏移一天后 IC 没有显著下降,说明信号可能是虚假的。

4. 半衰期估计

在 1、2、5、10、20、40 天的前瞻期上计算 IC,拟合指数衰减曲线。半衰期 > 5 天才算通过。

半衰期太短意味着因子的预测力在 1-2 天内就耗散了——对于日频换仓策略可能够用,但对于 WorldQuant BRAIN 的评估框架(更关注中期稳定性)不够。

反过拟合如何进入评分系统

QuantGPT 的因子评分是 6 个维度的加权组合:

总分 = IC_Mean(15%) + IC_IR(15%) + Stability(15%) +
       AntiOverfit(15%) + GroupBT(15%) + WQ_Alignment(25%)

反过拟合占 15% 权重。四项测试通过 3 项以上得满分,2 项为 60 分,1 项为 30 分,0 项为 0 分。

关键设计:如果 CAGR 或 Sharpe 为负,无论其他维度多高,最终评级不超过 C(≤ 59.9)。 这是硬性上限,不是柔性惩罚。

WQ 对齐度占 25%——其中包含 Sharpe、Fitness、Turnover 的合规检查。这意味着一个因子要拿到 A 级评分,必须同时通过反过拟合检验 WQ BRAIN 模拟检验。两者缺一不可。

反过拟合如何驱动进化方向

这是更重要的部分。反过拟合不只是"分数的一个维度",它直接影响进化引擎的策略选择。

进化引擎有一个三阶段自适应循环:

  1. 轨迹分析:评估历史迭代的质量指标——得分方差(探索多样性)、趋势斜率(收敛速度)、连续下降次数
  2. 策略选择:根据轨迹特征选择 4 种策略之一
  3. 执行:按选定策略生成候选因子

策略选择的 7 条规则中,反过拟合是隐含的信号源:

  • EXPLOIT(利用):高分 + 低方差 → 精调当前最优。前提是当前最优的分数来自包含反过拟合检验的完整评估
  • EXPLORE(探索):低分 + 早期阶段 → 尝试新方向。一个因子如果 Sharpe 高但反过拟合不通过,总分仍然低,会触发 EXPLORE 而不是 EXPLOIT
  • RECOMBINE(重组):连续 2+ 轮下降 → 从历史高分因子中交叉。交叉的父本是按总分排序的,反过拟合通过的因子自然排名更高
  • SIMPLIFY(简化):嵌套深度 > 8 → 降低复杂度。过度拟合往往来自过度复杂的表达式

评估环节的一个细节:每个候选因子在迭代中只跑 2/4 项反过拟合测试(IC 稳定性 + 半衰期),而不是全部 4 项。这是速度和精度的权衡——快速筛选阶段用低成本检测过滤明显的过拟合,最终评估阶段才跑完整的 4 项。

为什么 Walk-Forward 还不够

很多系统只做 Walk-Forward 验证:滚动窗口,训练集和测试集分离,看样本外表现。这比不做要好,但有盲点。

Walk-Forward 验证本质是时间维度的泛化测试。它告诉你"这个因子在未来一段时间还有效吗",但不告诉你"这个因子在不同市场状态下是否稳健"——后者需要子样本压力测试。它也不告诉你"这个因子是否比随机信号更好"——后者需要安慰剂检验。

QuantGPT 把 Walk-Forward 作为第二层验证,在反过拟合四项测试之上叠加。滚动窗口的每个测试段可以选择性地跑完整反过拟合:

窗口得分 = Test_IC(30%) + Test_IR(25%) + IC_Stability(20%) +
           AntiOverfit(15%) + Sharpe(10%)

反过拟合在窗口评分中占 15%,IC 稳定性另占 20%。两者合计 35%,超过了任何单一指标的权重。

实际效果

这个架构在 QuantGPT 上产出了 3 个正式提交 WorldQuant BRAIN 的因子(最佳 Fitness 1.26、Sharpe 1.77),全部通过 IS 检测。

一个关键数据:Agent 在迭代过程中淘汰了大量 Sharpe 高但反过拟合不通过的因子。没有这个过滤器,Agent 会倾向于收敛到高 Sharpe + 高过拟合风险的局部最优——因为 Sharpe 是最容易优化的指标。

反过拟合不是"跑完回测再检查一下"。它是评分的一部分,是迭代方向的信号源,是淘汰机制的核心。把它当插件,你得到的是"高分因子"。把它当架构,你得到的是"稳健的高分因子"。

一句话总结

反过拟合检验不应该是你最后做的事。它应该内嵌在你的评分系统和迭代引擎里,让过拟合的因子连参与进化的资格都没有。


系列文章:表达式解析器是编译器,不是 eval() · API Guard Pattern · 终局思维:先想清楚怎么被审计