多因子模型基础:CAPM、Fama-French三因子、Barra模型简介
聊到多因子模型,咱们得先搞清楚它的根在哪儿。我个人习惯把这三个模型看作「三代进化」——从CAPM的单一解释,到三因子的多维度补充,再到Barra的工程化落地。说白了,它们就是量化选股的底层逻辑。
1. CAPM:一切的开端
CAPM(资本资产定价模型)是1960年代由Sharpe他们搞出来的。公式很简单:
E(Ri) = Rf + βi * (E(Rm) - Rf)
这里头,βi 衡量的是股票对市场的敏感度。如果 β=1.5,意味着市场涨1%,这只股票平均涨1.5%。
我在项目中遇到过一个问题:用CAPM给一只银行股定价,结果β算出来只有0.6。当时我纳闷,银行股不是应该跟市场走得很近吗?后来发现,因为样本期选了2015年股灾前后,市场暴跌时银行股反而被护盘资金托着,β自然就低了。嗯,这里要注意——β的稳定性取决于样本区间。
核心要点:CAPM假设所有风险都能用β解释。但现实是,市场风险之外还有行业风险、风格风险。这就是为什么后来有了多因子模型。
实战小技巧:计算β时,我建议用过去3年的日收益率数据,剔除停牌日和涨跌停日。这样算出来的β更贴近真实交易环境。
2. Fama-French三因子模型:补上CAPM的短板
1993年,Fama和French发现,CAPM解释不了两个现象:小盘股长期跑赢大盘股,低估值股跑赢高估值股。于是他们加了两个因子:
- SMB(规模因子):小市值股票组合收益 - 大市值股票组合收益
- HML(价值因子):高账面市值比股票组合收益 - 低账面市值比股票组合收益
模型变成:
E(Ri) - Rf = β_mkt * (Rm - Rf) + β_smb * SMB + β_hml * HML
你想想看,这个模型在A股市场表现如何?我做过回测,2010-2020年间,A股的小市值效应非常显著,SMB因子的年化超额收益能达到8%以上。但HML因子就没那么稳定了——2017年之后,价值因子在A股几乎失效。
避坑指南:我曾经在构建三因子模型时,直接用美股的标准因子构造方法套用到A股。结果发现,A股的SMB因子需要做「市值分层调整」——因为A股有大量壳价值干扰,小市值股票里混着很多垃圾股。后来我改用「剔除ST股+市值前30%分位」的样本,效果才稳定下来。
三因子模型的精髓在于:它告诉我们,超额收益不是玄学,而是有规律可循的。小盘股、价值股之所以能跑赢,背后是风险溢价在起作用。
3. Barra模型:从学术到工业化的跨越
Barra模型是MSCI公司搞出来的,它把因子体系扩展到了几十个。说白了,Barra就是「因子工厂」——把你能想到的所有风格都量化成因子。
典型的Barra风格因子包括:
| 因子类别 | 具体因子 | 解释 |
|---|---|---|
| 市场因子 | Beta | 股票对市场的敏感度 |
| 规模因子 | 对数市值 | 公司大小 |
| 价值因子 | 账面市值比、盈利收益率 | 估值高低 |
| 动量因子 | 过去12个月收益(剔除最近1个月) | 趋势延续性 |
| 波动率因子 | 日收益率标准差 | 风险水平 |
| 流动性因子 | 换手率、Amihud非流动性指标 | 交易成本 |
| 成长因子 | 营收增长率、利润增长率 | 扩张速度 |
Barra模型的核心公式是:
ri = Σ(f_k * X_ik) + ε_i
其中 f_k 是因子收益率,X_ik 是股票i在因子k上的暴露度,ε_i 是特异收益。
我在项目中用过Barra模型做风险归因。有一次,一个组合明明跑赢了基准,但领导问「超额收益从哪来的?」我直接用Barra拆解——发现80%的超额来自「规模因子」暴露,20%来自「动量因子」。但问题是,规模因子暴露太高,一旦市场风格切换,回撤会很大。后来我做了行业中性化处理,把规模因子的暴露控制在基准的±0.5个标准差内。
关键区别:CAPM和三因子是「解释型」模型,告诉你收益从哪来。Barra是「工程型」模型,告诉你如何控制风险、如何做组合优化。做量化投资,三个模型都得吃透。
4. 三个模型的关系:一张图看懂
下面这张SVG图,展示了三个模型的演进逻辑和核心差异:
从这张图能看出来,CAPM是地基,三因子是承重墙,Barra是精装修。做量化投资,你不能只懂Barra而不知道CAPM——那就像只会用高级函数却不懂底层逻辑。
5. 实战中的选择建议
我个人习惯这样用:
- 做学术研究或因子挖掘:用Fama-French三因子做基准,看新因子能否提供增量解释力
- 做组合风险控制:用Barra模型做风险归因,控制风格因子暴露
- 做快速选股:用CAPM算β,筛选低波动股票
一个小技巧:如果你用Python做回测,建议用 statsmodels 的OLS回归来估计因子暴露。代码很简单:
import statsmodels.api as sm
# 假设 returns 是股票超额收益,factors 是因子收益率矩阵
X = sm.add_constant(factors)
model = sm.OLS(returns, X).fit()
print(model.params) # 因子暴露系数
嗯,这三个模型讲完了。记住一句话:没有完美的模型,只有合适的用法。CAPM太简单,Barra太复杂,三因子刚刚好——但具体用哪个,取决于你的数据质量和业务目标。