一句话版本
一只股票(或一个组合)的收益,可以拆成两部分:一部分来自它对几种共同驱动力的暴露(市场整体涨跌、小盘股相对大盘股、便宜股相对贵股……),另一部分是它独有的。这些共同驱动力就叫因子,对每个因子的敏感度叫因子暴露(beta),拆完之后剩下的、不能被因子解释的平均超额收益叫 alpha。 从 1960 年代只有一个"市场因子"的 CAPM,到 1990 年代的 Fama–French 三因子、五因子,再到动量、质量、低波动等,因子模型是现代量化投资的共同语言。
免责
本文仅为技术科普,不构成任何投资建议。文中代码使用模拟数据。
第一层:通俗理解
1.1 一锅汤的味道从哪来
一锅汤很咸,是因为放了盐、酱油,还是厨师手艺特别?如果你知道这锅汤里放了多少盐、多少酱油,就能估计出"手艺"贡献了多少。
一个基金赚了 20%:
- 如果那年大盘涨了 18%,而这个基金的股票本身就比大盘波动大,那 20% 大部分是"盐"(市场暴露);
- 如果它主要买小盘股,而那年小盘股普遍跑赢,又是一种"酱油"(规模因子暴露);
- 扣掉这些之后,剩下的才是"手艺"(alpha)。
因子模型就是把收益拆成"配料"和"手艺"的工具。
1.2 为什么这件事重要
| 用途 | 说明 |
|---|---|
| 业绩归因 | 判断一个基金经理是真有本事,还是只是押对了风格 |
| 风险管理 | 知道组合暴露在哪些因子上,就知道市场怎么变时会受伤 |
| 构建策略 | 有意识地暴露在长期有溢价的因子上("聪明贝塔") |
| 定价 | 解释为什么不同资产的预期收益不同 |
第二层:因子模型的演化
2.1 CAPM:只有一个因子
资本资产定价模型(Sharpe、Lintner 等,1960 年代)认为:
一只资产的超额收益,只取决于它对市场的暴露 。高 beta 的股票风险大,所以预期收益高。
问题:实证中,很多现象 CAPM 解释不了。比如小市值股票、低市净率("便宜")的股票,长期平均收益比 CAPM 预测的更高。
2.2 Fama–French 三因子(1993)
| 因子 | 全称 | 构造 |
|---|---|---|
| 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 实际使用时的注意事项
- 因子数据:Kenneth French 教授的网站免费提供美国及全球市场的因子收益数据,是学术研究的标准来源;
- 因子构造的细节很重要:如何定义"小盘"、多久调仓一次、是否剔除金融股,都会影响结果;
- 时变暴露:基金经理的风格会变,用滚动窗口回归观察 beta 的变化;
- 标准误:收益序列有自相关和异方差时,用 Newey–West 等稳健标准误。
res_robust = sm.OLS(excess, X).fit(cov_type="HAC", cov_kwds={"maxlags": 3})
总结
| 层次 | 要点 |
|---|---|
| 概念 | 收益 = 因子暴露 × 因子收益 + alpha + 噪声 |
| 演化 | CAPM(市场)→ 三因子(规模、价值)→ 动量 → 五因子 → 因子动物园 |
| 争论 | 溢价来自风险补偿、行为偏差,还是数据挖掘 |
| 实操 | beta 好估,alpha 难证;用稳健标准误;注意因子构造细节 |