3、多因子模型:构建逻辑、权重分配与相关性处理
多因子模型,说白了就是给股票打分。你想想看,我们做量化投资,总不能拍脑袋买股票吧?得有个系统性的方法。多因子模型就是干这个的——把各种能预测收益的特征(因子)组合起来,形成一个综合评分,然后根据评分选股。
我在项目中遇到过不少团队,因子库建了一大堆,但模型效果就是不行。为什么?多半是因子权重没分好,或者因子之间相关性太高,互相打架。今天我就把这块的坑和经验,一次性说清楚。
3.1 多因子模型的构建逻辑
构建逻辑其实不复杂,就三步:
- 因子挖掘:找到能预测收益的特征
- 因子合成:把多个因子组合成一个综合因子
- 选股应用:根据综合因子排序,买入高分股票
嗯,这里要注意,因子挖掘不是越多越好。我见过有人搞了200多个因子,结果过拟合得一塌糊涂。我个人习惯,核心因子控制在10-20个,足够了。
核心公式:综合得分 = w₁ × f₁ + w₂ × f₂ + ... + wₙ × fₙ
其中 w 是权重,f 是因子值(需标准化处理)
举个例子,假设我们只用三个因子:估值因子(PE倒数)、动量因子(过去12个月收益)、质量因子(ROE)。那么一只股票的综合得分就是:
score = 0.4 × zscore(1/PE) + 0.3 × zscore(momentum_12m) + 0.3 × zscore(ROE)
这里zscore是标准化处理,让每个因子都在同一量纲上。不然PE是几十倍,ROE是百分之几,直接相加就没意义了。
3.2 因子权重分配方法
权重分配是个技术活。我把它分成三类:
3.2.1 等权法
最简单,每个因子权重一样。适合因子数量少、质量都差不多的情况。但说实话,实战中很少用——因为因子质量不可能一样。
3.2.2 优化法
通过历史数据回测,找到让夏普比率最大化的权重。常用方法:
- 最大化IC加权:IC(信息系数)越高,权重越大
- 最大化夏普比率:考虑因子间的协方差
- 风险平价:让每个因子对组合风险的贡献相等
我曾经用最大化夏普比率的方法,跑出来一个权重组合。结果实盘三个月,效果还不如等权。为什么?因为历史最优权重,未来不一定最优。这就是过拟合的典型表现。
避坑指南:优化法容易过拟合。我建议用滚动窗口法——每半年重新计算一次权重,而不是用全历史数据一次性优化。
3.2.3 机器学习法
用模型自动学习权重。比如:
- 线性回归:用因子预测未来收益,回归系数就是权重
- 随机森林:特征重要性可以作为权重
- 神经网络:端到端学习,但解释性差
我个人更偏好线性回归+正则化(Lasso/Ridge)。既能学到权重,又能自动筛选因子。Lasso会把不重要的因子权重压到0,相当于自动做了因子选择。
# Python示例:用Lasso回归学习因子权重
from sklearn.linear_model import LassoCV
import numpy as np
# X: 因子矩阵 (样本数 × 因子数)
# y: 未来收益
lasso = LassoCV(cv=5, random_state=42)
lasso.fit(X, y)
# 权重就是回归系数
weights = lasso.coef_
print("因子权重:", weights)
3.3 因子相关性处理
这是多因子模型里最容易翻车的地方。因子之间高度相关,会导致什么问题?
- 多重共线性:权重估计不稳定,今天跑和明天跑结果不一样
- 冗余信息:两个相关因子等于重复投票,放大了某类风险
- 过拟合:模型记住了噪声而不是信号
我记得有一次,模型里同时放了市盈率(PE)和市净率(PB),相关性高达0.7。结果回测漂亮,实盘一塌糊涂。后来才发现,这两个因子本质上都在反映"便宜"这个维度,等于给估值因子投了两票。
3.3.1 相关性检测
第一步,先算因子间的相关系数矩阵。我一般设阈值0.6——超过这个值,就要处理了。
import pandas as pd
import numpy as np
# 假设factors_df是因子数据,每列一个因子
corr_matrix = factors_df.corr()
# 找出高相关对
high_corr_pairs = []
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.6:
high_corr_pairs.append((corr_matrix.columns[i],
corr_matrix.columns[j],
corr_matrix.iloc[i, j]))
print("高相关因子对:", high_corr_pairs)
3.3.2 处理方法
处理方式有三种,我按推荐程度排序:
| 方法 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 因子正交化 | 用施密特正交化或PCA,去除因子间的相关性 | 保留所有因子信息,消除冗余 | 正交后的因子解释性变差 |
| 因子合并 | 把相关因子合成一个综合因子 | 简单直观,解释性强 | 可能丢失细节信息 |
| 只保留一个 | 从相关因子中选一个代表性最强的 | 最简洁,不易过拟合 | 可能丢失有效信息 |
我个人习惯用因子正交化。虽然解释性差一点,但信息保留最完整。具体做法:
- 计算因子间的协方差矩阵
- 用Cholesky分解或QR分解做正交化
- 用正交后的因子重新建模
实战技巧:正交化后记得检查一下,因子间的相关性应该降到接近0。如果还有残留,说明正交化没做好。
3.3.3 一个完整的处理流程
我一般按这个流程走:
- 初筛:剔除缺失率超过30%的因子
- 去相关:计算相关系数矩阵,对高相关对做正交化
- 标准化:每个因子转成z-score
- 权重分配:用Lasso回归或等权法
- 回测验证:检查因子组合的IC序列和夏普比率
嗯,这里要特别提醒:处理相关性不是一次性工作。因子相关性会随时间变化。我建议每季度重新计算一次相关性矩阵,动态调整。
最后总结一下。多因子模型的核心就三件事:找好因子、分好权重、处理好相关性。权重分配别迷信历史最优,相关性处理别偷懒。我见过太多人在这两个地方翻车了。
你想想看,如果因子之间高度相关,权重又不稳定,那模型不就是个随机数生成器吗?所以,稳扎稳打,把基础打牢,比追求花哨的模型重要得多。
一句话记住:因子要独立,权重要稳健,模型要简单。
公众号:蓝海资料掘金营,微信deep3321