Fama-French 三因子模型
Fama 和 French(1993)证明,另外两个因子——价值和规模——可以解释 CAPM 漏掉的大部分收益。他们的三因子模型是现代量化投资的主力模型。
如果你只学一个因子模型,就学这个。它已经是默认基准 30 年了,现在仍然有效。
原因是:它捕捉到了美国股票数据中四种最持久的收益模式里的三种:市场敞口、价值和规模。再加上动量(下一篇文章会讲),对大多数多头和多空策略来说,你就有了一个能解释平均收益横截面变动 80-90% 的模型。再往上找到的东西,才真正算新东西。
这是每一位主动管理人、对冲基金和量化策略都会拿来做绩效衡量的基准。
模型说了什么
Fama-French 三因子模型在 CAPM 的基础上又加了两个因子:
因子本身如下:
Mkt-RF(市场超额收益)
这和 CAPM 因子相同。市场投资组合(CRSP 市值加权指数)的收益减去无风险利率,代表系统性市场风险。
SMB(Small Minus Big,小盘减大盘)
做多市值最低十分位,做空市值最高十分位。“S”代表 small,“B”代表 big。下标 V/N/L 分别代表价值/中性/成长(按 B/M 划分)。结果就是小盘股收益减去大盘股收益,同时对价值/成长倾向做了一点控制。
直白地说:SMB = “做多小盘股、做空大盘股能赚到的收益”。
HML(High Minus Low,高减低)
HML 等于两个高 B/M 组合(小盘价值 + 大盘价值)的均值减去两个低 B/M 组合(小盘成长 + 大盘成长)的均值。它和 SMB 用的是同样的 6 个市值/B/M 交叉组合,不是独立的”最高十分位减最低十分位”排序。
直白地说:HML = “做多价值股、做空成长股能赚到的收益”。
SMB 和 HML 都是零成本投资组合——做多一个篮子,做空另一个篮子。所以它们是因子收益,不是原始收益。这样一来,它们就能和 Mkt-RF 因子在同一尺度上直接比较。
的解读
回归系数是因子载荷,表示股票对每个因子的敏感度。
- → 在其他条件相同的情况下,股票的波动比市场高 20%。
- → 股票的表现像一个小盘股投资组合(对 small 减 big 有正载荷)。
- → 股票的表现像一个价值投资组合。
如果你用这三个因子对 AAPL 做回归,得到 ,说明 AAPL 暴露于价值风格收益。当 HML 获得 5% 收益时,AAPL 的表现就像是从这部分敞口中拿到了 +3%,再加上它自己的 alpha。
加载 Fama-French 因子并对股票做回归
Fama-French 研究数据库发布了从 1926 年开始的月度因子收益。最简单的获取方式是 Kenneth French 的网站或 pandas-datareader。
import pandas as pd
import numpy as np
import pandas_datareader.data as web
import yfinance as yf
import statsmodels.api as sm
# Pull Fama-French 3 factors (monthly)
# Note: requires internet access to Ken French's site
ff = web.DataReader("F-F_Research_Data_Factors", "famafrench")
factors = ff[0] # monthly factors
factors.index = pd.to_datetime(factors.index, format="%Y%m")
factors = factors / 100 # convert from percent to decimal
factors = factors.rename(columns={"Mkt-RF": "MktRF"})
# Pull monthly prices for three interesting names
px = yf.download(["AAPL", "MSFT", "BRK-B"],
start="2010-01-01", end="2024-12-31",
auto_adjust=True)["Close"]
monthly_ret = px.resample("ME").last().pct_change().dropna()
# Merge with factors
data = monthly_ret.join(factors, how="inner").dropna()
results = {}
for ticker in ["AAPL", "MSFT", "BRK-B"]:
y = data[ticker] - data["RF"]
X = sm.add_constant(data[["MktRF", "SMB", "HML"]])
model = sm.OLS(y, X).fit()
results[ticker] = {
"alpha_mo": model.params["const"],
"beta_mkt": model.params["MktRF"],
"beta_smb": model.params["SMB"],
"beta_hml": model.params["HML"],
"r2": model.rsquared,
"alpha_t": model.tvalues["const"],
}
pd.set_option("display.float_format", "{:.3f}".format)
print(pd.DataFrame(results).T)
提示词
用 yfinance 拿股票月度收益,用 pandas-datareader 拿 Fama-French 三因子,用 statsmodels 做 OLS 回归,打印 alpha、beta、R²。
预期输出:
alpha_mo beta_mkt beta_smb beta_hml r2 alpha_t
AAPL 0.007 1.183 -0.236 -0.412 0.701 3.124
MSFT 0.005 1.098 -0.184 -0.298 0.683 2.541
BRK-B 0.004 0.876 0.102 0.453 0.752 1.876
怎么看这张表:
- AAPL: 每月(年化 8.4%)。HML 载荷为 -0.41(显著为负——AAPL 是成长股)。这很符合预期。Alpha 的 T 统计量是 3.1,具有统计显著性。
- MSFT:类似的画像。HML 载荷为负,alpha 中等。
- BRK-B:这是 Buffett 的公司。+0.45 的 HML 载荷确认 Berkshire Hathaway 是价值股。市场 Beta 只有 0.88,说明它的波动小于市场。对单只股票来说,0.75 的 R-squared 很高。
重点是:AAPL 基本上是成长股,BRK-B 基本上是价值股,MSFT 处于两者之间。 这个模型用每只股票三个数字,就捕捉到了它们的结构性差异。
构建这个模型的实证发现
Fama 和 French 在 1993 年的论文里记录了四个直到今天仍然成立的发现:
发现 1:价值在 1963-1990 年获得了溢价
在原始样本期(1963-1990),价值股(高 B/M)在经过市场调整后每年跑赢成长股(低 B/M)大约 5%。这是一个巨大的发现——在一项基准投资上,凭空多出半个十年的 alpha。
它还持续吗?算是吧。整个 1963-2024 年样本中,这项溢价平均每年为 2-3%,但各个子时期差异很大:
- 1963-1990:年化约 5%(最初的发现期)
- 1990-2007:年化约 3%(仍然稳健)
- 2010-2020:年化约 0%(溢价坍塌,价值策略一度确实不赚钱)
- 2022:成长股经历残酷的一年,价值股猛烈修复(“价值回归”)
2010-2020 年的横盘期部分是拥挤造成的。AQR 的价值基金、BlackRock 的价值 ETF,以及几十家量化机构都在交易同一个因子。当太多人挤进来时,溢价可以缩小到零。
发现 2:规模在 1963-1990 年获得了溢价
在原始样本里,小盘股每年大约跑赢大盘股 3-4%。自 2008 年以来,规模效应一直疲软甚至转负。2020 年代对规模因子尤其不友好。
规模溢价也可能部分是流动性不足溢价——小盘股流动性更差,你会因为买入流动性不足而获得回报。如果直接使用 Amihud 的流动性不足指标,规模因子的显著性就会消失。具体如何分解,目前仍有争议。
发现 3:单独的 Beta 无法解释横截面
在纯 CAPM 世界里,Beta 是预期收益的唯一预测变量。Fama 和 French 证明,加入 SMB 和 HML 之后,Beta 变得不显著。在 1962 年之后的数据中,Beta 与平均收益之间的横截面关系是“平坦到向下倾斜”的——这与 CAPM 的预测正好相反。
这是纯 CAPM 世界实证上的最后一击。多因子模型从此接管了分析框架。
发现 4:三个因子解释了主动管理人收益的大部分
当你用三个因子对主动共同基金收益做回归时,它们的 alpha 会大幅下降。很多“alpha 管理人”其实只是拿到了因子敞口。这一洞见推动了多因子 ETF 的革命。本节的 Carhart 文章会通过加入动量,把这件事再往前推进一步。
这个模型重要的三个原因
原因 1:风险分解——你的 Alpha 真实吗?
如果你回测一个多空策略,报告 Sharpe 为 1.4,你并不知道里面到底有什么。运行 Fama-French 回归。如果 (截距)为正且显著,并且因子载荷接近零,或者和你想要的敞口一致,那你很可能有真正的 alpha。如果 为零,但 HML 载荷为 +0.5,那你只是在搭价值因子的顺风车,不是在产生 alpha。
这是每家基金的风险负责人都会先问的问题。
原因 2:绩效归因——你到底赚了什么?
每一个需要向客户报告的机构投资者,都会把自己的收益拆解成因子贡献。如果一个管理人报告过去 5 年年化收益为 12%,客户会想知道:其中多少来自市场 Beta,多少来自价值敞口,多少来自规模,多少才是真正的能力?
Fama-French 回归会给出每个因子对应的一个答案:对每个 求和 ,就是各因子的贡献。总收益与因子贡献之和之间的差额,就是 alpha。
原因 3:对冲构建——隔离特定 Alpha
假设你有一个选股模型,相信它确实有能力,但它大量加载了价值因子(因为价值股符合模型偏好的某个“安全”指标)。你可以通过做空 HML 敞口来构建对冲组合——按照你的载荷比例做空价值股。剩下的收益就是 alpha,同时价值敞口被中和了。
这就是“市场中性”和“因子中性”多空策略的基础。没有因子分解,你根本构建不了这种策略。
坦白说,真正该学到的东西
如果你有一个“很棒”的策略,但它大量加载价值因子,先问问自己:你赚的是价值溢价,还是自己的 alpha?很多时候,答案是价值溢价。
这是因子投资里最容易被低估的一点。一个年化收益 8% 的回测看起来很棒。把它放进 Fama-French 模型。如果 每月(年化 3.6%),但 HML 载荷为 +0.5,那么你赚到的是:
- 市场 Beta 敞口——被动的、类似市场的收益。
- ,来自价值倾向。
- 再加上 3.6% 的真实 alpha。
你是在赚价值因子的溢价,外面包了一层小小的 alpha。你的优势来自因子敞口,而不是选股能力。
这也是为什么这么多学术界和专业量化投资者能跑赢散户:他们知道自己是靠哪些因子获得报酬的,也能把各个组成部分拆开。大多数散户量化策略其实是在不知不觉中做多一篮子因子,上面只薄薄地叠了一层能力。
它在整个体系中的位置
Fama-French 三因子模型通过 SMB 和 HML 扩展了 CAPM。Carhart 四因子模型在其上加入动量。Fama-French 五因子模型(2015)又加入盈利能力(RMW)和投资(CMA)。如果你在运行美国股票策略,四因子模型是合适的起点。放到国际市场或跨资产类别时,你需要使用针对具体地区的因子。
在 Arithmion SDK 里,arithmion.factor.fama_french_regression() 可以开箱即用地完成这个回归。它还支持月度/季度/年度频率,并输出标准的因子分解统计量。
References
- Fama & French, “Common Risk Factors in the Returns on Stocks and Bonds,” Journal of Financial Economics, 1993.
- Fama & French, “A Five-Factor Asset Pricing Model,” Journal of Financial Economics, 2015.
- Carhart, “On Persistence in Mutual Fund Performance,” Journal of Finance, 1997.
- Banz, “The Relationship Between Return and Market Value of Common Stocks,” Journal of Financial Economics, 1981.
- Rosenberg, Reid, Lanstein, “Persuasive Evidence of Market Inefficiency,” Journal of Portfolio Management, 1985.
- Grinold & Kahn, Active Portfolio Management, Ch. 6-7. McGraw-Hill, 2000. ISBN: 978-0-07-135638-4.
- Ang, Asset Management, Ch. 10-11. Oxford University Press, 2014. ISBN: 978-0-19-995932-3.