机器学习特征工程:构建有效的量化因子#
量化投资中,特征工程往往比模型选择更重要。好的特征应该具备:经济学逻辑、稳健性、低相关性和预测能力。
量化特征的四大来源#
1. 价格衍生特征#
基于历史价格序列构造的技术指标:
import pandas as pd
import numpy as np
def create_price_features(df):
"""创建价格衍生特征"""
features = pd.DataFrame(index=df.index)
# 动量因子
features['momentum_5d'] = df['close'].pct_change(5)
features['momentum_20d'] = df['close'].pct_change(20)
# 反转因子
features['reversal_5d'] = -df['close'].pct_change(5)
# 波动率
features['vol_20d'] = df['close'].pct_change().rolling(20).std()
# 成交量异常
features['volume_surge'] = df['volume'] / df['volume'].rolling(20).mean()
# 均线位置
ma50 = df['close'].rolling(50).mean()
features['ma_distance'] = (df['close'] - ma50) / ma50
return featurespython2. 财务基本面特征#
从财报数据提取的估值、盈利、成长指标:
- 估值类:PE、PB、PS、EV/EBITDA
- 盈利类:ROE、ROA、毛利率、净利率
- 成长类:营收增长率、净利润增长率
- 质量类:应计项目、盈余质量、资产周转率
3. 另类数据特征#
社交媒体、新闻情感、卫星图像等非传统数据:
def sentiment_feature(news_df):
"""基于新闻情感的特征工程"""
# 情感得分
sentiment_score = analyze_sentiment(news_df['headline'])
# 情感动量
sentiment_momentum = sentiment_score.diff(3)
# 情感波动率
sentiment_vol = sentiment_score.rolling(10).std()
# 异常情感事件
sentiment_shock = (sentiment_score - sentiment_score.rolling(20).mean()) / sentiment_score.rolling(20).std()
return pd.DataFrame({
'sentiment_score': sentiment_score,
'sentiment_momentum': sentiment_momentum,
'sentiment_vol': sentiment_vol,
'sentiment_shock': sentiment_shock
})python4. 市场微观结构特征#
订单流、买卖价差、成交分布等高频数据特征。
特征有效性检验#
构建特征后必须进行严格检验:
1. 单因子检验#
from scipy import stats
def test_single_factor(factor, returns, period=20):
"""检验单个因子的预测能力"""
# 分组回测
groups = pd.qcut(factor, 5, labels=False)
group_returns = returns.groupby(groups).mean()
# IC分析
ic = factor.apply(lambda x: stats.spearmanr(x, returns)[0])
# t统计量
t_stat = (group_returns[4] - group_returns[0]) / group_returns[4].std()
return {
'ic_mean': ic.mean(),
'spread': group_returns[4] - group_returns[0],
't_stat': t_stat
}python2. 多因子相关性分析#
def check_multicollinearity(features):
"""检查特征间多重共线性"""
corr_matrix = features.corr()
# 高相关特征对
high_corr = []
for i in range(len(corr_matrix.columns)):
for j in range(i+1, len(corr_matrix.columns)):
if abs(corr_matrix.iloc[i, j]) > 0.7:
high_corr.append((
corr_matrix.columns[i],
corr_matrix.columns[j],
corr_matrix.iloc[i, j]
))
return high_corrpython3. 因子衰减分析#
测试因子预测能力随时间衰减的速度。
特征选择方法#
1. 递归特征消除(RFE)#
from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegression
def rfe_feature_selection(X, y, n_features=20):
"""递归特征消除"""
estimator = LinearRegression()
selector = RFE(estimator, n_features_to_select=n_features)
selector.fit(X, y)
return X.columns[selector.support_]python2. 基于模型的特征重要性#
from sklearn.ensemble import RandomForestRegressor
def rf_feature_importance(X, y, threshold=0.01):
"""随机森林特征重要性筛选"""
rf = RandomForestRegressor(n_estimators=100, random_state=42)
rf.fit(X, y)
importances = rf.feature_importances_
selected = X.columns[importances > threshold]
return selected, importancespython实战案例:整合特征工程流程#

完整特征工程流程:
- 特征生成:创建100+原始特征
- 数据清洗:处理缺失值、异常值
- 特征变换:标准化、正态化、分箱
- 有效性检验:IC分析、分组回测
- 特征选择:去除冗余、保留有效
- 模型训练:使用精选特征训练模型
常见陷阱与避免方法#
- 过拟合:使用样本外测试、交叉验证
- 数据挖掘偏差:控制特征搜索次数
- 前视偏差:确保特征计算仅使用历史数据
- 幸存者偏差:包含已退市股票
总结#
有效的特征工程是量化策略成功的关键。坚持经济学逻辑优先、统计验证为辅的原则,避免纯粹的数据挖掘。
