多因子组合与模型:从加权到机器学习
说实话,因子挖掘出来只是第一步。真正让策略赚钱的,是怎么把这些因子组合起来。我见过太多人挖了一堆漂亮因子,结果组合后收益反而变差了。嗯,这里面的门道,我今天跟你好好聊聊。
多因子加权:最朴素也最有效
加权组合,说白了就是给每个因子分配一个权重。最简单的做法是等权,但实际中很少有人这么干。
核心思路:因子质量越高,权重越大。但怎么定义「质量」?我个人习惯用IC(信息系数)和IR(信息比率)来衡量。
加权方式大概分这么几种:
- 等权加权:每个因子权重相同。适合因子质量差不多的时候。
- IC加权:按因子IC值分配权重。IC越高,权重越大。
- ICIR加权:结合IC和IR。IR考虑了IC的稳定性,比单纯用IC更靠谱。
- 动态加权:权重随时间变化。比如最近3个月的IC表现好,就多给点权重。
我在项目中遇到过一个问题:用IC加权时,某个因子突然失效了,但权重还是很高,结果拖累了整体表现。后来我改用ICIR加权,情况好多了。为什么呢?因为IR会惩罚那些波动大的因子。
我的建议:刚开始做多因子组合,先从等权开始。等权跑通了,再尝试IC加权。别一上来就搞动态加权,容易过拟合。
线性回归模型:简单但够用
加权组合其实可以看作线性回归的特例。线性回归模型的形式是:
y = w1 * f1 + w2 * f2 + ... + wn * fn + b
其中y是预测的收益率,f是因子值,w是权重,b是偏置项。
用线性回归的好处是:
- 权重由数据自动学习,不用手动设定
- 可以加入正则化防止过拟合
- 解释性强,每个因子的贡献一目了然
但要注意,线性回归假设因子和收益率是线性关系。现实中很多因子是非线性的。比如市值因子,小市值股票收益高,但也不是越小越好,太小的股票流动性差,反而收益不好。
避坑指南:我曾经用线性回归组合了20个因子,结果回测很好,实盘却一塌糊涂。后来发现是多重共线性问题——好几个因子高度相关,导致权重不稳定。解决办法是先用PCA降维,或者用Lasso回归自动筛选因子。
机器学习模型:随机森林与XGBoost
当线性模型不够用时,就该上机器学习模型了。我常用的两个模型是随机森林和XGBoost。
随机森林:集成学习的入门
随机森林的原理很简单:训练多棵决策树,然后取平均。每棵树只看到部分数据和部分特征,这样能降低过拟合。
在因子组合中,随机森林的好处是:
- 自动捕捉非线性关系
- 对异常值不敏感
- 能输出特征重要性,帮你筛选因子
但随机森林也有缺点:容易过拟合,尤其是在因子数量多、样本量少的时候。我一般会限制树的最大深度,比如设成3或4层。
from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor(
n_estimators=100, # 树的数量
max_depth=4, # 最大深度,防止过拟合
min_samples_leaf=50, # 叶子节点最少样本数
random_state=42
)
model.fit(X_train, y_train)
# 查看特征重要性
importance = model.feature_importances_
XGBoost:梯度提升的王者
XGBoost是目前量化领域最流行的模型之一。它和随机森林不同,是逐步训练的——每棵新树都在纠正前面树的错误。
XGBoost的优势:
- 训练速度快,支持并行计算
- 自带正则化,防止过拟合
- 能处理缺失值
- 效果通常比随机森林好
但XGBoost的参数调起来比较麻烦。我刚开始用的时候,经常调参调到怀疑人生。后来总结了一套经验:
- 先固定学习率(比如0.1),调树的数量
- 再调最大深度(一般3-6层就够了)
- 最后调正则化参数(lambda和alpha)
import xgboost as xgb
params = {
'objective': 'reg:squarederror',
'learning_rate': 0.1,
'max_depth': 4,
'lambda': 1.0, # L2正则化
'alpha': 0.1, # L1正则化
'subsample': 0.8, # 样本采样比例
'colsample_bytree': 0.8 # 特征采样比例
}
model = xgb.XGBRegressor(**params)
model.fit(X_train, y_train)
个人经验:XGBoost虽然效果好,但容易过拟合。我建议在训练时用早停(early stopping),当验证集上的表现不再提升时就停止训练。这样能省不少时间,还能防止过拟合。
模型选择:没有银弹
你可能会问:到底该用哪个模型?说实话,没有标准答案。我一般会这样选:
| 场景 | 推荐模型 | 原因 |
|---|---|---|
| 因子少(<10个),关系简单 | 线性回归 | 解释性强,不容易过拟合 |
| 因子多,有非线性关系 | XGBoost | 效果好,能自动捕捉非线性 |
| 数据量大,需要快速迭代 | 随机森林 | 训练快,参数少,不容易出错 |
| 需要解释因子重要性 | 随机森林或XGBoost | 都有特征重要性输出 |
我个人习惯的做法是:先用线性回归做个baseline,然后试试XGBoost。如果XGBoost比线性回归好很多,说明因子间存在非线性关系。如果差不多,那就用线性回归,毕竟简单可靠。
重要提醒:机器学习模型很容易过拟合。我见过有人用XGBoost在回测上做到年化50%,实盘直接亏20%。为什么会这样?因为模型学到了数据中的噪声,而不是真正的规律。解决办法是:严格做时间序列交叉验证,不要用未来的数据训练模型。
知识体系总览
下面这张图展示了多因子组合与模型的整体流程:
从这张图可以看出,多因子组合的核心流程是:因子输入 → 预处理 → 选择组合方式 → 输出预测。三种方法不是互斥的,我经常把它们结合起来用。比如先用线性回归筛选因子,再用XGBoost做最终预测。
最后说一句:模型再复杂,也抵不过因子质量差。我见过有人用最简单的等权组合,因为因子选得好,收益比那些用XGBoost的还高。所以,别把精力都花在模型上,多花点时间在因子挖掘上,才是正道。