Breeden-Litzenberger 隐含风险中性密度:从期权价格反推市场预期的崩盘
期权价格里藏着市场对未来的完整分布预期,不只是一个隐含波动率数字。Breeden-Litzenberger(1978) 证明:看涨期权价格对行权价的二阶导,乘以贴现因子,就是到期日标的的风险中性密度 q(S_T)=e^{rT}·d²C/dK²。合成 BS+波动率微笑里,含微笑反推的密度偏度 −1.10(肥左尾)、P(S_T<80)=9.17% 是常数 IV 的 1.6 倍、P(S_T<70)=4.84% 是常数 IV 的 8.3 倍——微笑把崩盘概率显性搬到左尾。附完整 Python 与六类真实陷阱(高阶)。
大多数人看期权只看一个数:隐含波动率(IV)。但一个 IV 只是把整条价格曲线压成一个标量,丢掉了最值钱的信息——市场对到期日标的价格的完整概率分布预期。这个分布里,藏着市场对崩盘的定价。
结论先放这:给定同一到期日、一整排不同行权价的看涨期权价格 C(K),你不需要任何分布假设,就能把市场心中对到期日标的价格的风险中性密度 q(S_T) 直接「解」出来。Breeden-Litzenberger(1978) 证明它就是看涨期权价格对行权价的二阶导乘以贴现因子:
q(S_T = K) = e^{rT} · d²C/dK²plaintext这不是估计、不是拟合,是一个精确的数学恒等式。 合成 BS + 波动率微笑的实验里,含微笑反推出的密度偏度 −1.10(明显肥左尾),而 BS 常数波动率假设下反推的密度偏度 +0.34(对数正态、右偏)。更直接的对比:市场预期 P(S_T<80)(跌 20%)=9.17%,是常数 IV 假设的 5.74% 的 1.6 倍;P(S_T<70)(跌 30%)=4.84%,是常数 IV 的 0.58% 的 8.3 倍——波动率微笑不是曲线好看,它是市场把崩盘概率明码标价搬到了左尾。附完整 Python 与六类真实陷阱(高阶)。

一、为什么一个隐含波动率远远不够#
Black-Scholes 假设标的服从几何布朗运动,波动率是常数。这个假设的直接推论是:同一到期日、所有行权价的期权,反解出来的隐含波动率应该完全一样——画出来是一条水平线。
但 1987 年股灾之后,真实市场的 IV 曲线永远不是水平线。股指期权尤其明显:行权价越低(越是虚值看跌期权),隐含波动率越高。画出来是一条向左上翘的曲线,业界叫「波动率偏斜(skew)」或「波动率微笑(smile)」。

这条曲线的经济含义很直白:市场愿意为「保护下跌」的看跌期权付更高的价钱。翻译成分布语言就是——市场认为标的价格的真实分布,左尾比对数正态更肥。一个平值 IV 数字完全捕捉不到这件事,你必须把整条曲线的信息榨出来。
二、Breeden-Litzenberger 恒等式的直觉#
先看看涨期权的定价公式(风险中性测度下):
C(K) = e^{-rT} · E[max(S_T − K, 0)] = e^{-rT} · ∫_K^∞ (S_T − K) q(S_T) dS_Tplaintext其中 q(S_T) 就是我们想要的风险中性密度。现在对 K 求一阶导(用 Leibniz 积分法则):
dC/dK = e^{-rT} · ∫_K^∞ (−1) q(S_T) dS_T = −e^{-rT} · [1 − Q(K)]plaintext这里 Q(K) 是累积分布函数。看涨期权价格对行权价的一阶导,正比于「负的生存概率」。再求一次导:
d²C/dK² = e^{-rT} · q(K)plaintext移项就得到 Breeden-Litzenberger 恒等式:
q(K) = e^{rT} · d²C/dK²plaintext这是一个精确恒等式,不依赖任何分布假设。 只要你有一整排连续的 C(K),就能把市场的风险中性密度直接解出来。一阶导给你 CDF,二阶导给你 PDF。
期权价格对 K 是单调下降且凸的,凸性正好对应二阶导为正(密度非负):

三、用 Python 从零反推密度#
先写自包含的 Black-Scholes 看涨定价(不依赖 scipy),并构造一条左偏的波动率微笑:
import numpy as np
def norm_cdf(x):
# Abramowitz-Stegun 误差函数近似
x = np.asarray(x, dtype=float)
sign = np.sign(x)
z = np.abs(x) / np.sqrt(2.0)
t = 1.0 / (1.0 + 0.3275911 * z)
a = [0.254829592, -0.284496736, 1.421413741, -1.453152027, 1.061405429]
erf = 1.0 - (((((a[4]*t + a[3])*t) + a[2])*t + a[1])*t + a[0])*t*np.exp(-z*z)
return 0.5 * (1.0 + sign * erf)
def bs_call(S, K, r, sigma, T):
d1 = (np.log(S/K) + (r + 0.5*sigma**2)*T) / (sigma*np.sqrt(T))
d2 = d1 - sigma*np.sqrt(T)
return S*norm_cdf(d1) - K*np.exp(-r*T)*norm_cdf(d2)
S0, r, T, atm_vol = 100.0, 0.02, 0.5, 0.20
K = np.linspace(55, 150, 951) # 细行权价网格
m = np.log(K / S0) # 对数 moneyness
# 左偏微笑:低行权价 IV 更高
sig_smile = np.clip(atm_vol + 0.55*(-m) + 0.60*m**2, 0.08, 0.80)
sig_flat = np.full_like(K, atm_vol) # BS 常数 IV 对照
C_smile = bs_call(S0, K, r, sig_smile, T)
C_flat = bs_call(S0, K, r, sig_flat, T)python然后是核心的 Breeden-Litzenberger 反推——用数值二阶差分:
trapz = getattr(np, "trapezoid", np.trapz) # NumPy 2.x 兼容
def rn_density(Cvals, Kvals, r, T):
d2 = np.gradient(np.gradient(Cvals, Kvals), Kvals) # d²C/dK²
q = np.clip(np.exp(r*T) * d2, 0, None) # 密度非负
return q / trapz(q, Kvals) # 归一化
q_smile = rn_density(C_smile, K, r, T)
q_flat = rn_density(C_flat, K, r, T)python就这么几行。np.gradient 连用两次就是二阶导,乘以贴现因子、裁掉数值噪声导致的微小负值、再归一化,一条风险中性密度就出来了。
四、微笑到底把概率搬去了哪里#
把两条密度画在一起,差异一目了然:
- 常数 IV(BS 假设):反推出来的是标准对数正态密度,右偏(偏度 +0.34),左尾很薄;
- 含微笑:反推出来的密度偏度 −1.10,左尾被显著拉肥、右尾被压薄,众数向右移。
两条密度的均值几乎相同(100.88 vs 100.89,都约等于远期价格,这是无套利约束的体现),标准差也接近(13.95 vs 14.14)。差别全在形状——微笑不改变期望,它把概率质量从右尾和中心搬到了左尾。
量化这个「搬运」,看不同下跌幅度的到期概率:

| 事件 | 含微笑密度 | 常数 IV 密度 | 倍数 |
|---|---|---|---|
| P(S_T<85)(跌 15%) | 12.2% | 11.0% | 1.1× |
| P(S_T<80)(跌 20%) | 9.17% | 5.74% | 1.6× |
| P(S_T<75)(跌 25%) | 6.73% | 2.10% | 3.2× |
| P(S_T<70)(跌 30%) | 4.84% | 0.58% | 8.3× |
规律很清楚:跌幅越大,微笑与常数 IV 的分歧越夸张。 温和下跌(15%)两者差不多,但到了极端崩盘(30%),BS 常数波动率认为几乎不可能(0.58%),而市场真实定价是它的 8 倍多(4.84%)。这就是为什么用单一 ATM 波动率做尾部风险管理会系统性地低估崩盘——你用的是错的分布。
五、这东西能拿来做什么#
风险中性密度不是学术摆设,它有几个非常实在的用途:
- 尾部风险监控:从当下期权链实时反推 q(S_T),追踪
P(S_T < 0.9·S0)这类崩盘概率的时间序列。它比 VIX 更细——VIX 只是密度的二阶矩汇总,密度是完整形状。 - 事件定价拆解:财报、FOMC、大选前后,反推密度常出现双峰(bimodal),直接读出市场对「利好/利空」两种情景的概率与幅度。
- 相对价值:把风险中性密度和你自己的真实测度(P 测度)预期对比,差异就是风险溢价——如果市场把左尾定得比你认为的更肥,卖尾部保险可能有超额收益(反之则买)。
- 组合压力测试:直接用市场隐含的 q(S_T) 作为情景分布,比用历史模拟或正态假设更贴近市场当下的真实预期。
六、六类真实陷阱(高阶)#
陷阱一:离散行权价 + 报价噪声会让二阶导炸成锯齿。 真实期权链的行权价是离散的(间隔 5 或 10 点),且买卖价差、非同步报价会污染 C(K)。直接对含噪的离散 C(K) 做二阶差分,出来的密度是剧烈震荡甚至负值。实务里必须先在 IV 空间做平滑(对 IV 曲线拟合样条或 SVI 参数模型),再用平滑后的 IV 重算 C(K),最后才求二阶导。本文用解析微笑函数所以干净,真实数据没这运气。
陷阱二:负密度不是 bug,是套利违约的信号。 如果反推出来某处 q(K)<0,说明你的 C(K) 曲线违反了「蝶式无套利」约束(C(K−h)−2C(K)+C(K+h)≥0)。这时不能简单裁成 0,而应回头检查数据或用带无套利约束的拟合(如 SVI 的 no-butterfly-arbitrage 参数域)。裁 0 只是掩盖问题。
陷阱三:尾部靠外推,外推假设决定尾部概率。 交易所只挂有限行权价范围(比如 70~130),但密度的极端尾部(S_T<60 或 >150)落在挂牌范围之外。这部分只能靠外推,而外推假设(对 IV 做线性/常数/GPD 延拓)会直接决定你算出来的极端崩盘概率。报告尾部概率时必须说明外推方法,否则数字不可比。
陷阱四:这是风险中性密度,不是真实概率。 q(S_T) 是 Q 测度下的密度,它已经包含了风险溢价——市场厌恶下跌,所以给左尾定的价(隐含概率)高于真实世界(P 测度)会发生的概率。直接把 q 当「市场认为崩盘的真实概率」是错的,它是「市场愿意为对冲崩盘付的价格所隐含的概率」。要转成 P 测度需要一个定价核(pricing kernel)假设。
陷阱五:远期价格约束是校验密度的免费检查项。 无套利要求 ∫ S_T·q(S_T)dS_T = S0·e^{rT}(密度的均值等于远期价格)。本文两条密度均值都是 ~100.88 ≈ 100·e^{0.02·0.5}=100.99(微小偏差来自数值离散与截断)。每次反推完都用这个恒等式自检,均值对不上说明数据或数值有问题。
陷阱六:股息与美式期权会破坏干净的恒等式。 Breeden-Litzenberger 推导用的是欧式期权 + 无股息(或连续股息)。个股期权多是美式,且有离散股息,早行权溢价和股息缺口会让 C(K) 不再是纯欧式价格,二阶导反推的密度会带偏。指数期权(多为欧式、股息连续)是这套方法最干净的应用场景,个股要先做美式→欧式的近似修正。
七、诚实结论#
Breeden-Litzenberger 是「把期权价格的全部信息榨成一条分布」的标杆方法:看涨期权价格对行权价的二阶导乘以贴现因子,就是市场心中的风险中性密度,一个精确恒等式,不需要任何分布假设。合成实验里,波动率微笑反推的密度偏度 −1.10、P(S_T<70)=4.84%(常数 IV 的 8.3 倍),把市场对崩盘的定价显性地摊在左尾——这是任何单一隐含波动率数字都表达不出来的信息。
落到实盘,先过 IV 空间平滑、蝶式无套利约束、尾部外推方法、Q 测度≠P 测度、远期价格自检、股息与美式修正 这六关。最有用的姿势:把从期权链反推的 P(S_T < 0.9·S0) 做成时间序列日更监控——它比 VIX 更早、更细地告诉你「市场正在为多大的崩盘付钱」。
注:全文数据为自洽合成(Black-Scholes 定价 + 指定左偏波动率微笑函数,确定性网格)。所有密度、偏度、尾部概率均由文中 Python 逻辑真实计算。真实复现请用实际期权链,并对 IV 平滑、无套利约束、尾部外推与股息修正逐一做稳健性检验。