4. 特征工程入门
在Alpha研究中,特征工程决定了模型能看到什么。原始行情数据只有开高低收、成交量与成交额,而真正驱动预测能力的,是从这些原始字段中提炼出的可解释、可复用、可检验的因子。本节围绕五类核心特征展开,并给出中性化处理的工程实现思路。
一、核心原理:特征是对市场状态的压缩表达
量价特征刻画资金与价格的配合关系;波动率特征描述风险水平与不确定性;流动性特征衡量交易成本与冲击;动量与反转特征捕捉趋势延续或过度反应;中性化处理则剥离行业与市值带来的系统性暴露。五者共同构成从“原始数据”到“可建模信号”的桥梁。
二、方法流程:从字段到因子的标准管线
建议按以下顺序构建特征管线,避免信息泄露与量纲混乱:
- 数据对齐:统一交易日历,处理停牌与涨跌停,缺失值前向填充但限制最大天数。
- 特征计算:按量价、波动率、流动性、动量反转四类分别生成原始因子值。
- 去极值:采用MAD或分位数截断,防止极端值主导回归。
- 标准化:截面Z-score或排序百分位,使不同因子可比。
- 中性化:对行业哑变量与市值对数做回归,取残差作为最终因子。
- IC检验:计算因子与未来收益的Rank IC,筛选有效特征。
关键参数示例:动量窗口20日、波动率窗口20日、流动性窗口20日、中性化行业分类采用申万一级、市值取对数后回归。
三、案例场景:构建一个20日动量因子并中性化
假设我们已有一个包含股票代码、日期、收盘价、行业、总市值的DataFrame,下面用Python实现动量因子计算与中性化:
import pandas as pd
import numpy as np
import statsmodels.api as sm
# 1. 计算20日动量
df['mom_20'] = df.groupby('code')['close'].pct_change(20)
# 2. 去极值:MAD截断
def mad_clip(s, n=5):
med = s.median()
mad = (s - med).abs().median()
return s.clip(med - n*1.4826*mad, med + n*1.4826*mad)
df['mom_20'] = df.groupby('date')['mom_20'].transform(mad_clip)
# 3. 标准化
df['mom_20_z'] = df.groupby('date')['mom_20'].transform(
lambda x: (x - x.mean()) / x.std()
)
# 4. 行业与市值中性化
def neutralize(group):
y = group['mom_20_z']
X = pd.get_dummies(group['industry'], drop_first=True)
X['ln_mktcap'] = np.log(group['mktcap'])
X = sm.add_constant(X.astype(float))
model = sm.OLS(y, X, missing='drop').fit()
return model.resid
df['mom_20_neutral'] = df.groupby('date').apply(neutralize).reset_index(level=0, drop=True)
运行后,mom_20_neutral即为剥离行业与市值暴露后的纯净动量因子,可直接进入多因子合成或机器学习模型。
四、误区与复盘:中性化不是万能药
常见误区:中性化会移除部分有效信息。若行业轮动本身是Alpha来源,过度中性化会削弱收益。建议先检验原始因子IC,再决定是否中性化以及中性化程度。
- 误区一:用全样本均值标准化,导致未来信息泄露。必须按截面日期分组计算。
- 误区二:忽略停牌股,造成因子在停牌期间被错误填充。应标记停牌并排除。
- 误区三:动量与反转窗口混用。短期(1-5日)常表现为反转,中期(20-60日)常表现为动量,需分别检验。
- 误区四:流动性因子未考虑成交额分布。建议同时保留绝对成交额与截面分位数。
| 特征类别 | 典型因子 | 计算窗口 | 方向假设 | 中性化建议 |
|---|---|---|---|---|
| 量价特征 | 量价背离、VWAP偏离 | 5/20日 | 背离看反转 | 行业+市值 |
| 波动率特征 | 已实现波动、ATR | 20日 | 低波动占优 | 行业+市值 |
| 流动性特征 | Amihud非流动性 | 20日 | 低流动性溢价 | 市值必做 |
| 动量与反转 | 20日收益、5日反转 | 5/20日 | 中期动量、短期反转 | 行业+市值 |
复盘建议:每构建一个因子,先画因子分布图与IC时间序列,再检查与已有因子的相关性。相关性高于0.7的因子应合并或剔除,避免多重共线性。
特征工程不是一次性工作,而是伴随模型迭代持续优化的过程。掌握量价、波动率、流动性、动量反转四类特征的构造逻辑,并正确执行行业与市值中性化,才能为后续的Alpha模型提供干净、稳定、可解释的输入。