跳到主要内容

线性回归与 CAPM

直觉

模块 0 我们说收益 = Alpha + Beta×市场 + 噪音。这一节把这句话写成方程,并用**最小二乘回归(OLS)**把它估计出来——这就是著名的 CAPM。

数学原理

CAPM(资本资产定价模型):

E[Ri]Rf=αi+βi(E[Rm]Rf)E[R_i] - R_f = \alpha_i + \beta_i\,(E[R_m] - R_f)

把「超额收益」对「市场超额收益」做线性回归:

Rie=α+βRme+ε,Re=RRfR_i^e = \alpha + \beta\, R_m^e + \varepsilon,\qquad R^e = R - R_f
「人话」解释:每个量代表什么?
  • RieR_i^e:资产超过无风险利率的超额收益;
  • RmeR_m^e:市场(大盘)超额收益;
  • β\beta(斜率):资产对市场的敏感度。β>1\beta>1 比市场更猛(涨跌都放大);
  • α\alpha(截距):剔除市场影响后仍剩下的超额收益。CAPM 理论预言 α=0\alpha=0;若显著为正,就是「市场没解释掉的赚钱能力」;
  • R2R^2:市场能解释该资产收益波动的比例。

OLS 估计

对样本 (xt,yt)(x_t, y_t),斜率与截距的闭式解:

β^=Cov^(x,y)Var^(x),α^=yˉβ^xˉ\hat\beta = \frac{\widehat{\text{Cov}}(x,y)}{\widehat{\text{Var}}(x)}, \qquad \hat\alpha = \bar y - \hat\beta\,\bar x

可运行案例:从市场因子构造资产并还原 Alpha/Beta

我们用真实的 Fama-French 因子数据 ff_factors_monthly.csv:取 MKT 作为市场超额收益,再合成一个资产(β=1.3\beta=1.3、年化 α2%\alpha\approx2\%),然后用 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——你会看到 R2R^2 大幅下降、β/α\beta/\alpha 估计变差。噪音越大(特异性风险越高),回归越难精确

小结

  • CAPM:资产超额收益 = α+β×\alpha + \beta\times市场超额收益 + 噪音;
  • OLS 用斜率估 β\beta、截距估 α\alphaR2R^2 衡量市场的解释力;
  • α\alpha 显著为正 = 「市场没解释掉」的超额能力,是量化追求的目标。