---
title: "概念-AlphaGPT-walk-forward样本外验证"
date: 2026-07-21
tags: [AlphaGPT, 择时, 过拟合, 样本外, 概念]
source: "AlphaGPT择时框架"
---

## 一句话

只用**模型没见过的时间段(OOS)**的分数来选公式,防止挖出"只在历史上好看、实盘就废"的
过拟合公式。这是量化老手最挑剔、也最该讲透的一环。

对应代码:`run_timing.py` 的 `make_walk_forward_splits` 与 `_oos_reward`。

---

## walk-forward 怎么切窗

把时间轴切成滚动的 (训练窗, 测试窗) 对,向后滚动:

```python
start = 0
while start + train_win + test_win <= T:
    tr = slice(start, start+train_win)              # 训练窗(IS)
    te = slice(start+train_win, start+train_win+test_win)  # 测试窗(OOS)
    splits.append((tr, te))
    start += test_win                                # 按测试窗步长滚动
```

```
  窗1: [====train 250====][==test 60==]
  窗2:        [====train 250====][==test 60==]
  窗3:               [====train 250====][==test 60==]
  ...每次向后滚 test_win(60),训练窗重叠
```

demo 里 T=728,`train_win=250, test_win=60` → 切出 7 个窗。 ^切窗

---

## OOS / IS / gap

- **OOS(样本外)** = 所有测试窗上分数的均值 → **这才是 reward**,选公式只认它
- **IS(样本内)** = 所有训练窗上分数的均值 → 仅监控,不进反向传播
- **gap = IS - OOS**

### gap 的实盘意义(讲课重点)
gap 越大,说明公式越依赖"见过的数据"、样本外越差,**过拟合越严重**。
- gap 小甚至为负 → 公式在没见过的数据上也稳,可信
- gap 大 → 警报,可能只是拟合了历史噪声

New King 打印时带 gap,就是让你一眼看出"这条 King 是真本事还是过拟合"。 ^gap意义

---

## 为什么只认 OOS(第一性原理)

模型在训练窗上"见过"数据,在这上面刷高分是**记忆**不是**预测**。真正值钱的是
"在没见过的未来上还管用"。用 OOS 当 reward,等于**直接把"泛化能力"设成优化目标**,
从根子上对抗过拟合。通用原理见 [[概念-策略过拟合与样本内外检验]]。 ^只认OOS

---

## 与其他防过拟合手段的合力

walk-forward 不是孤立的,框架里多层防御叠加:
1. **只认 OOS**(本篇)—— 直接优化泛化
2. **median 聚合**(横截面)—— 抗单品种过拟合,见 [[概念-AlphaGPT-回测评分与仓位映射#^median聚合]]
3. **防退化惩罚**(交易次数<5罚-10)—— 防空仓刷分,见 [[概念-AlphaGPT-回测评分与仓位映射#^防退化]]
4. **复杂度惩罚**(惩罚嵌套深度)—— 奥卡姆剃刀,见 [[概念-AlphaGPT-因子可解释性#^惩罚深度非长度]]

**讲课建议**:给熟量化的听众,把这四层防御串起来讲,是建立信任最快的方式——它证明
这不是"又一个 ML 挖因子玩具",而是认真对待过拟合的系统。 ^多层防御

---

## 一个诚实的局限

walk-forward 切窗时,训练窗最后一天和测试窗第一天**相邻,没有 gap 间隔**(缓冲期)。
对持有期 H 较长的情况,可能有轻微信息泄漏。这是可改进项,讲课时主动提及会加分。 ^无缓冲期

---

## 相关笔记
- [[MOC-AlphaGPT择时框架]] — 架构入口
- [[概念-AlphaGPT-REINFORCE训练闭环]] — OOS 如何当 reward 用
- [[概念-AlphaGPT-回测评分与仓位映射]] — 分数怎么算出来
- [[概念-策略过拟合与样本内外检验]] — 样本内外检验的通用方法论
- [[概念-AlphaGPT-因子可解释性]] — 复杂度惩罚

