CAPM 是资产定价的起点,但它有一个被默认免费的东西:流动性。经典 CAPM 说,你只该为「承担市场风险」(β_M) 拿补偿,公式是
E[r_i] − r_f = β_M · (E[r_M] − r_f)plaintext翻译成人话:只有市场跌的时候你也跟着跌,这种痛苦才有人付钱给你。可现实中还有一种痛苦 CAPM 完全没算账——流动性风险:当整个市场流动性枯竭(2008、2020 年 3 月那种谁都卖不出去的时候),你的组合也恰好最缺流动性,被迫在最低点斩仓。这种「系统性缺流动性」的痛苦,CAPM 当作不存在。
Pastor 和 Stambaugh (2003) 把这件事补上了。他们加了一个流动性因子,把流动性风险也定成价:
E[r_i] − r_f = β_M · (E[r_M] − r_f) + β_L · λ_Lplaintextβ_L 是「流动性 Beta」——衡量个股收益对系统性流动性变化的敏感度;λ_L 是流动性风险的市场价格(历史数据表明它为正,即承担流动性风险有补偿)。本文用模拟把它跑成看得见的数据:流动性 Beta 五分位组合的平均年化收益单调地从 −8.3% 升到 +21.3%;加入流动性因子后,截面定价误差(平均 |alpha|)从 CAPM 的 0.126 降到 0.038,降幅 69.9%。
一、为什么市场流动性本身是一种风险因子#
先想清楚「市场流动性」和「个股流动性」的区别:
- 个股流动性:某只股票自己好不好买好卖(买卖价差、冲击成本),这是特异的;
- 市场流动性:整个系统在某一刻的「可交易程度」,所有股票共同变好或变坏——这是系统性的。
Pastor-Stambaugh 的洞见是:系统性流动性变化本身能被定价。证据来自一个简单的反向关系——
预期收益 ↑ ⟺ 流动性 ↓plaintext也即「难交易的资产,长期要给你更高的预期收益作为补偿」。在他们的模型里,这个关系不是假设而是从均衡里推出来的:当投资者的边际效用在「市场流动性差」时更高(因为那时也最难调仓),那么和「流动性差」正相关的资产,自然要付更高的期望收益。
模型框架(Fama-French 式多因子,但因子之一是流动性):
r_i,t − r_f,t = β_M,i · (r_M,t − r_f,t) + β_L,i · L_t + α_i + ε_i,tplaintext其中 L_t 是聚合流动性因子(全市场流动性的创新,零均值、但长期均值反映流动性风险价格方向),β_L,i 就是个股的流动性 Beta。
import numpy as np
def simulate(N=40, T=1500, seed=20260714, liq_gap=(700, 850)):
"""模拟:个股收益由市场Beta、流动性Beta与特异噪声共同驱动。"""
rng = np.random.default_rng(seed)
muM = 0.0
rM = rng.normal(muM, 0.010, T)
liq = np.zeros(T)
for tt in range(T):
if liq_gap[0] <= tt < liq_gap[1]:
liq[tt] = -0.0015 + rng.normal(0, 0.004) # 流动性枯竭期
else:
liq[tt] = 0.0006 + rng.normal(0, 0.004) # 常态:流动性风险有正价格
beta_mkt = rng.uniform(0.5, 1.5, N)
beta_liq = rng.uniform(-1.0, 2.0, N) # 流动性风险暴露
idio = rng.uniform(0.005, 0.012, N)
R = np.zeros((T, N))
for i in range(N):
R[:, i] = beta_mkt[i] * rM + beta_liq[i] * liq + rng.normal(0, idio[i], T)
return rM, liq, R, beta_mkt, beta_liqpython
图上那段被阴影标出的,就是模拟的「流动性枯竭期」:因子均值从正转负,全市场一起缺流动性——这正是流动性 Beta 高的股票最受伤、也最该被补偿的时候。
二、流动性风险溢价:排序组合看单调性#
最直接的检验:把股票按流动性 Beta 排序,分成五分位,看平均收益是否随 β_L 单调上升。如果流动性风险真被定价(且价格 λ_L>0),高 β_L 的组合该有更高收益。
def sort_portfolios(beta_liq, avg_ret, q=5):
order = np.argsort(beta_liq)
port = order.reshape(q, -1)
return (np.array([beta_liq[p].mean() for p in port]),
np.array([avg_ret[p].mean() * 252 for p in port]))python跑出来(N=40, T=1500):
| 组合 | 流动性 Beta | 平均年化超额收益 |
|---|---|---|
| Q1(低) | −0.614 | −8.25% |
| Q2 | 0.208 | −4.29% |
| Q3 | 0.731 | +6.41% |
| Q4 | 1.374 | +16.58% |
| Q5(高) | 1.903 | +21.29% |

干净到不像模拟:从 Q1 的 −8.3% 单调爬到 Q5 的 +21.3%,跨度近 30 个百分点。这正是流动性风险溢价的「指纹」——不是噪声,是 β_L 在定价。
三、截面风险结构:两个 Beta 不是一回事#
市场 Beta 和流动性 Beta 是两个独立的维度。一只股票可以「市场 Beta 高、流动性 Beta 低」(比如大盘蓝筹,随大盘涨跌但随时好卖),也可以反过来。把两者画成散点、用颜色标平均收益:

这张图说明:单看市场 Beta 解释不了收益——真正把颜色(收益)往上推的是纵轴(流动性 Beta)。这就是 Pastor-Stambaugh 相对 CAPM 多塞进去的那块信息。
四、定价误差:CAPM 的「伪 alpha」被流动性因子吸收#
最实用的检验:用 CAPM 给每只股票估 alpha,再用 Pastor-Stambaugh 加流动性因子再估一次,看 alpha 怎么变。逻辑是——很多 CAPM 下的「alpha」,其实是流动性风险没被定价造成的假象。一旦把流动性因子加进模型,这部分被吸收,alpha 应该大幅缩小。
def pricing_errors(R, rM, liq):
T, N = R.shape
X_capm = np.column_stack([np.ones(T), rM])
X_ps = np.column_stack([np.ones(T), rM, liq])
a_capm, a_ps = np.zeros(N), np.zeros(N)
for i in range(N):
a_capm[i] = np.linalg.lstsq(X_capm, R[:, i], rcond=None)[0][0]
a_ps[i] = np.linalg.lstsq(X_ps, R[:, i], rcond=None)[0][0]
return a_capm, a_ps
a_capm, a_ps = pricing_errors(R, rM, liq)
mae_capm = np.mean(np.abs(a_capm)) * 252
mae_ps = np.mean(np.abs(a_ps)) * 252python结果:
| 模型 | 截面平均 |alpha|(年化) | 相对 CAPM | |---|---|---| | CAPM | 0.1258 | — | | Pastor-Stambaugh | 0.0378 | ↓ 69.9% |

柱状对比清楚:CAPM 下大量股票有显著正负 alpha(蓝),加流动性因子后(绿)几乎全压到 0 附近。这意味着 CAPM 里很大一部分「超额收益能力」,其实是「承担了流动性风险却没被记账」——流动性因子一上桌,它就现原形了。
对实盘的意义:如果你用 CAPM 筛「高 alpha 股票」,很可能筛出的是「高流动性 Beta 股票」——它们的高收益是流动性风险补偿,不是你找到了被低估的宝贝。Pastor-Stambaugh 帮你把这层剥掉,看到真正的、不被流动性风险解释的剩余收益。
五、流动性风险价格 λ_L 的正负:关键的稳健性#
Pastor-Stambaugh 原论文的核心发现是 λ_L 显著为正(承担流动性风险有补偿)。但这是有条件的:只有当投资者的边际效用与流动性负相关时(缺流动性时更痛苦),λ_L 才为正。在我们的模拟里,通过让流动性因子常态均值略正(base=0.0006),就复现了正的流动性风险价格。
实务上要警惕反向情境:如果某资产在流动性好时收益高、流动性差时反而稳(负流动性 Beta),它是在给你提供流动性保险,那它的预期收益该更低——这类资产(如现金、短期国债)正是 Pastor-Stambaugh 框架里「该被负向定价」的一端。
六、五类真实陷阱#
- 流动性度量的测量误差:这是头号坑。真实世界里没有现成的「流动性因子」给你。研究者用 Amihud 非流动性、买卖价差、换手率、Roll 测度 等代理变量聚合。这些代理都有噪声、且度量误差会衰减 β_L 估计( attenuation bias),让流动性溢价被低估。落地时必须用多种流动性代理交叉验证。
- 流动性与规模的混淆:小市值股票天然流动性差。如果你不控制市值,流动性 Beta 会变成「小市值代理」,溢价里混入了规模效应。Pastor-Stambaugh 原论文专门控制了规模/账面市值比,实务上必须做多变量控制回归,别把流动性溢价和规模溢价张冠李戴。
- 流动性因子的内生性:流动性因子
L_t用「前期收益对当期收益的预测回归残差」构造(Pastor-Stambaugh 的原方法),这个构造本身依赖收益可预测性假设,且因子和收益可能互为因果。换一种流动性代理,β_L 的排序可能变化。 - 危机样本的依赖:流动性溢价在平静期很弱、在危机期极强。如果你的回测窗口恰好躲过危机,会得出「流动性风险没被定价」的假结论;相反,危机密集的样本会把溢价夸得过大。用滚动窗口看溢价是否稳健,别用一段特殊历史下结论。
- 做空限制让溢价无法套利掉:理论上如果高流动性 Beta 股票被错误定价,做空它就能套利、把溢价抹平。但真实市场做空受约束(融券难、成本高),尤其在流动性差的股票上。溢价长期存在,恰恰是因为它无法被轻松套利——这既是机会也是风险(你做空时可能自己先被挤爆)。
七、结语#
Pastor-Stambaugh liquidity-adjusted CAPM 给资产定价补上了一个被 CAPM 默认免费、却被 2008 和 2020 反复证明「极其昂贵」的东西:系统性流动性风险。
对量化研究者,记住三件事:
- 市场 Beta 和流动性 Beta 是两个独立的风险维度,后者捕捉的是「全市场一起缺流动性时你也缺」的痛苦,它长期有正的价格;
- CAPM 下的很多「alpha」是流动性风险没被记账的伪象——加一个流动性因子,一大半 alpha 现原形(本文降 69.9%);
- 流动性溢价靠做空限制才活得下来,所以它真实存在、却也是危机里最锋利的刀。
它和之前聊过的低波动异象、质量因子(QMJ)、做空 Beta(BaB) 是同一谱系:CAPM 之外的风险/摩擦,都在悄悄被定价,而识别它们的方法,就是往模型里诚实地多加一个因子。
注:本文个股收益为「市场 Beta + 流动性 Beta + 特异噪声」的自洽合成数据(流动性因子常态正均值、中段一段枯竭),用于演示 Pastor-Stambaugh 机制;真实市场的流动性须用 Amihud/价差/换手等代理构造、且与规模效应高度纠缠,落地需多代理交叉、控制规模、滚动验证并考虑做空约束。