4. 风险因子模型:Fama-French 三因子模型、五因子模型、因子暴露与因子收益
风险因子模型是量化投资中解释资产收益、进行风险归因的核心工具。Fama-French 系列模型通过构建系统性风险因子,将投资组合的超额收益分解为因子暴露与因子收益的乘积,为组合管理者提供了标准化的风险分析框架。
4.1 Fama-French 三因子模型 (FF3)
1993 年,Eugene Fama 和 Kenneth French 在 CAPM 单因子模型基础上,提出了经典的三因子模型。该模型认为,投资组合的超额收益可由以下三个因子解释:
| 因子名称 | 符号 | 构建方式 | 经济含义 |
|---|---|---|---|
| 市场风险溢价 | Rm - Rf | 市场组合收益率 - 无风险利率 | 承担系统性市场风险的补偿 |
| 规模因子 | SMB (Small Minus Big) | 小市值股票组合收益 - 大市值股票组合收益 | 小盘股相对于大盘股的风险溢价 |
| 价值因子 | HML (High Minus Low) | 高账面市值比组合收益 - 低账面市值比组合收益 | 价值股相对于成长股的风险溢价 |
三因子模型的数学表达式为:
R_i - R_f = α_i + β_i·(R_m - R_f) + s_i·SMB + h_i·HML + ε_i
其中,β_i、s_i、h_i 分别为组合对市场、规模、价值因子的暴露度(因子载荷),α_i 为经风险调整后的超额收益(Alpha)。
实战要点:在 A 股市场,SMB 因子通常具有显著的正溢价,小盘股长期跑赢大盘股;HML 因子的有效性在近年有所减弱,需结合估值周期动态调整。
4.2 Fama-French 五因子模型 (FF5)
2015 年,Fama 和 French 在三因子基础上增加了两个与盈利能力及投资风格相关的因子,形成了五因子模型,进一步提升了收益解释能力。
| 因子名称 | 符号 | 构建方式 | 经济含义 |
|---|---|---|---|
| 市场风险溢价 | Rm - Rf | 市场组合收益率 - 无风险利率 | 系统性市场风险补偿 |
| 规模因子 | SMB | 小市值 - 大市值 | 规模风险溢价 |
| 价值因子 | HML | 高账面市值比 - 低账面市值比 | 价值风险溢价 |
| 盈利因子 | RMW (Robust Minus Weak) | 高盈利组合收益 - 低盈利组合收益 | 高盈利能力公司的风险溢价 |
| 投资因子 | CMA (Conservative Minus Aggressive) | 低投资组合收益 - 高投资组合收益 | 保守投资风格的风险溢价 |
五因子模型表达式:
R_i - R_f = α_i + β_i·(R_m - R_f) + s_i·SMB + h_i·HML + r_i·RMW + c_i·CMA + ε_i
模型选择建议:三因子模型适用于快速归因与基准比较;五因子模型适用于精细化风险拆解与业绩归因。在因子拥挤度较高的市场环境中,RMW 和 CMA 因子能提供额外的区分度。
4.3 因子暴露与因子收益
因子模型的核心在于将组合收益分解为两个关键组成部分:
- 因子暴露(Factor Exposure / Factor Loading):组合对某个因子的敏感度,通常通过时间序列回归(如 OLS)得到。暴露度越高,组合收益受该因子波动的影响越大。
- 因子收益(Factor Return):因子本身在特定时期内的收益率,由多空组合的收益差计算得出,反映该风险因子的市场定价。
组合的预期收益可表示为:
E[R_i] - R_f = Σ (因子暴露 × 因子预期收益)
风险归因则进一步将组合的波动率(风险)分解到各因子上:
组合风险 = Σ (因子暴露 × 因子协方差矩阵 × 因子暴露) + 特质风险
常见误区:因子暴露是历史回归结果,不代表未来因子收益方向。因子收益可能随时间发生结构性变化(如价值因子在利率上升期的表现),需结合宏观环境动态评估。
4.4 因子模型在组合风险归因中的应用流程
在实际量化工作中,使用因子模型进行风险归因通常遵循以下步骤:
- 因子构建:根据模型定义,计算各因子的日度/月度收益率序列(如 SMB、HML、RMW、CMA)。
- 暴露度估计:使用滚动窗口回归(如 36 个月),估计组合或个股对各因子的暴露系数。
- 收益分解:将组合实际收益拆解为因子贡献部分与 Alpha 部分。
- 风险分解:基于因子协方差矩阵,计算各因子对组合总风险的贡献比例。
- 归因报告:输出因子暴露热力图、风险贡献饼图、Alpha 序列等可视化结果。
4.5 因子暴露与因子收益的实战计算示例
以下 Python 代码演示了如何使用 OLS 回归估计组合对三因子的暴露度,并计算因子贡献收益:
import pandas as pd
import numpy as np
import statsmodels.api as sm
# 假设已准备好数据:组合超额收益、市场超额收益、SMB、HML
# df 包含列:'port_excess', 'mkt_excess', 'SMB', 'HML'
X = df[['mkt_excess', 'SMB', 'HML']]
X = sm.add_constant(X) # 添加截距项用于估计 Alpha
y = df['port_excess']
model = sm.OLS(y, X).fit()
# 提取因子暴露(系数)
alpha = model.params['const']
beta_mkt = model.params['mkt_excess']
beta_smb = model.params['SMB']
beta_hml = model.params['HML']
# 计算因子贡献收益
factor_contribution = {
'市场因子贡献': beta_mkt * df['mkt_excess'].mean(),
'规模因子贡献': beta_smb * df['SMB'].mean(),
'价值因子贡献': beta_hml * df['HML'].mean(),
'Alpha': alpha
}
print("因子暴露系数:")
print(f"Alpha: {alpha:.4f}, Beta_mkt: {beta_mkt:.4f}, Beta_smb: {beta_smb:.4f}, Beta_hml: {beta_hml:.4f}")
print("\n因子平均贡献收益:")
for k, v in factor_contribution.items():
print(f"{k}: {v:.4f}")
工程化建议:在实际生产环境中,建议使用滚动窗口回归(如 252 个交易日)动态更新因子暴露,并采用 Newey-West 调整标准误以处理异方差与自相关。因子收益数据可从学术数据库(如 Kenneth French 数据图书馆)或自建多空组合计算。
4.6 三因子 vs 五因子:适用场景对比
| 对比维度 | 三因子模型 (FF3) | 五因子模型 (FF5) |
|---|---|---|
| 因子数量 | 3 个(市场、规模、价值) | 5 个(市场、规模、价值、盈利、投资) |
| 收益解释力 (R²) | 中等(约 70-85%) | 较高(约 80-95%) |
| 模型简洁性 | 高,易于实现与沟通 | 中等,因子间可能存在共线性 |
| 适用场景 | 快速归因、基准比较、小规模组合 | 精细化归因、机构级风控、多空策略 |
| 数据要求 | 较低,仅需市值与账面市值比 | 较高,需盈利能力与投资数据 |
选择哪种模型取决于组合的复杂程度与归因精度需求。对于大多数 AB 测试场景,三因子模型已能提供足够的风险调整精度;当需要深入拆解风格漂移或行业偏离时,五因子模型更具优势。