4. 标签口径之时间窗口:固定窗口、滚动窗口、事件窗口、窗口对齐策略
在事件驱动回测中,标签(Label)的生成往往依赖一个关键参数——时间窗口。窗口定义了“从哪个时间点开始,到哪个时间点结束”来观测收益、波动或风险。不同的窗口口径会直接改变标签的数值分布,进而影响模型训练与回测结果。本章系统梳理四种核心窗口类型及其对齐策略。
4.1 四种窗口类型对比
| 窗口类型 | 定义 | 典型应用 | 优点 | 缺点 |
|---|---|---|---|---|
| 固定窗口 | 以事件发生时刻为起点,取固定长度(如 20 个交易日) | 短期动量因子、事件驱动收益 | 简单直观,易于复现 | 忽略市场波动率变化,窗口边界生硬 |
| 滚动窗口 | 以当前时刻为终点,向前取固定长度(如 60 日滚动) | 波动率估计、移动平均类因子 | 反映近期状态,适应市场变化 | 标签存在重叠,需注意数据泄漏 |
| 事件窗口 | 以事件发生日为中心,前后各取若干日(如 [-5, +10]) | 财报公告效应、并购事件分析 | 捕捉事件前后对称/非对称效应 | 窗口长度需主观设定,事件密集时易重叠 |
| 自适应窗口 | 根据市场状态或波动率动态调整窗口长度 | 波动率目标策略、风险平价标签 | 更贴合市场真实节奏 | 实现复杂,需额外状态估计 |
选型建议: 固定窗口适合快速原型验证;滚动窗口适合时序特征工程;事件窗口适合事件研究法;自适应窗口适合高频或波动率敏感策略。实际回测中常将多种窗口组合使用。
4.2 窗口对齐策略
窗口定义好后,下一个关键问题是:如何将不同时间点的标签对齐到统一的回测时间轴上? 常见的对齐策略包括以下三种:
- 起点对齐: 所有标签以事件发生日为基准,窗口起点对齐。适用于事件驱动策略,如“财报发布后持有 10 天”。
- 终点对齐: 所有标签以窗口结束日为基准,终点对齐。适用于预测类任务,如“未来 20 日收益”。
- 中心对齐: 以窗口中心点为基准,前后对称。适用于事件研究法,如“公告前后 5 日异常收益”。
⚠️ 常见陷阱: 终点对齐在回测中容易引入未来信息。例如,用“未来 20 日收益”作为标签时,若回测时间轴以当前日对齐,则标签实际上使用了未来数据。正确的做法是:在回测中,标签必须在当前时刻之后才能计算,因此通常采用起点对齐或滞后对齐。
4.3 窗口重叠与数据泄漏
当使用滚动窗口或事件窗口时,相邻样本的窗口可能高度重叠,导致标签之间不独立,进而造成过拟合。下图展示了滚动窗口的重叠问题:
数据泄漏风险: 当窗口重叠严重时,训练集与验证集之间可能存在信息泄漏。例如,使用滚动窗口生成标签时,相邻样本的标签值高度相关,导致回测表现虚高。解决方案包括:设置最小间隔(gap)、使用事件采样而非时间采样、或采用分组交叉验证。
4.4 代码示例:固定窗口与滚动窗口标签生成
以下代码展示了如何在 Pandas 中实现固定窗口与滚动窗口的标签计算:
import pandas as pd
import numpy as np
# 模拟价格数据
dates = pd.date_range('2023-01-01', periods=100, freq='D')
prices = pd.Series(np.cumsum(np.random.randn(100)) + 100, index=dates)
# 固定窗口:以事件日为起点,取未来 5 日收益
def fixed_window_label(series, window=5):
return series.shift(-window) / series - 1
# 滚动窗口:以当前日为终点,取过去 20 日波动率
def rolling_window_label(series, window=20):
return series.pct_change().rolling(window).std()
# 事件窗口:以事件日为中心,取 [-3, +3] 累计收益
def event_window_label(series, center_idx, left=3, right=3):
start = center_idx - left
end = center_idx + right
return series.iloc[end] / series.iloc[start] - 1
# 示例:固定窗口标签
fixed_label = fixed_window_label(prices, window=5)
print("固定窗口标签(未来5日收益):")
print(fixed_label.head(10))
# 示例:滚动窗口标签
rolling_label = rolling_window_label(prices, window=20)
print("\n滚动窗口标签(过去20日波动率):")
print(rolling_label.dropna().head(10))
4.5 窗口对齐策略选择矩阵
| 策略类型 | 推荐窗口类型 | 推荐对齐方式 | 注意事项 |
|---|---|---|---|
| 趋势跟踪 | 滚动窗口 | 终点对齐 | 避免使用未来数据,需滞后一期 |
| 事件套利 | 事件窗口 | 起点对齐 | 注意事件密集期的窗口重叠 |
| 波动率预测 | 自适应窗口 | 终点对齐 | 需实时估计波动率状态 |
| 因子测试 | 固定窗口 | 起点对齐 | 窗口长度需与持有期匹配 |
最佳实践: 在回测框架中,建议将窗口定义与标签计算分离。窗口定义作为配置参数,标签计算作为独立模块。这样可以在不修改核心回测逻辑的前提下,灵活切换窗口口径。
4.6 本章小结
- 固定窗口 适合简单、可复现的场景;滚动窗口 适合时序特征;事件窗口 适合事件研究;自适应窗口 适合动态市场。
- 窗口对齐策略 决定了标签在时间轴上的位置,起点对齐最常用,终点对齐需警惕未来信息。
- 窗口重叠 是数据泄漏的主要来源,需通过间隔设置或采样策略加以控制。
- 代码实现时,优先使用向量化操作(如
shift、rolling),避免显式循环。