样本外验证是量化研究的「临床实验」:样本内绩效只是假设,样本外才是证据。本篇讲三道闸门的正确姿势——多数「样本外失效」的悲剧不是因为方法,而是因为纪律被变通(偷偷看了测试集、反复开箱)。
闸门一:样本划分与封存
三分法:训练区(~60%,探索与拟合)→ 验证区(~20%,参数选择与模型比较)→ 测试区(~20%,全程封存,只开一次箱)。
三条容易被变通的纪律,逐条较真:
- 测试区只能开一次箱:开箱 → 不满意 → 回去改 → 再开箱——第二次开箱时它已是训练集的一部分(你基于它的表现做了决策)。正确流程:每次「开箱失败」都必须追加新数据(等市场走完新的一年)形成新的测试区,而不是重用旧的;
- 任何决策不得引用测试区:包括「要不要继续这个研究方向」的判断——看过测试区绩效后再决定改什么,信息就已泄漏;
- 划分按时间不按随机:金融数据时序相关,随机划分等于让模型「看到未来」(ML 场景的 purged CV,见机器学习策略 )。
封存的仪式感是必要的:测试区数据加密、承诺书、或至少一个「只跑一次」的脚本——防的不是别人,是三个月后想偷看回测的自己。
闸门二:Walk-Forward 滚动验证
Walk-Forward(WF)模拟真实的研究节奏:用历史训练 → 立即样本外检验 → 时间前滚重复。
两种形态:
- 锚定式(anchored):训练区从起点扩张(1–5 年训练 → 检验第 6 年 → 1–6 年训练 → 检验第 7 年…)。样本利用充分,适合数据量小、结构稳定的策略;
- 滚动式(rolling):固定长度窗口整体前移(始终用最近 5 年训练检验下一年)。强制适应结构漂移,适合 regime 变化快的策略。
绩效只统计全部样本外段的拼接曲线——这就是「如果当时真的按这个流程操作会得到的净值」。三个判读要点:
- **WF 的样本外衰减比(WF 绩效/全样本绩效)**是过拟合的直接体温计:> 0.7 健康,< 0.5 说明样本内数字主要是过拟合的产物;
- 参数稳定性:每段 WF 选出的最优参数应大体连续(如动量窗口 18→20→17→22 天);参数逐段漂移巨大 = 策略在「追逐噪声」;
- WF 也有代价:它默认「历史最优参数在下一段仍最优」,压缩了参数搜索空间的表达力——WF 绩效是策略绩效的保守估计,实盘常在 WF 与全样本绩效之间。
与 WF 互补的还有样本外多起点检验:把「起点」放在不同年份重复整个研究流程(2010 起步、2014 起步、2018 起步各做一遍)——若只有特定起点能得出好策略,结论就是起点选择偏差。
闸门三:蒙特卡洛与 Bootstrap
前两道闸门回答「参数与流程诚实吗」,第三道回答「这条净值曲线本身可靠吗」——它是蒙特卡洛 方法在回测层的应用:
- 净值 Bootstrap:对日收益序列重抽样生成 10000 条合成净值 → 绩效指标的分布(年化收益的 5% 分位、MDD 的 95% 分位)。判读:不只看点估计,看分布的左尾你是否承受得起(分块 bootstrap 保留自相关与波动聚集,见蒙特卡洛 );
- 置换检验:把信号随机打乱重跑回测 N 次 → 「随机策略」的绩效分布 → 你的真实策略绩效须落在分布的高分位之外(95%+)——它直接检验「这个策略比瞎蒙好吗」,绕开收益分布的一切假设(与实验设计 的置换检验同源);
- White’s Reality Check / SPA 检验:对「尝试过 N 个变体后挑出的最优」做数据挖掘偏差校正——学术界的标准答案,工程上简化为:把 N 次尝试的样本外绩效全列出来,看最优者是否仍显著优于「N 次中随机挑一个」的分布。
三道闸门的合成读法:WF 显示样本外衰减比 0.8(流程诚实)+ Bootstrap 左尾可承受(曲线可靠)+ 置换检验 99 分位(优于瞎蒙)——三个独立维度的证据同时成立,才值得把真钱放进去。任何一道不成立,回到研究流程 。
常见的「伪样本外」
| 伪样本外形态 | 为什么是伪的 | 正确做法 |
|---|---|---|
| 「样本外」跑完不满意,改了参数重跑 | 第二次跑已在决策中使用它 | 每次重跑都推进测试区起点 |
| 用全样本选出「好年份」展示样本外 | 区间选择本身用了全样本信息 | 区间先于任何回测固定 |
| 模拟盘跑 2 周「样本外通过」 | 样本量远不足以区分运气(t ≈ 0.3) | 预注册最小样本期(如 20 个交易日,见实验设计 ) |
| 把测试区绩效写进论文再「验证」一次 | 验证集已被污染 | 测试集一次性使用,新验证需新数据 |