3. 样本外滚动验证框架设计

盘口因子(如买卖盘失衡、订单流斜率、撤单率、大单净流入等)具有极强的时序自相关性,且其预测能力会随市场微观结构变化而衰减。因此,评估一个盘口因子是否真正具备样本外泛化能力,不能依赖单次随机划分的交叉验证,而必须采用按时间顺序推进的滚动验证框架。本节要解决的核心问题是:如何设计一套既贴近实盘决策节奏、又能严格阻断未来信息回流的滚动切分方案。

一、滚动窗口的基本结构与三种切分角色

滚动验证把整段历史数据沿时间轴切成若干个连续的“折”(fold),每一折内部再划分为训练段、验证段和测试段。三者的职责必须严格区分:

  • 训练段:用于估计因子参数(如标准化均值方差、分位数阈值、因子权重、模型系数)。
  • 验证段:用于选择超参数与做因子筛选决策,例如确定失衡因子的回看窗口长度、选择进入组合的因子子集、确定开平仓阈值。
  • 测试段:只用于最终评估,一旦参与任何调参或筛选,其样本外性质即被破坏。

三段的时序关系必须是“训练 → 验证 → 测试”单向推进,且相邻段之间要留出隔离带(gap / purge)。隔离带的长度由因子计算所需的最大回看窗口与标签的前瞻期共同决定。举例:若某盘口因子使用过去 20 个 tick 的盘口快照计算,标签采用未来 5 个 tick 的中间价变动,则隔离带至少应取 20 + 5 = 25 个 tick,确保训练段末尾的样本不会“看到”测试段开头的信息,测试段开头的标签也不会回渗到训练段。

滚动窗口时序切分:训练 → 隔离带 → 验证 → 隔离带 → 测试 时间 第 1 折 训练段 gap 验证段 gap 测试段 第 2 折 训练段(窗口前移) gap 验证段 gap 测试段 第 3 折 训练段(窗口继续前移) gap 验证段 gap 测试段 训练 验证 测试 隔离带(purge gap)

二、窗口推进方式:扩张窗与滑动窗的取舍

滚动框架有两种典型推进方式。扩张窗(expanding window)保持起点固定,训练段随折数增加而变长,适合因子关系相对稳定、样本量偏少的场景;滑动窗(rolling window)保持训练段长度固定,整体向前平移,适合盘口微观结构变化快、旧样本会引入偏差的场景。实务中常用折中方案:训练段设一个最小长度(如 60 个交易日)后转为滑动,窗口长度取 120 个交易日,验证段 20 个交易日,测试段 20 个交易日,折与折之间测试段不重叠。

需要强调的是,验证段与测试段的比例不宜过小。若测试段只有 3~5 个交易日,单折的因子 IC 估计标准误极大,多折汇总后仍可能被少数极端行情主导。建议单折测试段不少于 15 个交易日,总折数不少于 6 折,使最终得到 6 个以上相互独立的样本外评估点。

三、防止信息泄露的关键规则

盘口因子验证中最隐蔽的泄露来源不是“用未来预测未来”这种显式错误,而是预处理与特征工程跨越了切分边界。以下规则必须逐条落实:

  1. 所有统计量只在训练段内拟合。标准化所用的均值与标准差、去极值所用的分位数、中性化所用的行业或市值暴露回归系数,都必须在训练段上估计,然后原样应用到验证段和测试段。绝不能在全样本上先做 z-score 再切分。
  2. 标签的前瞻期不得跨越切分边界。若标签是未来 5 个 tick 的收益,则训练段最后一个样本的标签窗口会伸入隔离带,隔离带必须覆盖这一长度;测试段开头的样本若其因子回看窗口伸入验证段,同样需要隔离。
  3. 因子筛选与超参数选择只能看验证段。常见错误是把多折测试段结果汇总后再回头挑选“表现最好的因子组合”,这等价于在测试集上做选择。正确做法是:每折在验证段上确定因子子集与参数,锁定后只在测试段评估一次。
  4. 样本重叠的标签需要额外 purge。若标签采用重叠窗口(如每 5 个 tick 取一个标签但窗口长 10 个 tick),相邻样本标签高度相关,隔离带需按标签窗口长度而非采样间隔计算。
  5. 避免跨折的全局归一化与全局排序。截面排序若在包含未来数据的全样本上完成,会把未来信息带入历史折。排序必须在每个时点仅使用当时可见的截面完成。
一个高频踩坑点:很多实现者用 pandas 的 shift(-n) 构造标签后直接调用 train_test_split,此时标签已经包含未来信息,而切分又是随机的,训练集与测试集在时间上交错,样本外结论完全失效。滚动验证必须显式按时间索引切分,并在切分后检查训练段最大时间戳严格小于测试段最小时间戳减去隔离带长度。

四、一个可执行的折配置示例

假设使用 2021-01 至 2024-12 共约 970 个交易日的盘口快照数据,因子最大回看 20 个 tick,标签前瞻 5 个 tick,按日聚合后隔离带取 1 个交易日即可覆盖。可按下表配置 6 折:

折训练段验证段测试段
12021-01 ~ 2021-122022-01 ~ 2022-022022-03 ~ 2022-04
22021-03 ~ 2022-022022-03 ~ 2022-042022-05 ~ 2022-06
32021-05 ~ 2022-042022-05 ~ 2022-062022-07 ~ 2022-08
42021-07 ~ 2022-062022-07 ~ 2022-082022-09 ~ 2022-10
52021-09 ~ 2022-082022-09 ~ 2022-102022-11 ~ 2022-12
62021-11 ~ 2022-102022-11 ~ 2022-122023-01 ~ 2023-02

每折之间训练段起点前移 2 个月、长度固定为 12 个月,验证段与测试段各 2 个月且互不重叠。评估时对 6 个测试段的因子 IC、ICIR、多空组合收益逐折记录,再计算均值、标准差与胜率。若某因子在 6 折中有 5 折 IC 同号且均值显著为正,才可认为其样本外表现稳健;若仅 2~3 折为正、其余接近零或反向,则更可能是特定行情下的偶然有效,应谨慎纳入实盘因子池。

落地检查清单:① 切分是否严格按时间索引而非随机抽样;② 训练段最大时间戳 + 隔离带 ≤ 测试段最小时间戳;③ 标准化、去极值、中性化参数是否只在训练段拟合;④ 因子筛选与调参是否只使用验证段;⑤ 测试段是否只评估一次、未参与任何选择;⑥ 每折结果是否单独留存以便观察稳定性而非只看汇总均值。

滚动验证框架的价值不在于给出一个漂亮的平均 IC,而在于把“因子在未知未来是否仍然有效”这一实盘问题,转化为一组可复现、可审计、时序无泄漏的样本外评估点。框架设计正确,后续的因子筛选与组合构建才有可信的决策基础。