资本资产定价模型:系统性风险与贝塔
CAPM描述了预期回报与风险的关系——具体来说,贝塔如何衡量股票对市场变动的敏感性。它是现代组合理论的基石,也是理解风险模型的起点。
第 28 篇 · 共 30 篇 约 3 分钟
1964年,Sharpe、Lintner和Mossin独立推导出了资本资产定价模型(CAPM)。它描述了证券风险与预期回报之间的关系。
核心思想
在一个有许多风险资产的世界里,投资者可以通过持有组合来分散特质性风险。但无论多少分散化都无法消除系统性风险——影响整个市场的风险。
CAPM认为:任何资产的预期回报只取决于其系统性风险,以贝塔来衡量。
CAPM公式
其中:
- = 资产的预期回报
- = 无风险利率
- = 资产的贝塔
- = 市场的预期回报
- = 市场风险溢价
含义: 你获得的补偿来自两方面:
- 货币的时间价值()
- 你无法分散化的系统性风险()
贝塔:衡量系统性风险
贝塔衡量一只股票相对于整体市场的变动幅度。
- :股票与市场同步变动
- :股票变动幅度是市场的1.5倍(波动性更高)
- :股票变动幅度是市场的一半(波动性更低)
- :股票没有市场敞口
- :股票与市场反向变动(个股可能出现但罕见)
计算:
其中是股票与市场的相关系数。
证券市场线(SML)
证券市场线是CAPM的可视化表示:
在Y轴上绘制,在X轴上绘制:
- 当时,线在处截距
- 斜率 = 市场风险溢价
低估资产: 在SML上方的股票(相同贝塔下回报更高) 高估资产: 在SML下方的股票(相同贝塔下回报更低)
CAPM的局限性
CAPM优雅但有已知弱点:
1. 单因子模型: 实际回报受市场以外的因素影响(规模、价值、动量等)
2. 贝塔不稳定: 从历史数据估计的股票贝塔可能无法预测未来贝塔
3. 市场组合不可观测: 我们用股票指数作为代理,但真实市场组合包括所有风险资产
4. 假设回报正态分布: 实际回报具有厚尾和偏度
5. 忽略特质性风险: 后来的研究(Fama-French)表明特质性风险也很重要
多因子模型
Fama-French三因子模型通过添加两个因子扩展了CAPM:
- SMB(小减大): 小盘股回报减大盘股回报
- HML(高减低): 高账面市值比股票回报减低账面市值比股票回报
后来的模型添加了更多因子(动量、盈利能力、投资)。
Python实现CAPM
import numpy as np
import pandas as pd
from scipy import stats
def calculate_beta(stock_returns, market_returns):
"""
Calculate beta using covariance method.
beta = Cov(stock, market) / Var(market)
`np.cov` defaults to `ddof=1` (sample covariance, dividing by `N - 1`),
while `np.var` defaults to `ddof=0` (population, dividing by `N`). Mixing
them divides by different denominators and biases beta. Use matching `ddof`.
"""
covariance = np.cov(stock_returns, market_returns)[0, 1]
market_variance = np.var(market_returns, ddof=1)
return covariance / market_variance
def calculate_beta_ols(stock_returns, market_returns):
"""
Calculate beta using OLS regression.
R_stock = alpha + beta * R_market + epsilon
"""
slope, intercept, r_value, p_value, std_err = stats.linregress(
market_returns, stock_returns
)
return {
'beta': slope,
'alpha': intercept,
'r_squared': r_value ** 2,
'p_value': p_value,
'std_err': std_err
}
def capm_expected_return(rf, beta, market_return):
"""
Calculate expected return using CAPM.
"""
return rf + beta * (market_return - rf)
def implied_market_premium(rf, expected_return, beta):
"""
Back out the implied market risk premium from observed returns.
"""
return (expected_return - rf) / beta
def security_market_line(betas, rf, market_risk_premium):
"""
Calculate expected returns for a set of betas per the SML.
"""
return rf + np.array(betas) * market_risk_premium
def idyosyncratic_volatility(stock_returns, market_returns):
"""
Calculate idiosyncratic (residual) volatility after accounting for market.
"""
slope, intercept, _, _, _ = stats.linregress(market_returns, stock_returns)
predicted = intercept + slope * market_returns
residuals = stock_returns - predicted
return np.std(residuals)
提示词
用 numpy 和 scipy.stats 写一组 CAPM 工具函数:协方差法和 OLS 回归两种贝塔计算、CAPM 预期回报、隐含市场风险溢价、SML 曲线、特异性波动率。
为什么CAPM对量化分析师重要
尽管有局限性,CAPM仍然是基石,因为:
- 基准: CAPM的市场贝塔仍然是任何组合中首先考虑的风险因子
- 折现率: CAPM(及其多因子扩展)是我们估计DCF估值中股权成本的方式
- 风险预算: 组合风险分解通常从市场贝塔开始
- 因子投资: CAPM为因子投资打开了大门——理解系统性风险因子是构建量化策略的方式
参考文献
- Sharpe, “Capital Asset Prices.” Journal of Finance, 1964.
- Lintner, “Security Prices and Maximal Gains from Diversification.” Review of Economics and Statistics, 1965.
- Fama, French, “The Cross-Section of Expected Stock Returns.” Journal of Finance, 1992.
- Bodie, Kane, Marcus, Investments, Ch. 8-9. McGraw-Hill, 2020. ISBN: 978-1-26-057101-6.