线性回归与 CAPM
直觉
模块 0 我们说收益 = Alpha + Beta×市场 + 噪音。这一节把这句话写成方程,并用**最小二乘回归(OLS)**把它估计出来——这就是著名的 CAPM。
数学原理
CAPM(资本资产定价模型):
把「超额收益」对「市场超额收益」做线性回归:
「人话」解释:每个量代表什么?
- :资产超过无风险利率的超额收益;
- :市场(大盘)超额收益;
- (斜率):资产对市场的敏感度。 比市场更猛(涨跌都放大);
- (截距):剔除市场影响后仍剩下的超额收益。CAPM 理论预言 ;若显著为正,就是「市场没解释掉的赚钱能力」;
- :市场能解释该资产收益波动的比例。
OLS 估计
对样本 ,斜率与截距的闭式解:
可运行案例:从市场因子构造资产并还原 Alpha/Beta
我们用真实的 Fama-French 因子数据 ff_factors_monthly.csv:取 MKT 作为市场超额收益,再合成一个资产(、年化 ),然后用 OLS 把它们估计出来,验证能否还原真值。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
ff = pd.read_csv('/data/ff_factors_monthly.csv', parse_dates=['date']).set_index('date')
mkt = ff['MKT'].values # 市场超额收益(月)
n = len(mkt)
# 合成资产: alpha(月) + beta*mkt + 噪音
beta_true, alpha_annual = 1.3, 0.02
alpha_m = alpha_annual / 12
rng = np.random.default_rng(5)
asset_excess = alpha_m + beta_true * mkt + rng.normal(0, 0.03, n)
# OLS: 一元回归 asset_excess ~ mkt
x, y = mkt, asset_excess
beta_hat = np.cov(x, y, ddof=0)[0,1] / np.var(x)
alpha_hat = y.mean() - beta_hat * x.mean()
y_hat = alpha_hat + beta_hat * x
ss_res = np.sum((y - y_hat)**2); ss_tot = np.sum((y - y.mean())**2)
r2 = 1 - ss_res / ss_tot
print(f"真值 beta={beta_true:.2f} alpha(年化)={alpha_annual:.2%}")
print(f"估计 beta={beta_hat:.3f} alpha(年化)={alpha_hat*12:.2%} R^2={r2:.3f}")
plt.figure(figsize=(7.5, 4))
plt.scatter(x, y, s=22, alpha=0.6)
xs = np.linspace(x.min(), x.max(), 50)
plt.plot(xs, alpha_hat + beta_hat*xs, color='crimson', lw=2,
label=f"OLS: beta={beta_hat:.2f}, alpha(年)={alpha_hat*12:.2%}")
plt.axhline(0, color='gray', lw=0.8); plt.axvline(0, color='gray', lw=0.8)
plt.xlabel("市场超额收益 R_m^e"); plt.ylabel("资产超额收益 R_i^e")
plt.title("CAPM 回归:斜率=Beta,截距=Alpha"); plt.legend()
plt.tight_layout(); plt.show()
动手改一改
把合成时的噪音标准差从 0.03 调大到 0.10——你会看到 大幅下降、 估计变差。噪音越大(特异性风险越高),回归越难精确。
小结
- CAPM:资产超额收益 = 市场超额收益 + 噪音;
- OLS 用斜率估 、截距估 , 衡量市场的解释力;
- 显著为正 = 「市场没解释掉」的超额能力,是量化追求的目标。