4. 特征工程入门
在金融机器学习项目中,特征工程往往比模型选择更能决定最终收益曲线的形态。原始行情数据只有开高低收、成交量与时间戳,它们本身并不直接告诉模型“现在是否处于趋势启动”或“波动是否即将放大”。特征工程的任务,就是把市场行为翻译成模型可学习的数值表达,同时避免引入未来信息与过度拟合。
一、金融特征的四类基本来源
金融特征可以按信息来源划分为四类,理解分类有助于系统化地构建特征池,而不是零散地堆叠指标。
- 价格派生特征:收益率、对数收益率、高低价差、隔夜跳空、滚动波动率等,直接刻画价格变化。
- 成交量与流动性特征:成交量比率、成交额加权均价偏离、换手率、买卖价差代理变量,反映资金参与强度。
- 技术指标特征:均线、MACD、RSI、布林带、ATR 等,是对价格与成交量的非线性压缩。
- 横截面与市场状态特征:相对强弱、行业中性化收益、市场波动率指数、利率与汇率变化,提供宏观与相对位置信息。
特征不是越多越好。金融数据信噪比低,冗余特征会放大过拟合风险。建议每个特征都能回答“它捕捉了什么市场行为”。
二、技术指标构建:从公式到可复用函数
技术指标的本质是滚动窗口上的统计变换。构建时应遵循三个原则:只用历史数据、窗口参数显式化、输出对齐到决策时点。下面以 ATR 与 RSI 为例,展示可复用的构建方式。
import pandas as pd
import numpy as np
def atr(high, low, close, window=14):
prev_close = close.shift(1)
tr = pd.concat([
high - low,
(high - prev_close).abs(),
(low - prev_close).abs()
], axis=1).max(axis=1)
return tr.rolling(window).mean()
def rsi(close, window=14):
delta = close.diff()
gain = delta.clip(lower=0).rolling(window).mean()
loss = (-delta.clip(upper=0)).rolling(window).mean()
rs = gain / loss.replace(0, np.nan)
return 100 - 100 / (1 + rs)
df['atr14'] = atr(df['high'], df['low'], df['close'], 14)
df['rsi14'] = rsi(df['close'], 14)
df['ret_1'] = df['close'].pct_change()
df['vol_20'] = df['ret_1'].rolling(20).std()
注意 rolling 默认包含当前值,若在收盘前决策,应使用 shift(1) 将特征后移一根 K 线,确保特征只包含已实现信息。
三、特征变换与编码方法
金融特征常存在厚尾、量纲差异与非线性关系,直接送入模型效果有限。常用变换包括:
| 方法 | 适用场景 | 注意事项 |
|---|---|---|
| 标准化 Z-Score | 近似正态的收益率、波动率 | 用训练集均值方差,避免全样本泄露 |
| 稳健标准化 RobustScaler | 存在极端值的成交量、价差 | 基于中位数与四分位距 |
| 分位数变换 | 厚尾分布、非线性指标 | 映射到均匀或正态分布 |
| 对数变换 | 成交量、成交额等右偏数据 | 先加 1 避免 log(0) |
| 独热编码 | 行业、星期、市场状态 | 类别过多时改用目标编码 |
| 分箱编码 | 连续变量离散化 | 边界需在训练集确定 |
任何变换的统计量都必须只在训练集上拟合,再应用到验证集与测试集。用全样本计算均值方差是金融机器学习中最常见的数据泄露之一。
四、案例:构建一个可解释的日频特征集
假设我们预测未来 5 日收益率方向,可构建如下特征流水线:
- 计算 1、5、20 日对数收益率与 20 日滚动波动率。
- 计算 ATR14、RSI14、MACD 柱状值,并做稳健标准化。
- 计算成交量 5 日均值与 20 日均值之比,取对数。
- 加入星期与月份独热编码,捕捉日历效应。
- 所有特征统一
shift(1),标签为未来 5 日收益方向。
五、常见误区与复盘
- 未来函数:用当日收盘价计算指标却用于当日开盘决策,或标准化时使用全样本统计量。
- 指标堆叠:同时加入 MA5、MA10、MA20、EMA5、EMA10,信息高度重叠,模型难以区分。
- 忽略交易成本:特征看起来预测力强,但换手过高,扣除成本后收益消失。
- 不做特征稳定性检查:训练期有效的特征在测试期分布漂移,需监控 PSI 或 KS 统计量。
复盘建议:每轮特征迭代后,记录特征覆盖率、缺失率、训练/测试分布差异与单特征 IC,形成特征台账。特征工程不是一次性工作,而是随市场状态持续迭代的工程过程。
掌握特征类型、指标构建与变换编码方法后,下一步才能进入特征选择与模型训练的稳定流程。特征质量决定了模型上限,而严谨的时点对齐与训练集隔离,决定了这个上限是否真实可信。