某上海私募的多空策略台,周一早会上分析师汇报:某只白酒龙头跑赢沪深300 5.2 个百分点,「显著的 alpha」。基金经理把数据敲到 Bloomberg,跑了一遍 CAPM 回归,Jensen alpha 的 t 值 1.3——「不,这只是 beta 的 1.4 倍,加上沪深300 这一年涨了 4%,你看到的 5.2% 全在 beta 解释范围内,没有 alpha 可言」。这套对话能在十秒内结束,正是因为 CAPM 给所有人一个共同的语言:任何资产的预期超额收益,在均衡下只是市场 beta 的线性函数。
L1 给了单期 MV 问题;L2 给了切线组合和一基金分离定理——所有投资者都持有同一个风险方向。这堂课把这两件事推到均衡:把切线组合换成市场组合,SML 就掉出来。然后用一个面板回归示范怎么把这件事检验到一只具体的 A 股上,最后摆出 Roll 1977 的批判和 Fama-French 1992 的实证拒绝——它们把这堂课直接桥接到 4.3.1 的多因子模型。
术语对齐表
本课新增的核心术语,与 data/glossaries/quant-glossary.yaml 标准译名一致:贝塔(beta,资产对市场组合的回归斜率)、因子模型(factor model,资产收益按公共因子暴露加特异噪声分解)、普通最小二乘(ordinary least squares, OLS,本课用以估计 Jensen alpha 与 beta)、均值方差优化(mean-variance optimization, MVO)、组合优化(portfolio optimization)、夏普比率(Sharpe ratio)、协方差矩阵(covariance matrix)。后续散文按这些译名书写。
聚合论证:从一基金分离到市场组合
L2 的一基金分离结论:每个投资者 都持有 ,其中 。把所有投资者的风险资产持有按财富 加权求和:。在零净供给(zero-net-supply)均衡下,这个聚合必须等于市值加权的市场组合 (把所有风险资产按市值排,归一化到和为 1)。
关键: 是所有投资者共享的同一个方向,所以 ——市场组合就是切线组合。
三条承重假设。下面是 Inline-code listing 中按固定顺序的三条:
homogeneous_expectations: every investor agrees on mu and Sigma
frictionless_markets: no transaction costs, no taxes, no short-sale restrictions
unrestricted_rf_borrowing_lending: every investor can lever up or hold cash at the same rate r_f
规则:all three are violated in practice — CAPM is a normative benchmark, not a literal empirical claim。CN 语境下三条都更弱:同质预期是空想(零售投资者占成交量约 75%,与机构看法不一);摩擦明显——印花税 0.05% 卖方单边、10%/20% 涨跌停、融券对零售基本封闭;借贷利率也分散——零售融资利率与机构 SHIBOR 拉开数百 bp。所以 CAPM 在国内是一个基准——拿来跟实际收益对照,看 alpha 是否显著——而不是字面上的实证模型。
推导证券市场线
把 两边乘以 (一个正标量乘矩阵),得到 与 成比例。把比例常数命名为 (均衡下的市场聚合风险厌恶),整理得
下面是 Inline-code listing 中按固定顺序的六步把 SML 拆出来:
aggregation: tangency w_tan = w_M (market portfolio) under one-fund separation + market clearing
first_order_condition: mu - r_f * ones = gamma_M * Sigma * w_M
inner_product_e_i: mu_i - r_f = gamma_M * Cov(r_i, r_M)
inner_product_w_M: mu_M - r_f = gamma_M * Var(r_M)
divide: (mu_i - r_f) / (mu_M - r_f) = Cov(r_i, r_M) / Var(r_M) = beta_i
SML: E[r_i] - r_f = beta_i * (E[r_M] - r_f)
取与单位向量 (资产 )的内积:。取与 自身的内积:。两式相除:
整理得到证券市场线:
规则:every asset's expected excess return is a linear function of its market beta only; idiosyncratic risk earns zero premium。
实务读法:截距是零(均衡下没有资产特异 alpha);斜率是 ——市场风险溢价(equity risk premium),一单位市场风险的价格。任何偏离 SML 的资产都意味着 abnormal return:在线上方为正 alpha(被低估,便宜);在线下方为负 alpha(被高估,昂贵)。
总风险分解:系统性 vs 非系统性
按 CAPM 的回归形式 ,普通最小二乘(OLS)的正交条件保证 。取方差,系统性与非系统性份额清晰分离。下面是 Inline-code listing 中按固定顺序的六条风险分解:
regression_form: r_i_t = r_f_t + beta_i * (r_M_t - r_f_t) + epsilon_i_t with Cov(r_M, epsilon_i) = 0
variance_decomp: Var(r_i) = beta_i^2 * Var(r_M) + Var(epsilon_i)
systematic_share: beta_i^2 * Var(r_M)
idiosyncratic_share: Var(epsilon_i)
R_squared: R^2 = beta_i^2 * Var(r_M) / Var(r_i)
pricing_rule: only the systematic share is priced under CAPM; idiosyncratic risk earns zero premium but contributes to total variance
规则:diversification is a free lunch — holding the market replaces unrewarded idiosyncratic variance with paid systematic variance。
CAPM 只给系统性份额 定价——预期收益就是 ,与 无关。但非系统性方差 仍然进入总组合方差,所以一个不分散的组合赚 SML 期望收益、却背更多无报酬的方差,夏普低于市场 。直观:持 5 只股票而不是 500 只,就是用同样的预期收益换 的无报酬方差;分散在 CAPM 下是免费午餐(free lunch)。
是资产 的方差被市场解释的份额。CN 大盘 A 股典型 ,因为 A 股牛熊切换时整个市场的同向共振非常强(2015 年的熔断窗口、2020 年的疫情冲击都是教科书例子);US 大盘 ,行业 / 因子结构更丰富。这一差异对分散收益有直接影响——CN 投资者从行业分散得到的边际收益更小,从加久期 / 跨境 / 跨资产得到的边际收益更大。
规范 CAPM 时间序列检验:Inline-code listing 中的七步
regression: r_i_t - r_f_t = alpha_i + beta_i * (r_M_t - r_f_t) + epsilon_i_t
OLS_fit: OLS_fit = OLS(r_i - r_f, sm.add_constant(r_M - r_f)).fit(cov_type='HAC', cov_kwds={'maxlags': 6})
alpha: alpha = OLS_fit.params[0] # Jensen's alpha, 月度超额收益单位;乘 12 年化
t_stat_alpha: t_stat_alpha = OLS_fit.tvalues[0] # Newey-West HAC at lag 6
beta: beta = OLS_fit.params[1] # 市场 beta,OLS 斜率
R_squared: R_squared = OLS_fit.rsquared # 方差中系统性份额
pass_iff: |t_stat_alpha| <= 2 # CAPM not rejected for this asset
规则:CAPM has no asset-specific alpha at equilibrium — alpha is the excess return not explained by the market beta。
实现(下面的 Fenced 代码块给出规范签名,用 statsmodels OLS + Newey-West HAC):
import pandas as pd
import statsmodels.api as sm
def capm_test(r_i: pd.Series, r_M: pd.Series, r_f: pd.Series, hac_lag: int = 6) -> dict:
# 把三个 Series 按日期索引对齐
df = pd.concat([r_i, r_M, r_f], axis=1).dropna()
df.columns = ["r_i", "r_M", "r_f"]
# 算超额收益
r_i_excess = df["r_i"] - df["r_f"]
r_M_excess = df["r_M"] - df["r_f"]
# 在常数 + 市场超额收益上 OLS;HAC SE 取 maxlags=6
X = sm.add_constant(r_M_excess)
fit = sm.OLS(r_i_excess, X).fit(cov_type="HAC", cov_kwds={"maxlags": hac_lag})
return {
"alpha": float(fit.params.iloc[0]),
"alpha_annualised": float(fit.params.iloc[0] * 12),
"alpha_t_stat": float(fit.tvalues.iloc[0]),
"alpha_p_value": float(fit.pvalues.iloc[0]),
"beta": float(fit.params.iloc[1]),
"beta_t_stat": float(fit.tvalues.iloc[1]),
"r_squared": float(fit.rsquared),
"n_obs": int(fit.nobs),
}
CAPM 时间序列检验的工作流可以总结成以下编号步骤:
- 把 、、 三个 pandas Series 按日期对齐,得到等长样本。
- 计算超额收益
r_i_excess = r_i - r_f与r_M_excess = r_M - r_f。 - 用
statsmodels.api.OLS把r_i_excess回归到sm.add_constant(r_M_excess)上,启用cov_type='HAC'、cov_kwds={'maxlags': 6}的 Newey-West HAC 标准误。 - 读取截距(Jensen's alpha,月度);乘 12 得到年化。
- 读取 alpha 的 t 值与 p 值;
|t| > 2视为对该资产的 CAPM 拒绝。 - 读取斜率系数(市场 beta)及其 t 值;读取 作为系统性份额。
- 计算总方差分解 ,核对 与 OLS 报告一致。
实务上每只单股都会在有限样本上给出非零 alpha——CAPM 的真实威力在 横截面排序后的多空组合(long-short portfolios sorted on a candidate anomaly characteristic)上才显现。这一方法论是 4.3.1 L1 的入口。
工作示例:10 只 A 股龙头
10 只沪深300 行业龙头:贵州茅台(600519,白酒)、平安银行(000001,银行)、宁德时代(300750,新能源电池)、比亚迪(002594,新能源车)、招商银行(600036,银行)、中国平安(601318,保险)、美的集团(000333,家电)、恒瑞医药(600276,医药)、伊利股份(600887,食品饮料)、隆基绿能(601012,光伏)。市场代理:沪深300 指数(可用 510300 ETF 复制)。无风险代理:1 年国债 yield 除以 12 得月度。
实务提醒:沪深300 是 CN 规范的市场代理,但只覆盖大盘——中证500 / 中证1000 在外;Roll 批判敏感的做法是改用中证全指(CSI All Share Index)作为更广义的全 A 股代理,虽然这仍只是「公开上市股权」子集,不是 Roll 心目中包含房地产、人力资本、私募股权的真正市场组合。
Formula Explorer
beta * (E_r_M - r_f)Roll 批判与到多因子模型的桥
Roll(1977,JFE,《A critique of the asset pricing theory's tests》)指出 CAPM 本质上不可检验:它的推导要求 是真正的市场组合——所有财富(股权、债券、房地产、私募股权、人力资本、外国资产,甚至耐用消费品)。实证上能拿到的代理(国内常见的沪深300、中证全指等)最好情况也只是「公开上市 A 股股权」子集。如果代理本身不在有效前沿上,任何检验都会拒绝 CAPM,即使 CAPM 对真正的市场组合成立。Stambaugh(1982)的扩展确认 CAPM 拒绝对代理选择高度敏感。
实证文献中触发多因子扩展的拒绝:规模效应(size effect,Banz 1981——小盘股回报超 CAPM 预测);价值效应(value effect,Stattman 1980、Rosenberg-Reid-Lanstein 1985、Fama-French 1992——高 B/M 股票回报超 CAPM 预测);动量效应(momentum,Jegadeesh-Titman 1993);盈利能力 / 投资效应(Novy-Marx 2013、Cooper-Gulen-Schill 2008)。Fama-French 3 因子(1993)、Carhart 4 因子(1997)、Fama-French 5 因子(2015)、Hou-Xue-Zhang q 因子(2015)就是为捕捉这些异象提出的扩展。
桥:4.3.1 L1 走 CAPM → FF3 → Carhart → FF5 → q 因子的全程。本课提供 CAPM 的均衡推导,并停在「触发多因子文献的拒绝」这一节点。
练习
Exercise
给定 10 只大盘股 2018-01 至 2023-12 月度收益(cn:600519 / 000001 / 300750 / 002594 / 600036 / 601318 / 000333 / 600276 / 600887 / 601012)、市场代理月度收益(cn:510300 沪深300 ETF)、月度无风险利率 r_f(cn:1 年国债 yield / 12)。
(i) 对每只股票 跑 capm_test(r_i, r_M, r_f, hac_lag=6);收集 DataFrame capm_results,列为 (ticker, alpha, alpha_annualised, alpha_t_stat, beta, beta_t_stat, r_squared)。
(ii) 画证券市场线:x 轴 beta,y 轴 mean(r_i - r_f)(每只股票的实证超额收益);叠加理论 SML mu_excess_SML(beta) = beta * mean(r_M - r_f) 作为过原点、斜率为 mean(r_M - r_f) 的虚线。
(iii) 找出经济上 alpha 较大(|alpha_annualised| > 0.02,即年化 2%)且统计上显著(|alpha_t_stat| > 2)的股票——这些是对该资产的 CAPM 拒绝。
(iv) 计算每只股票的方差分解:var_systematic = beta**2 * var(r_M)、var_idiosyncratic = var(r_i) - var_systematic、r_squared_check = var_systematic / var(r_i);验证 r_squared_check 与 (i) 中 OLS 的 r_squared 数值一致。
(v) 用一句话评论 10 只股票的平均 r_squared:CN 中你应当看到 mean(r_squared) in [0.4, 0.7](高跨股共振);US 对照样本会看到 mean(r_squared) in [0.2, 0.5](更丰富的行业 / 因子结构);解释这对分散收益的实务含义。
提示
r_i、r_M、r_f 三个 pandas Series 在共同的日期索引上对齐(pd.concat(..., axis=1).dropna())再喂给 capm_test,否则 OLS 会因为 NaN 或日期错位失败。提示
R^2 意味着行业内分散对降低组合方差贡献有限——加海外 / 加债券 / 加久期资产带来的边际分散收益相对更大。CAPM 在国内实务里的三个使用面
CAPM 的均衡推导是干净的,但 PM 桌上的实际用法只有三个:
第一,作为 alpha 检验的零模型。任何「我有信号」的声明,默认要先把市场 beta 这一层减掉——如果减完之后 alpha 的 t 值不显著,你这条信号还没站住。开头白酒例子就是这件事:5.2% 的超额收益经过 普通最小二乘 + Newey-West HAC 拒绝不了零(t = 1.3),所以这条 alpha 不能成立。这种「先用 CAPM 做风险归因再谈 alpha」的做法,是任何严肃 组合优化 与 均值方差优化 工作流的入口。
第二,作为风险归因的最简单 因子模型。CAPM 是单因子模型 ;Fama-French 3 因子和 5 因子是它的扩展。在国内,公募 / 私募的月度归因报告几乎一定包含「市场 beta」「市值 beta」「价值 beta」「动量 beta」四到五条,本质上是 CAPM 的多因子升级版——把 协方差矩阵 拆成 是 4.4.2 的事,但语言起点都在 L3 这条 。
第三,作为均衡先验——L4 的 Black-Litterman 模型把 CAPM 反推成一个隐含预期收益向量 ,把它当贝叶斯先验,然后把投资者的观点(view)做后验更新。这条「均衡先验」用法是连接 L3 和 L4 的桥;在没有强观点时,Black-Litterman 的解就退化为市场组合本身,夏普比率 等于市场夏普——再一次回到 L2 的切线 = L3 的市场组合这条等式。
通向 L4 与 4.3.1
CAPM 给了均衡下的「理想 alpha = 0」基线;Fama-French 1992 等实证拒绝则提示真实世界里有规模、价值等被多 因子模型 捕捉的系统性回报模式——这条路上去是 4.3.1。但即使 CAPM 推导是干净的,L1–L3 都默认 和 已知——L4 揭开盖子:实证估计的 误差大、 在 接近 时病态、无约束 均值方差优化 把噪声放大成天文般的极端权重;Ledoit-Wolf 收缩、Black-Litterman、resampled efficient frontier 就是修复这件事的工具箱。下一课走这条修复线。