Caloogy 文章
English

因子是什么:从 CAPM 到 Fama–French

日期
2026 年 4 月 15 日
系列
量化
阅读
4 分钟
主题
QuantFactorCapmFama french

一句话版本

一只股票(或一个组合)的收益,可以拆成两部分:一部分来自它对几种共同驱动力的暴露(市场整体涨跌、小盘股相对大盘股、便宜股相对贵股……),另一部分是它独有的。这些共同驱动力就叫因子,对每个因子的敏感度叫因子暴露(beta),拆完之后剩下的、不能被因子解释的平均超额收益叫 alpha。 从 1960 年代只有一个"市场因子"的 CAPM,到 1990 年代的 Fama–French 三因子、五因子,再到动量、质量、低波动等,因子模型是现代量化投资的共同语言。

免责

本文仅为技术科普,不构成任何投资建议。文中代码使用模拟数据。


第一层:通俗理解

1.1 一锅汤的味道从哪来

一锅汤很咸,是因为放了盐、酱油,还是厨师手艺特别?如果你知道这锅汤里放了多少盐、多少酱油,就能估计出"手艺"贡献了多少。

一个基金赚了 20%:

因子模型就是把收益拆成"配料"和"手艺"的工具。

1.2 为什么这件事重要

用途 说明
业绩归因 判断一个基金经理是真有本事,还是只是押对了风格
风险管理 知道组合暴露在哪些因子上,就知道市场怎么变时会受伤
构建策略 有意识地暴露在长期有溢价的因子上("聪明贝塔")
定价 解释为什么不同资产的预期收益不同

第二层:因子模型的演化

2.1 CAPM:只有一个因子

资本资产定价模型(Sharpe、Lintner 等,1960 年代)认为:

E[Ri]−Rf=βi(E[Rm]−Rf),E[R_i] - R_f = \beta_i \big(E[R_m] - R_f\big),

一只资产的超额收益,只取决于它对市场的暴露 βi\beta_i。高 beta 的股票风险大,所以预期收益高。

问题:实证中,很多现象 CAPM 解释不了。比如小市值股票、低市净率("便宜")的股票,长期平均收益比 CAPM 预测的更高。

2.2 Fama–French 三因子(1993)

Ri−Rf=αi+βi MKT+si SMB+hi HML+εiR_i - R_f = \alpha_i + \beta_i\,\text{MKT} + s_i\,\text{SMB} + h_i\,\text{HML} + \varepsilon_i

因子 全称 构造
MKT 市场超额收益 市场组合收益 − 无风险利率
SMB Small Minus Big 小市值组合 − 大市值组合
HML High Minus Low 高账面市值比(价值股)组合 − 低账面市值比(成长股)组合

2.3 更多因子

年份 模型 / 因子 新增
1993 Jegadeesh–Titman 动量:过去 3–12 个月涨得多的股票,未来一段时间继续跑赢
1997 Carhart 四因子 三因子 + 动量
2015 Fama–French 五因子 加入盈利能力(RMW)和投资(CMA)
其他 质量、低波动、股息、短期反转…… 学术界和业界陆续提出了数以百计的"因子"(见《多重检验与因子动物园》)

2.4 因子溢价从哪里来

这是学术界争论最多的问题之一:

解释 说法 含义
风险补偿 小盘股、价值股在经济不好时跌得更惨,承担了额外风险,所以要求更高回报 溢价会长期存在
行为偏差 投资者对成长股过度乐观、对坏消息反应过度,导致定价错误 溢价可能在被广泛认知后减弱
数据挖掘 有些"因子"只是在历史数据里碰巧有效 样本外会消失(见《回测的七宗罪》)

例如价值因子在 2010 年代表现长期低迷,引发了"价值因子是否已死"的激烈讨论。


第三层:动手做一次因子回归

3.1 用模拟数据还原因子暴露

我们先"造"一个组合:已知它的真实暴露是市场 1.1、规模 0.5、价值 −0.3,每月 alpha 0.1%,再加上随机噪声。然后用回归看看能否把这些数字找回来。

import numpy as np, pandas as pd, statsmodels.api as sm
rng = np.random.default_rng(42)
n = 120  # 10 年月度数据
f = pd.DataFrame({
    "MKT": rng.normal(0.006, 0.045, n),
    "SMB": rng.normal(0.002, 0.030, n),
    "HML": rng.normal(0.003, 0.030, n),
})
true_alpha, true_beta = 0.001, {"MKT": 1.1, "SMB": 0.5, "HML": -0.3}
excess = true_alpha + sum(true_beta[k] * f[k] for k in f) + rng.normal(0, 0.02, n)

X = sm.add_constant(f)
res = sm.OLS(excess, X).fit()
print(res.params.round(3).to_dict())
print(res.tvalues.round(2).to_dict())
print("R2", round(res.rsquared, 3))

输出:

{'const': 0.002, 'MKT': 0.999, 'SMB': 0.459, 'HML': -0.375}
{'const': 0.8, 'MKT': 18.5, 'SMB': 7.39, 'HML': -6.1}
R2 0.803

3.2 怎么读这个结果

结果 解读
MKT ≈ 1.0,t = 18.5 组合对市场的暴露被准确估计(真实值 1.1,有估计误差)
SMB ≈ 0.46,HML ≈ −0.38 组合偏小盘、偏成长,和真实设定一致
R² = 0.80 80% 的收益波动可以被三个因子解释
alpha = 0.2%/月,但 t 只有 0.8 真实 alpha 是 0.1%/月,但在 10 年数据、这种噪声水平下,统计上无法与 0 区分

最后一行是最重要的教训:alpha 很难被证明。因子暴露(beta)通常估计得很准,因为因子本身波动大;而 alpha 是一个很小的常数,埋在大量噪声里。粗略地说,alpha 的 t 值随样本长度的平方根增长,一个真实但微小的 alpha,可能需要几十年的数据才能确认。

3.3 实际使用时的注意事项

res_robust = sm.OLS(excess, X).fit(cov_type="HAC", cov_kwds={"maxlags": 3})

总结

层次 要点
概念 收益 = 因子暴露 × 因子收益 + alpha + 噪声
演化 CAPM(市场)→ 三因子(规模、价值)→ 动量 → 五因子 → 因子动物园
争论 溢价来自风险补偿、行为偏差,还是数据挖掘
实操 beta 好估,alpha 难证;用稳健标准误;注意因子构造细节