背景知识:特征工程常见陷阱
量化中 80% 的 Alpha 来自特征工程,但 80% 的失败也来自特征工程。
陷阱一:未来信息泄漏
问题:特征计算中意外使用了未来数据。
# 错误示例:用当日收盘价计算的指标,在当日开盘时做决策
df['ma20'] = df['close'].rolling(20).mean() # 包含当日收盘
signal = df['close'] > df['ma20'] # 用当日收盘判断
# 正确做法:shift(1) 确保只用历史数据
df['ma20'] = df['close'].rolling(20).mean().shift(1)
signal = df['close'] > df['ma20']
检测方法:
- 特征与标签相关性 >
0.9 → 很可能泄漏 - 模型准确率 >
90% → 几乎一定泄漏
陷阱二:全局归一化
问题:用整个数据集的统计量归一化,泄漏了未来分布信息。
# 错误示例
mean = df['close'].mean() # 包含未来数据
std = df['close'].std()
df['normalized'] = (df['close'] - mean) / std
# 正确做法:滚动窗口归一化
df['normalized'] = (
(df['close'] - df['close'].rolling(20).mean()) /
df['close'].rolling(20).std()
)
陷阱三:高相关特征冗余
问题:多个特征高度相关,信息冗余且增加过拟合风险。
| 特征组 | 相关性 | 问题 |
|---|---|---|
| MA5, MA10, MA20 | 0.95+ | 几乎相同的信息 |
| RSI, Stochastic | 0.8+ | 都衡量超买超卖 |
| Close, VWAP | 0.99 | 几乎相同 |
解决方案:
- 相关性 >
0.7 的特征只保留一个 - 使用 PCA 降维
- 选择最有解释力的代表
陷阱四:过度拟合噪音
问题:特征越多,越容易记住训练数据的噪音。
特征数量 vs 样本数量的经验法则:
样本数 / 特征数 >`2`0 → 安全区
样本数 / 特征数 = 10 → 警戒区
样本数 / 特征数 < 5 → 危险区
例:1000 个样本,最多用 50 个特征
解决方案:
- 递归消除特征,观察验证集表现
- 使用 L1 正则化自动筛选
- 领域知识优先于统计显著
陷阱五:类别特征编码错误
问题:对类别特征的错误处理导致信息丢失或虚假关系。
# 错误示例:直接用数字编码(暗示了顺序关系)
sector_map = {'Technology': 1, 'Healthcare': 2, 'Finance': 3}
df['sector'] = df['sector_name'].map(sector_map) # 模型会认为 3 >`2` >`1`
# 正确做法:One-Hot 编码
df = pd.get_dummies(df, columns=['sector_name'])
陷阱六:时间相关性忽略
问题:特征在不同时间段的预测力不稳定。
| 时期 | 动量因子 IC | 价值因子 IC |
|---|---|---|
| 2015-2017 | 0.05 | 0.02 |
| 2018-2019 | 0.01 | 0.04 |
| 2020-2021 | 0.06 | -0.02 |
解决方案:
- 使用滚动 IC 而非单一 IC
- IC 稳定性(IC/std(IC))比 IC 绝对值更重要
- 考虑 Regime 条件下的特征效果
陷阱七:数据窥探
问题:反复测试直到找到"有效"特征,实际是过拟合。
测试 100 个特征
→ 期望 5 个在 p<0.05 水平"显著"
→ 这 5 个可能只是随机噪音
解决方案:
- 使用 Bonferroni 校正:p 值阈值 = 0.05 / 测试数量
- 保留独立的 OOS 数据集
- 记录所有测试过的特征,不只是"成功"的
陷阱八:忽略交易成本影响
问题:高频换手的特征在实盘中被成本吞噬。
特征 A:IC = 0.05,换手率 200%/月
特征 B:IC = 0.03,换手率 50%/月
假设单边成本 0.2%:
特征 A 成本:200% × 0.2% × 2 = 0.8%/月
特征 B 成本:50% × 0.2% × 2 = 0.2%/月
扣除成本后,特征 B 可能更优
特征工程检查清单
| 检查项 | 通过标准 |
|---|---|
| 无未来信息 | 所有特征用 shift(1) 或更早数据 |
| 滚动归一化 | 不使用全局均值/标准差 |
| 低相关性 | 特征间相关性 < 0.7 |
| 样本比例 | 样本数 / 特征数 >20 |
| IC 稳定性 | IC / std(IC) >0.5 |
| 成本可行 | 扣除换手成本后仍有正收益 |