10

按时间验证

核心问题怎样让验证结果接近模型真正上线时的表现?

视频 约 9 分钟

第三单元 · 第 4 / 5 节0708091011

视频

待发布

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

学习目标

  1. 理解滚动或扩展窗口的重复训练。
  2. 理解标签重叠,以及隔离期的作用。
  3. 理解随机 K 折为什么会高估时间序列上的表现。

交互演示合成数据

制作中

滚动验证:拖动训练窗口和隔离期

让 AI 带你做模拟数据

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

任务(第 10 节):亲手做一次泄漏,再把它堵上。
1. 加一个特征 mkt_last:上个月等权基准的收益(同一个月里所有股票都一样)。特征一共 6 个。
2. 用三种方式得到每一行的样本外预测,模型都用 200 棵树的梯度提升树(参数同第 09 节):
   a. 随机打乱的 5 折交叉验证;
   b. 按月份分组的 5 折交叉验证(同一个月的行放在同一折);
   c. 第 07 节的按时间滚动。
3. 在第 60 个月以后,比较三种方式的平均 IC 和“每月买前 50 只”的年化收益。
提示词开头的模拟数据设定
请用 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 的行(中间隔开一个月)。

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

应该看到

  • 平均 IC:随机打乱最高,按月分组其次,按时间滚动最低。随机打乱比按时间滚动高出大约 0.01。
  • 原因:mkt_last 让模型认得出“这是哪个月”。随机打乱时,同一个月的其他股票就在训练集里,模型等于偷看了这个月哪些特征好使。
  • 按月分组堵住了同月的泄漏,但训练集里仍然有未来的月份。真正能拿来上线的,只有按时间滚动的结果。

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

自测

  1. 随机打乱的交叉验证,为什么结果会虚高?

    • A. 因为它用的数据更少
    • B. 同一时间的行同时出现在训练和检验里,模型借到了当时还不该知道的信息
    • C. 因为打乱让模型变简单了
    • D. 它不会虚高
    看答案

    答案 B。股票数据按时间排着,打乱以后,训练集里就混进了检验月份本身和它之后的信息。

  2. 下面哪种验证方式,最接近模型上线以后真实的样子?

    • A. 随机打乱的交叉验证
    • B. 用全部数据训练,再在全部数据上检验
    • C. 按月份分组的交叉验证
    • D. 按时间滚动:只用过去训练,预测接下来的月份
    看答案

    答案 D。上线以后,你永远只有过去的数据。验证时也只能这样。

常见坑

  • 重训时把还没到期的标签放进训练集
  • 每次重训都在整个样本上调参

下一节

有了完整的样本外预测,接下来要判断它到底有多可信。

11评估预测除了“准不准”,一个预测还需要回答什么?