CAPM 与市场 Beta
CAPM 认为,股票的预期收益就是无风险利率加上 Beta 乘以市场风险溢价。它以一些很有意思的方式错了,而理解这些错误是打好基础的关键。
CAPM 于 1964 年发表。它假设一个因子(市场)能够解释所有股票收益。现实里有几百个因子。但 CAPM 仍然是每场量化面试的必考题,因为它失败的地方,恰好揭示了哪些因子真正重要。
如果你只记住一件事:CAPM 是错的,而它出错的方式,正是你可以提取出来的 alpha。每一个持续偏离 CAPM 的现象,都是一个等待被发现的因子模型。Fama 和 French 正是把其中三个正式化之后,拿到了诺贝尔奖。
模型
资本资产定价模型认为,资产 的预期收益是:
三个组成部分,然后得出一个结论:
- ——无风险利率。视为已知。实践中通常用 3 个月期国库券收益率。
- ——市场风险溢价。市场因为你承担市场风险而额外给你的收益。历史上美国市场每年大约为 4-7%。具体估计会随着样本区间和方法的不同而大幅变化。
- ——资产对市场的敏感度。把资产收益对市场收益做回归时得到的斜率系数。
重点是:在 CAPM 下,两个 Beta 相同的股票,预期收益也相同。就这样。不存在价值、规模、动量、质量或情绪溢价,只有市场风险。
这不对。下面看看为什么。
Beta 在机械上代表什么
Beta 是资产与市场之间的协方差除以市场方差:
怎么理解:
- ——和市场一比一地变动。SPY 大致就是 1。
- ——市场涨跌幅的 1.5 倍。如果市场下跌 10%,这只股票平均预期会下跌 15%。
- ——只跟着市场一半的幅度走。防御型资产。
- ——和市场反向变动。股市崩盘时,黄金从实际表现看大致是负 Beta(严格说不完全等同于 Beta,但传导渠道是这个)。
- ——不相关。现实中不存在真正的零相关资产,但固定收益和黄金经常有较低的 Beta。
Beta 是历史斜率。它是基于过去数据、在给定条件下的平均共同变动。它不假设因果关系,也不包含任何经济机制——它只是一个回归系数。
分解总收益
CAPM 能把任何股票的实际收益做一个干净的分解:
三个组成部分:
- ——CAPM 无法解释的部分。这就是 Jensen alpha 意义下的 “alpha”。
- ——由市场敞口解释的部分。如果你持有一只高 Beta 股票,而市场在上涨,这通常是你收益的大头。
- ——残差噪声。个股特有的意外。
交易策略的“alpha”,指的是扣除 Beta × 市场这一部分之后赚到的收益。如果你的策略 ,而市场上涨 20%,那么你仅靠市场敞口就拿到了 6% 的“免费”收益——这根本不算 alpha。
用 Python 对 AAPL 和 SPY 做回归
这是标准的 CAPM 练习:提取 AAPL 和 SPY 的日收益,运行回归,取出 alpha 和 beta。
import numpy as np
import pandas as pd
import yfinance as yf
import statsmodels.api as sm
import matplotlib.pyplot as plt
# Five years of daily data
px = yf.download(["AAPL", "SPY"], start="2020-01-01", end="2024-12-31",
auto_adjust=True)["Close"]
px = px.dropna()
# Daily returns
ret = px.pct_change().dropna()
# Excess returns vs 3-month T-bill proxy (close enough for the example)
# Use 0% for simplicity — illustrative, not exact
excess_aapl = ret["AAPL"] - 0.0
excess_spy = ret["SPY"] - 0.0
# Run the regression: AAPL ~ beta * SPY + alpha
X = sm.add_constant(excess_spy) # add intercept
model = sm.OLS(excess_aapl, X).fit()
print(model.summary())
alpha = model.params["const"]
beta = model.params["SPY"]
提示词
用 yfinance 拿 AAPL 和 SPY 日线,用 statsmodels 对 AAPL 日收益对 SPY 做 OLS 回归,打印 alpha、beta 和回归摘要。
预期输出(截断):
coef std err t P>|t|
const 0.0006 0.0002 3.420 0.001
SPY 1.1834 0.0253 46.780 0.000
R-squared: 0.62
怎么读这个结果:2020-2024 年间,AAPL 的 ——平均来看,它的波动比市场大约高 18%。截距(Jensen alpha)是每天 6 个基点,年化后大约是 ——但这个结果会误导你,因为样本期包含了一轮巨大的科技股上涨和一次重大的科技股回撤。
R-squared 为 0.62,意味着 AAPL 每日收益方差的 62% 可以由 SPY 解释。剩下的 38% 是个股特有的噪声(财报、产品发布、管理层变动等)。对单只股票来说,这已经是你能得到的市场 Beta 解释度上限附近了。
现在把数据重新聚合成月收益,得到更干净的统计量:
# Monthly aggregation
monthly = (1 + ret).resample("ME").prod() - 1
X_m = sm.add_constant(monthly["SPY"])
m_model = sm.OLS(monthly["AAPL"], X_m).fit()
print(f"Monthly alpha : {m_model.params['const']*100:.2f}% / month")
print(f"Monthly beta : {m_model.params['SPY']:.2f}")
print(f"R-squared : {m_model.rsquared:.2f}")
提示词
把日收益复合成月收益,对 AAPL 和 SPY 月收益跑 OLS 回归,打印月度 alpha、beta 和 R²。
月度 Beta 大致会稳定在 1.15-1.25 附近。Alpha 的读数则会随着你截取样本的年份不同而剧烈波动。
CAPM 三个著名的失败之处
CAPM 预测,Beta 单独就能解释横截面的预期收益。有三种模式打破了这个预测,而且每一种后来都成了一个命名因子。
失败 1:价值——便宜的胜过昂贵的
账面市值比(B/M)较高的股票——也就是“价值”股票——获得的收益高于 CAPM 的预测。成长股(低 B/M)则表现落后。
相关证据:
- Basu(1977)——盈利收益率(P/E 的倒数)。
- Rosenberg、Reid、Lanstein(1985)——明确研究账面市值比。
- Fama & French(1993)——把 HML(High Minus Low)正式化为一个因子。
1963-1990 年的证据非常有力:在经过市场调整后,价值股每年跑赢成长股大约 5%。CAPM 对此没有任何预测——在 CAPM 下,因为它们的 Beta 类似,所以预期收益应该相同。
失败 2:规模——小盘股胜过大盘股
小盘股(市值低于中位数)历史上在市场调整后跑赢大盘股。Banz(1981)最早记录了这一现象;Fama & French(1993)把它做成了 SMB 因子(Small Minus Big)。
从 1970 年代到 1990 年代初,规模溢价很强。自 2008 年以来,它一直疲软甚至转负——现在小盘股赚到的收益大致就是 CAPM 隐含的水平,有时还更低。规模效应是“死了”,还是只是被套利掉了,目前仍有争论。
失败 3:动量——赢家会继续赢
过去 12 个月的收益会正向预测未来 12 个月的收益。Jegadeesh & Titman(1993)记录了这一点。CAPM 完全没有预测到它——CAPM 意味着动量应该为零。
动量是已发表金融研究中规模最大、最可靠的异常现象。它在股票、债券、货币和商品中都有效。2009 年它也曾在 3 个月内暴跌 50%,后面还会再讲到这一点。
坦白说:为什么你仍然要用它
CAPM 是错的。但还是要把它当作基准。你找到的每一个 alpha,都是 CAPM 漏掉的东西。
原因在于:CAPM 给你提供了一个基准,用来衡量“我的策略是真的产生了 alpha,还是只是获得了市场敞口再加上一点运气?”模型的用途就在这里——它不是事实真相,而是一把尺子。
如果你回测一个策略,报告 Sharpe 为 1.5,却没有和基准做比较,那你不知道自己赚的是 alpha,还是只是搭上了高 Beta 敞口的顺风车。CAPM 回归 30 秒就能给你答案。先用它,再转向更复杂的因子模型。
Beta 并不稳定
这里有个实际问题,经常没有得到足够关注:Beta 会随时间变化,而且变化很大。
# Estimate rolling 252-day beta for AAPL over 5 years
rolling_beta = ret["AAPL"].rolling(252).cov(ret["SPY"]) / ret["SPY"].rolling(252).var()
rolling_beta.plot(figsize=(11, 4), title="AAPL rolling 252-day beta on SPY (2020-2024)")
plt.axhline(1.0, color="black", lw=0.7, ls="--")
plt.ylabel("Beta")
plt.show()
提示词
用 pandas 算 252 日滚动 Beta = cov(AAPL,SPY) / var(SPY),用 matplotlib 画时间序列,加 1.0 参考线。
你会看到,平静时期 Beta 可能低于 1.0,压力时期则会上到 1.4 以上。2019 年的 Beta 可能是 0.8,到了 2022 年就可能变成 1.5。这就是 Beta 不稳定问题,也是为什么统计套利基金会在滚动 Beta、状态条件 Beta 和指数加权 Beta 估计器上投入真金白银。
三个可以照着执行的规则:
- 不要相信少于 60 个月度观测值估出来的 Beta。 日频数据可以让你用更短的样本,但会带来自相关噪声。
- 生产环境使用指数加权 Beta。 越近的观测值,权重应该越高。
- 预期危机期间 Beta 会飙升。 如果你的止损是按平静市场的 Beta 校准的,崩盘时会直接把你碾过去。
这也是单因子 CAPM 之所以被多因子模型(Fama-French、Carhart)普遍替代的原因之一——用单一因子处理随时间变化的 Beta,会进一步放大噪声。
它在整个体系中的位置
CAPM 是地板。Fama-French 三因子模型和 Carhart 四因子模型在此基础上加入了价值、规模和动量敞口。你测量完一个策略的 CAPM alpha 和 beta 后,下一个问题就是:“这个 alpha 只是价值 + 规模 + 动量敞口吗?”下一篇文章从这里接着讲。
在 Arithmion SDK 里,arithmion.factor.capm_regression() 可以针对任意股票、任意基准和任意时间窗口,返回 alpha、beta 以及残差。标准输出。真正有意思的是后面的分析。
References
- Sharpe, “Capital Asset Prices: A Theory of Market Equilibrium Under Conditions of Risk,” Journal of Finance, 1964.
- Lintner, “The Valuation of Risk Assets and the Selection of Risky Investments in Stock Portfolios and Capital Budgets,” Review of Economics and Statistics, 1965. (Independent derivation of CAPM.)
- Fama & French, “Common Risk Factors in the Returns on Stocks and Bonds,” Journal of Financial Economics, 1993.
- Grinold & Kahn, Active Portfolio Management, Ch. 3. McGraw-Hill, 2000. ISBN: 978-0-07-135638-4.
- Ang, Asset Management, Ch. 5-6. Oxford University Press, 2014. ISBN: 978-0-19-995932-3.
- Frazzini, Israel, Moskowitz, “Trading Against the Anomaly,” Journal of Financial Economics, 2018 (on beta instability and the “betting against beta” factor).