第3章:多因子组合基础
多因子模型,说白了就是给股票打分。你想想看,单看一个指标容易踩坑,把几个好指标组合起来,胜率就高多了。这一章我带你从理论到实操,把多因子组合的底牌翻个遍。
3.1 多因子模型理论
先聊理论。CAPM 是祖师爷,Fama-French 三因子是经典,五因子是升级版。我个人习惯,做研究时先跑一遍三因子,看看市场、规模、价值这三个维度能不能解释收益。如果不行,再加动量或质量因子。
3.1.1 CAPM:一切从β开始
CAPM 说,股票的预期收益只跟市场风险有关。公式很简单:
E(Ri) = Rf + βi * (E(Rm) - Rf)
β 衡量股票对市场的敏感度。β=1,跟大盘同涨跌;β>1,波动更大。我在项目中遇到过一只小盘股,β 高达 1.8,市场跌 1% 它跌 1.8%,那叫一个刺激。
3.1.2 Fama-French 三因子模型
Fama 和 French 发现,除了市场风险,市值小的公司、估值低的公司,长期收益更高。于是加了两个因子:
- SMB(Small Minus Big):小市值股票组合收益减去大市值组合收益
- HML(High Minus Low):高账面市值比(价值股)减去低账面市值比(成长股)
模型长这样:
E(Ri) - Rf = βi * (E(Rm) - Rf) + si * SMB + hi * HML
嗯,这里要注意:三因子模型在中国 A 股也有效,但 SMB 的收益比美股更明显。我回测过 2010-2020 年的数据,小市值因子年化超额收益接近 8%。
3.1.3 Fama-French 五因子模型
后来他们又加了两个因子:
- RMW(Robust Minus Weak):高盈利能力的公司减去低盈利能力的公司
- CMA(Conservative Minus Aggressive):投资保守的公司减去投资激进的公司
五因子模型解释力更强,但因子多了容易过拟合。我建议你,做因子组合时先跑三因子,如果 R² 已经很高了,就别硬加因子。
3.2 因子正交化
因子之间经常互相「串门」。比如市值因子和估值因子,小盘股往往估值也低。如果不做正交化,你以为是两个因子在起作用,其实是一个。
正交化的核心思想:把因子之间的相关性去掉,让每个因子独立贡献收益。
3.2.1 施密特正交化
最经典的方法。步骤很简单:
- 选一个基准因子(比如市场因子)
- 把其他因子对基准因子做回归,取残差
- 残差就是正交化后的因子
代码实现:
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
def orthogonalize(factors, base_factor):
"""
factors: DataFrame,每列是一个因子
base_factor: 基准因子名称
"""
result = factors.copy()
for col in factors.columns:
if col == base_factor:
continue
X = factors[[base_factor]].values
y = factors[col].values
model = LinearRegression().fit(X, y)
residual = y - model.predict(X)
result[col] = residual
return result
3.2.2 PCA 正交化
主成分分析(PCA)是另一种思路。它把因子空间旋转,找到一组不相关的主成分。每个主成分是原始因子的线性组合。
优点:自动处理多重共线性。缺点:主成分不好解释,你不知道它代表什么经济含义。
我个人习惯:做学术研究用 PCA,做实战用施密特正交化。因为实战中你需要跟基金经理解释:「这个因子代表盈利能力」,而不是说「这是第三主成分」。
3.3 因子加权方法
因子正交化之后,怎么把它们组合成一个综合得分?加权方法很关键。
3.3.1 等权加权
最简单粗暴。每个因子权重一样,比如 5 个因子各占 20%。
weights = [0.2, 0.2, 0.2, 0.2, 0.2]
score = sum(factor_i * w_i for factor_i, w_i in zip(factors, weights))
优点:稳健,不容易过拟合。缺点:如果某个因子明显更有效,等权会稀释它的作用。
3.3.2 市值加权
按股票市值大小分配权重。大市值股票权重高,小市值权重低。
这种做法在指数基金里很常见。但做因子组合时,市值加权会偏向大票,小盘股因子(比如 SMB)的效果会被压制。
3.3.3 IC 加权
IC(Information Coefficient)是因子值与未来收益的相关系数。IC 越高,说明因子预测能力越强。
IC 加权的思路:用过去一段时间的 IC 值作为权重。IC 高的因子给更多权重,IC 低的给少一些。
具体做法:
import pandas as pd
import numpy as np
def ic_weighted_score(factors, future_returns, window=20):
"""
factors: DataFrame,每列是一个因子
future_returns: Series,未来一期收益
window: 滚动窗口
"""
ic_series = pd.DataFrame(index=factors.index)
for col in factors.columns:
# 计算滚动 IC
ic = factors[col].rolling(window).corr(future_returns)
ic_series[col] = ic
# 用 IC 绝对值作为权重
weights = ic_series.abs().iloc[-1]
weights = weights / weights.sum()
# 计算综合得分
score = (factors.iloc[-1] * weights).sum()
return score, weights
IC 加权的好处是动态调整,因子失效时权重自动降低。但要注意:IC 本身有噪声,窗口太短容易误判。
3.4 知识体系总览
下面这张图,把本章的核心逻辑串起来了。你可以把它当作多因子组合的「操作手册」:
从这张图你能看到,多因子组合不是简单地把因子堆在一起。它需要经过理论验证、正交化处理、加权组合、回测优化,最后才能上实盘。每一步都有坑,我踩过的坑比你想象的多。
- 理论模型(CAPM、三因子、五因子)是基础,但别迷信,A 股有自己的脾气
- 正交化解决因子共线性问题,施密特适合实战,PCA 适合研究
- 加权方法没有绝对好坏,等权稳健、IC 加权灵活、市值加权适合大资金
- 回测时一定要考虑因子衰减和换手率,否则实盘会打脸
好了,这一章就到这里。多因子组合的门道很深,但只要你把理论、正交化、加权这三个环节吃透,后面的事情就顺了。
公众号:蓝海资料掘金营,微信deep3321