特征工程与金融因子构建
概述
特征工程 (Feature Engineering) 是将原始金融数据转化为模型可用信号的核心环节。在量化投资领域,这一过程通常被称为因子构建 (Factor Construction)。优秀的特征工程往往比模型选择更能决定策略的成败——正所谓 "garbage in, garbage out"。
金融特征提取
价量特征 (Price-Volume Features)
从行情数据中提取的基础特征包括:
- 动量因子 (Momentum):\(\text{Mom}_{t,k} = \frac{P_t}{P_{t-k}} - 1\)
- 波动率因子 (Volatility):\(\sigma_t = \sqrt{\frac{1}{n-1}\sum_{i=0}^{n-1}(r_{t-i} - \bar{r})^2}\)
- 换手率 (Turnover):\(\text{Turn}_t = \frac{V_t}{\text{Shares Outstanding}}\)
- 价量相关性:\(\text{Corr}(P_{t-k:t}, V_{t-k:t})\)
基本面特征 (Fundamental Features)
def compute_alpha_features(df):
"""构建常用价量因子"""
features = {}
# 动量因子
for k in [5, 10, 20, 60]:
features[f'mom_{k}d'] = df['close'].pct_change(k)
# 波动率因子
features['vol_20d'] = df['close'].pct_change().rolling(20).std()
# 成交额加权价格偏离
features['vwap_bias'] = df['close'] / df['vwap'] - 1
# 换手率均值比
features['turn_ratio'] = (
df['turnover'].rolling(5).mean() /
df['turnover'].rolling(20).mean()
)
return pd.DataFrame(features, index=df.index)
时间戳对齐
基本面数据具有发布滞后 (Reporting Lag)。使用财报数据时必须按实际公告日 (Announcement Date) 而非报告期末日 (Period End Date) 对齐,否则会引入前视偏差 (Look-ahead Bias)。
因子正交化 (Factor Orthogonalization)
原始因子之间往往存在高度共线性 (Multicollinearity)。因子正交化的目标是消除因子间的线性依赖关系,使得每个因子贡献独立的信息增量。
施密特正交化 (Gram-Schmidt Orthogonalization)
给定因子序列 \(\{f_1, f_2, \ldots, f_p\}\),正交化过程为:
对称正交化 (Symmetric Orthogonalization)
施密特正交化依赖因子排列顺序,对称正交化则不受此限制:
import numpy as np
from scipy.linalg import sqrtm
def symmetric_orthogonalize(factor_matrix):
"""对称正交化: 保持与原始因子的最大相似性"""
F = factor_matrix - factor_matrix.mean(axis=0)
cov = F.T @ F / len(F)
cov_inv_sqrt = np.real(np.linalg.inv(sqrtm(cov)))
return F @ cov_inv_sqrt
正交化的代价
正交化会改变因子的经济含义 (Economic Interpretation)。在实践中,需要在统计独立性与因子可解释性之间权衡。一种折中方案是仅对同类因子(如多个动量变体)进行正交化。
特征选择方法 (Feature Selection)
过滤法 (Filter Methods)
基于统计指标独立评估每个特征的预测能力:
- 信息系数 (IC):\(\text{IC} = \text{Corr}(f_t, r_{t+1})\)
- 互信息 (Mutual Information):\(I(X; Y) = \sum_{x,y} p(x,y) \log \frac{p(x,y)}{p(x)p(y)}\)
包裹法 (Wrapper Methods)
通过模型性能反馈迭代选择特征子集,如递归特征消除 (RFE)。
嵌入法 (Embedded Methods)
在模型训练过程中内嵌特征选择,如 Lasso 的 L1 正则化自动将无关特征系数压缩至零。
from sklearn.feature_selection import mutual_info_regression
# 计算每个因子与未来收益率的互信息
mi_scores = mutual_info_regression(X_factors, y_returns)
selected = np.argsort(mi_scores)[-top_k:] # 保留 top_k 个因子
# 基于 IC 的动态因子筛选
def rolling_ic_filter(factors, returns, window=252, threshold=0.02):
"""滚动窗口计算IC,筛选稳定有效因子"""
ic_series = factors.rolling(window).corr(returns)
ic_mean = ic_series.mean()
ic_ir = ic_mean / ic_series.std() # ICIR: IC的稳定性
return ic_ir[ic_ir.abs() > threshold].index.tolist()
Alpha 信号构建
Alpha 信号 (Alpha Signal) 是特征工程的最终产物,代表对未来超额收益的预测。构建流程为:
- 原始因子计算:从多源数据提取候选因子
- 因子预处理:去极值 (Winsorize)、标准化 (Z-score)、中性化 (Neutralization)
- 因子筛选:基于 IC/ICIR 过滤无效因子
- 因子合成:加权组合多因子为综合 Alpha 信号
其中权重 \(w_k\) 可通过 IC 加权、等权或优化方法确定。
因子衰减与更新
Alpha 信号存在因子拥挤 (Factor Crowding) 和Alpha 衰减 (Alpha Decay) 现象。持续的因子研发 (Factor Research) 与动态权重调整是维持策略生命力的关键。
小结
特征工程是连接原始数据与预测模型的桥梁。在金融场景中,成功的特征工程需要兼顾统计有效性与经济逻辑,避免数据窥探 (Data Snooping),并通过严格的样本外验证确认因子的真实预测能力。