06

过拟合与多重检验

核心问题为什么回测越漂亮,越要怀疑?

视频 约 9 分钟

第二单元 · 第 3 / 3 节040506

视频

待发布

预计 2026-10-13 17:30(北京时间)发布,以实际公开时间为准。
视频发布后会嵌入在这里,并加入 Bilibili 合集“量化与机器学习入门”。 预计时长约 9 分钟。

学习目标

  1. 区分样本内和样本外。
  2. 理解多重检验:试得越多,越容易碰上假的好结果。
  3. 养成记录尝试次数的习惯。

交互演示合成数据

随机因子:试得越多,越容易“发现”

最好的样本内 t+3.01
同一个因子的样本外 t+0.55
样本内 t > 2 的个数1 / 100
试得越多,最好的结果越高
−4−20+2+450100150200t = 2t 值尝试次数
最佳样本内 t它的样本外 t
前后两段,对不上
−4−20+2+4−4−20+2+4样本外 t样本内 t

每个“因子”都是纯噪音:192 个月的多空收益从均值为 0 的正态分布里随机抽取,前 96 个月当样本内,后 96 个月当样本外。它们没有任何预测力,可只要试得够多,总有一个在样本内显得很显著;黄点就是挑出来的那个,到了样本外,它和其他点没有区别。

让 AI 带你做模拟数据

把下面的提示词整段复制给任意一个 AI 助手。它会先生成一份模拟的股票月度数据(设定对每一节都一样),再带你把这一节的分析做一遍。数据是模拟的,具体数字会和视频不同,但应该看到同样的规律。

任务(第 06 节):亲手骗自己一次。
1. 生成 100 列纯随机数当信号,用前 96 个月算每一列的平均 IC 和 t 值(t = 平均 IC ÷ IC 的标准差 × √月数)。
2. 数一数有几列的 t 值绝对值超过 2;挑出 t 值最高的那一列,拿到后 96 个月去算它的 t 值。
3. 换 4 个不同的随机数种子,把第 1、2 步各重做一遍,结果列成一张表。
提示词开头的模拟数据设定
请用 Python(numpy、pandas,需要时用 scikit-learn)带我做一个量化入门练习。先生成一份模拟的股票月度数据,随机种子用 42:

1. 300 只股票,192 个月(月份编号 0–191,相当于 16 年)。
2. 每只股票有一个固定的波动 sigma,从 0.05 到 0.13 均匀抽取;它的 beta = 0.5 + 5 × sigma。
3. 每个月有五个特征:mom(动量)、val(估值,越大越便宜)、size(规模)、lowvol(低波动)、prof(盈利)。
   - mom、val、size、prof:第 0 个月取标准正态;之后每个月,新值 = 0.9 × 上月值 + 0.44 × 标准正态。
   - lowvol = −sigma + 0.02 × 标准正态。
   - 每个月把五个特征各自在 300 只股票之间标准化(减平均、除以标准差)。
4. 每个月抽一个下个月的大盘收益 mkt_next ~ 正态(0.005, 0.05);再给五个特征各抽一个当月系数 = 基础系数 + 0.01 × 标准正态,基础系数依次是 0.004、0.003、0、0.005、0.002。
5. 下个月收益 ret_next = beta × mkt_next + Σ(当月系数 × 特征) + sigma × 标准正态。
6. 整理成一张长表:每行是一只股票的一个月,列为 month、stock、sigma、五个特征、mkt_next、ret_next。打印前几行和总行数。

后面统一的口径:
- IC:每个月,某一列和 ret_next 在 300 只股票之间的 Spearman 秩相关。
- 年化收益:把每月收益连乘,再按 12 / 月数 开方后减 1。
- 等权基准:每个月 300 只股票 ret_next 的平均。
- 第 m 个月这一行的特征在第 m 个月月底已知,标签 ret_next 是第 m+1 个月的收益。训练模型时,在第 s 个月月底打分,训练只用月份 ≤ s−2 的行(中间隔开一个月)。

接下来按我的要求一步一步做。每一步先用一两句话说明在做什么,再给代码和结果。

应该看到

  • 每一次,大约有 5 列上下的 t 值绝对值超过 2,可它们全是随机数。
  • 最好那一列的 t 值通常在 2 到 3 之间,看起来“显著”。
  • 拿到后 96 个月,它的 t 值多数回到 −1 到 1 之间;偶尔碰巧还很高,但换个种子就不见了。

对不上的时候,把你的结果和这几条一起发给 AI,让它解释是哪一步出了问题。

自测

  1. 100 个毫无用处的随机信号,大约有几个能通过“t 值绝对值大于 2”?

    • A. 0 个
    • B. 大约 50 个
    • C. 大约 5 个
    • D. 全部
    看答案

    答案 C。t 值大于 2 的门槛,本来就允许大约二十分之一的偶然。试 100 次,就会冒出 5 个左右。

  2. 为了不骗自己,下面哪种做法最重要?

    • A. 只报告最好的那一次
    • B. 记下一共试了多少次,并留出一段只看一次的检验数据
    • C. 一直试,直到 t 值超过 3
    • D. 把检验数据也拿来训练
    看答案

    答案 B。试得越多,门槛就该越高;留出来的数据只看一次,才能说明结果不是挑出来的。

常见坑

  • 反复看测试集调参
  • 只报告最好的结果

下一节

多个信号怎么一起用?交给机器学习。

07把选股变成学习任务同一张面板,选不同的标签,模型学到的东西有什么不同?