3. 标签口径定义:特征工程中的核心校准点
在量化回测中,标签口径(Label Caliber)是指标签在时间轴上的定义窗口、采样时刻与数据可用性之间的对齐规则。它决定了“模型在何时、基于哪些信息、预测什么时间段的结果”。口径一旦偏差,回测收益曲线可能完全失真,甚至出现未来函数而不自知。
3.1 什么是标签口径
标签口径包含三个维度:
- 预测起点:模型开始计算特征的时间点(通常为 bar 收盘时刻)。
- 标签窗口:从预测起点到标签落地的时间跨度(如未来 5 日收益率)。
- 信息边界:标签计算时是否使用了预测起点之后才产生的数据。
核心原则:标签口径必须保证在回测的每个时间点上,模型只能使用“当时已知”的数据来预测“未来尚未发生”的结果。任何对未来的提前知情都会导致回测虚高。
3.2 标签口径对回测结果的影响
口径偏差是回测中最隐蔽的陷阱之一。下表总结了不同口径偏差带来的典型后果:
| 口径偏差类型 | 回测表现 | 实盘表现 | 风险等级 |
|---|---|---|---|
| 未来标签(泄露未来信息) | 夏普比率 > 3.0,回撤极小 | 夏普比率 < 0.5,大幅回撤 | 极高 |
| 滞后标签(标签延迟到达) | 信号滞后,收益曲线右移 | 交易成本吞噬利润 | 高 |
| 窗口错配(预测窗口与标签窗口不一致) | 策略失效,收益不稳定 | 无法复现回测结果 | 高 |
| 实时标签(正确口径) | 收益曲线平滑,可解释 | 与回测基本一致 | 低 |
实战警示:某量化团队使用“未来 20 日收益率”作为标签,但特征中包含了未来 10 日的成交量数据。回测年化收益 45%,实盘首月亏损 12%。根源在于标签口径中的信息边界未被严格约束。
3.3 常见标签口径类型
根据信息边界与时间对齐方式,标签口径可分为三种核心类型:
3.3.1 未来标签(Look-ahead Label)
标签计算时使用了预测起点之后的数据。这是回测中最严重的错误,通常由数据预处理不当引起。
- 典型场景:使用未来收益率作为标签,但特征中也包含了未来价格衍生指标。
- 检测方法:在回测中引入“延迟一周期”测试,若收益显著下降,则可能存在未来标签。
- 修正方案:严格按时间顺序划分训练集与测试集,使用
shift()或groupby确保特征不包含未来信息。
3.3.2 滞后标签(Lagging Label)
标签的定义窗口晚于实际预测窗口,导致模型学习到的是“过时”的模式。
- 典型场景:使用 T+2 日的收益率作为 T 日收盘时的预测标签,但交易执行在 T+1 日开盘。
- 影响:模型信号滞后,实盘中交易成本显著增加。
- 修正方案:将标签窗口前移,确保标签的落地时间与交易执行时间对齐。
3.3.3 实时标签(Real-time Label)
标签在预测起点时已完全确定,且仅使用历史数据计算。这是回测中唯一正确的口径。
- 典型场景:使用“次日开盘后 30 分钟收益率”作为标签,特征仅使用开盘前数据。
- 优势:回测结果可直接映射到实盘,无需额外校准。
- 实现要点:在数据管道中设置严格的时间戳检查,确保每个样本的标签时间 > 特征时间。
3.4 口径校准实战要点
最佳实践:在特征工程管道中,始终将标签计算放在最后一步,并在每个样本上记录
feature_time 和 label_time 两个时间戳。回测前运行一致性检查,确保所有样本的 feature_time < label_time。
以下是一个简单的口径校验代码示例:
import pandas as pd
def check_label_caliber(df, feature_cols, label_col, time_col):
"""
检查标签口径一致性
"""
# 提取特征时间与标签时间
df['feature_time'] = df[time_col]
df['label_time'] = df[label_col].apply(lambda x: x['end_time'])
# 检查是否存在未来标签
future_mask = df['feature_time'] >= df['label_time']
future_count = future_mask.sum()
if future_count > 0:
print(f"⚠ 发现 {future_count} 个未来标签样本")
return False
else:
print("✓ 所有标签口径正确")
return True
通过严格的口径定义与校验,回测结果才能真实反映策略的预期表现,避免“回测冠军、实盘垫底”的尴尬局面。