跳到正文

局部波动率:Dupire 公式与前向方差

从期权价格曲面反解出唯一的局部波动率函数:Dupire 公式的推导、蝶式分母的数值陷阱、Andreasen-Huge 校准,以及这个模型在哪些问题上会骗你。

第 5 篇 · 共 12 篇 约 11 分钟

1994 年,Dupire 和 Derman-Kani 各自独立发现了同一件事:给定一张完整的隐含波动率曲面,存在唯一一个函数 σ(S,t)\sigma(S, t),使得模型 dSt=rSt dt+σ(St,t)St dWt\text{d}S_t = r S_t \, dt + \sigma(S_t, t) S_t \, dW_t 为每一个欧式期权给出与市场完全一致的价格。波动率不再是常数,也不是一个独立的随机状态——它是现货价格和时间的确定性函数,而这个函数可以直接从市场报价里算出来。

这个结论值得停下来想一想。隐含波动率微笑本来是 Black-Scholes 假设失败的证据,现在它反过来变成了输入:整张微笑、连同它的期限结构,都被一个单因子扩散精确吸收。代价我们后面再算——先看这台机器是怎么搭起来的。

前向 PDE

从 Black-Scholes PDE 出发,把常数扩散系数换成 σ(S,t)\sigma(S, t):

∂V∂t+12σ2(S,t)S2∂2V∂S2+rS∂V∂S−rV=0\frac{\partial V}{\partial t} + \frac{1}{2}\sigma^2(S, t) S^2 \frac{\partial^2 V}{\partial S^2} + r S \frac{\partial V}{\partial S} - r V = 0

这是一个”向后”的方程:固定合约 (K,T)(K, T),沿状态 (S,t)(S, t) 求解。问题是市场数据的形状正好相反——现货 S0S_0 只有一个,而行使价和期限有几百个。我们观察到的是 (K,T)(K, T) 空间上的一片价格 V(S0,K,T)V(S_0, K, T),要恢复的是 σ(S,t)\sigma(S, t)。用向后方程,每个 (K,T)(K, T) 都得单独解一遍,而且解不出反问题。

Dupire 的关键一步是换方向:把看涨价格看成 (K,T)(K, T) 的函数。令 C(K,T)C(K, T) 是未折现的看涨价格(即时刻 00 为到期 TT、行使价 KK 的欧式看涨支付的价格,其余一切固定)。那么 CC 满足一个前向方程:

∂C∂T=12σloc2(K,T)K2∂2C∂K2+rK∂C∂K\frac{\partial C}{\partial T} = \frac{1}{2}\sigma^2_{\text{loc}}(K, T) K^2 \frac{\partial^2 C}{\partial K^2} + r K \frac{\partial C}{\partial K}

结构上这就是局部 vol 过程的前向 Kolmogorov / Fokker-Planck 方程,只是变量从密度换成了看涨价格:与向后 PDE 相比,时间方向反了,SS 的位置被 KK 占了。方向一换,整张市场曲面变成了同一个方程的解——一次求解覆盖所有 (K,T)(K, T),反问题也随之打开。

前向方程的起始条件就是收益本身:

C(K,T)=max⁡(S−K,0) 当 T→T0C(K, T) = \max(S - K, 0) \text{ 当 } T \to T_0

(T0T_0 是今天;严格说,T=0T = 0 处 C(K,0)=(S0−K)+C(K, 0) = (S_0 - K)^+,前向方程从这里向后面的期限推进。)选对了 σloc\sigma_{\text{loc}},解出来的 C(K,T)C(K, T) 复现整张市场曲面。

Dupire 公式

既然市场已经把 C(K,T)C(K, T) 告诉我们了,前向方程里唯一的未知数就是 σloc2\sigma^2_{\text{loc}}。把它解出来:

σloc2(K,T)=∂C∂T+rK∂C∂K12K2∂2C∂K2\sigma^2_{\text{loc}}(K, T) = \frac{\frac{\partial C}{\partial T} + r K \frac{\partial C}{\partial K}}{\frac{1}{2} K^2 \frac{\partial^2 C}{\partial K^2}}

这就是 Dupire 公式。右边只有市场曲面的导数,没有任何模型参数——分子是一阶导,分母是二阶导,代入即得局部波动率。

每个导数都对应一个可交易的期权组合,这不是巧合,而是无套利的具体形态。∂C/∂T\partial C/\partial T 是日历价差:同一行使价、相邻期限的价格差。−∂C/∂K-\partial C/\partial K 是无限窄看涨价差的价格,也就是数字期权。∂2C/∂K2\partial^2 C/\partial K^2 是无限窄蝶式价差的价格极限——它正比于 KK 处的风险中性密度,所以必须非负,否则曲面里就有蝶式套利。

市场数据是离散的,导数用有限差分近似:

∂C∂K≈C(K+h)−C(K−h)2h\frac{\partial C}{\partial K} \approx \frac{C(K + h) - C(K - h)}{2h} ∂2C∂K2≈C(K+h)−2C(K)+C(K−h)h2\frac{\partial^2 C}{\partial K^2} \approx \frac{C(K + h) - 2C(K) + C(K - h)}{h^2} ∂C∂T≈C(T+Δ)−C(T)Δ\frac{\partial C}{\partial T} \approx \frac{C(T + \Delta) - C(T)}{\Delta}

分母就是蝶式的价值。它一小、一负,数值就崩——这是整个方法的软肋,值得单独算一遍给你看。

分母有多脆弱:一个算例

取 ATM 附近的 SPX,S=4500S = 4500,r=0.05r = 0.05,红利率 1.8%,σ=0.20\sigma = 0.20,T=0.25T = 0.25,行使价间距 45 点(1%)。二阶导的中心差分:

∂2C∂K2∣K0≈C(K0+h)−2C(K0)+C(K0−h)h2\frac{\partial^2 C}{\partial K^2}\bigg|_{K_0} \approx \frac{C(K_0 + h) - 2C(K_0) + C(K_0 - h)}{h^2}

Black-Scholes 给出的三个价格(忽略偏度):

C(4455)≈232.1,C(4500)≈207.7,C(4545)≈185.0C(4455) \approx 232.1, \quad C(4500) \approx 207.7, \quad C(4545) \approx 185.0

分子:232.1−415.4+185.0≈1.8232.1 - 415.4 + 185.0 \approx 1.8。分母:452=202545^2 = 2025。结果 1.8/2025≈0.00091.8/2025 \approx 0.0009——这正是该点的风险中性密度,跟解析值对得上。

注意发生了什么:三个 200 上下的价格,相减之后只剩 1.8。现在放一点现实进来。假设每个期权的买卖价差是 1 个指数点,中间价的不确定性约 ±0.5\pm 0.5 点。分子是系数为 (1,−2,1)(1, -2, 1) 的组合,独立误差下它的标准差约 6×0.5≈1.2\sqrt{6} \times 0.5 \approx 1.2——而真值只有 1.8。报价噪声和信号同一个量级,直接差分算出来的密度误差可以到百分之几十,平方后进入 σloc2\sigma^2_{\text{loc}} 还会再放大。

所以没有人在生产里对原始报价直接差分。先把数据拟合成光滑函数(三次样条、核平滑,或下面的 Andreasen-Huge),再解析求导。

校准:从报价到曲面

流程本身不长,每一步都有讲究:

  1. 预处理市场数据。买卖价转中间价,插值缺失的行使价,跨期限平滑。IV、跨式价、蝶式价各有各的插值约定,混用会引入伪套利。
  2. 数值求导。用上面的中心差分,或者先做样条拟合再解析求导——KK 方向的二阶导噪声最大,原因刚才算过了。
  3. 逐点求值 Dupire 公式,得到每个 (K,T)(K, T) 的 σloc2\sigma_{\text{loc}}^2。
  4. 检查正性。σloc2\sigma_{\text{loc}}^2 必须处处非负,负值说明平滑后的曲面本身有套利。
  5. 外推。深度虚值两翼报价稀疏,局部 vol 在低行使价方向可能爆炸,标准做法是在某个范围外取边界值截断。

一个演示量级的实现:

import numpy as np

def local_vol_dupire(C, K_grid, T_grid, r):
    K, T = np.meshgrid(K_grid, T_grid, indexing='ij')
    Kp, Km = K + 1e-6, K - 1e-6
    dC_dK  = (np.interp(Kp, K_grid, C) - np.interp(Km, K_grid, C)) / 2e-6
    d2C_dK2 = (np.interp(Kp, K_grid, C) - 2*C + np.interp(Km, K_grid, C)) / 1e-12
    Tp = T + 1e-6
    dC_dT = (np.interp(Tp, T_grid.ravel(), C.ravel()) - C) / 1e-6  # 简单前向差分
    sigma2 = (dC_dT + r * K * dC_dK) / (0.5 * K**2 * d2C_dK2)
    sigma2 = np.maximum(sigma2, 0.0)
    return np.sqrt(sigma2)

这段代码只演示公式结构,别拿它对付真实报价——理由就是上面的噪声算术。生产实现走无套利插值,代表就是 Andreasen-Huge。

Andreasen-Huge:不求导的校准

Andreasen 和 Huge(2011)的思路是绕开显式求导:不从连续公式出发,而是在一个与市场报价对齐的网格上(每个报价行使价一列、每个报价到期一行)直接解离散的 Dupire 方程:

Ci,j+1=Ci,j+ΔT⋅[12σi,j2Ki2⋅δ2C/δK2+rKi⋅δC/δK]C_{i,j+1} = C_{i,j} + \Delta T \cdot \left[\frac{1}{2}\sigma^2_{i,j} K_i^2 \cdot \delta^2 C / \delta K^2 + r K_i \cdot \delta C / \delta K\right]

反解出每个网格点的 σi,j2\sigma^2_{i,j}。二阶导从头到尾不单独成形,只以离散格式出现在方程里;离散化本身的结构保证了输出曲面无套利、正性成立。这比数值求导稳健得多,商业系统里的生产级局部 vol 基本都是这一族方法。

顺带说清一个理论问题:为什么每张平滑无套利曲面都对应唯一的局部 vol 函数?因为前向方程有唯一解。微笑是终值分布的状态价格,编码了扩散沿路径的累积效应;前向方程把这个累积反演回去,恢复出的就是那个马尔可夫扩散。局部 vol 模型不是被”假设”出来的,是从市场数据里被重建出来的。

拿到曲面之后

有了 σloc(S,t)\sigma_{\text{loc}}(S, t),任何欧式收益的定价都归结为解一个系数已知的 PDE:

∂V∂t+12σloc2(S,t)S2∂2V∂S2+rS∂V∂S−rV=0\frac{\partial V}{\partial t} + \frac{1}{2}\sigma^2_{\text{loc}}(S, t) S^2 \frac{\partial^2 V}{\partial S^2} + r S \frac{\partial V}{\partial S} - r V = 0

有限差分、有限元、时变波动率的树,都行。路径依赖收益则直接模拟 SDE:

dSt=rSt dt+σloc(St,t)St dWtdS_t = r S_t \, dt + \sigma_{\text{loc}}(S_t, t) S_t \, dW_t

微笑和微笑的期限结构自动进入每一条路径——这就是”单因子局部 vol”的卖点:一个因子,整张曲面自洽。

生产流水线大致是:预处理报价;用 Andreasen-Huge 在覆盖所有报价的网格上(比如 60 个行使价 × 30 个期限)解出 σloc\sigma_{\text{loc}};对 S<0.5FS < 0.5F、S>1.5FS > 1.5F 以及极短、极长期限取边界值截断外推;架一个双线性或双三次的 2D 插值器;然后蒙特卡洛用 Euler 或 Milstein 推进,SS 接近 0 时收细时间步:

dSt=rStdt+σloc(St,t)StdWtdS_t = r S_t dt + \sigma_{\text{loc}}(S_t, t) S_t dW_t

最后一步永远是验证:拿一组参考欧式期权重新定价,和输入曲面比,应该一致到数值精度。不一致就是流水线里有 bug,不是模型问题。

一个具体的曲面长什么样

取 SPX,S=4500S = 4500,r=0.05r = 0.05,红利率 1.8%。ATM 隐含波动率:30 天 16%,90 天 17%,1 年 18%。偏斜略负:30 天 25-delta 看跌 19.5%,25-delta 看涨 17%。校准出的局部 vol 曲面大致是:

  • S=4500S = 4500、T=0.25T = 0.25 处 ATM 局部 vol ≈ 17%——注意它高于 30 天 ATM 的 16%,因为局部 vol 是前向瞬时量,期限结构上行时它跑在隐含前面。
  • S=4500S = 4500、T=1.0T = 1.0 处 ≈ 18.5%,同样略高于 1 年隐含的 18%。
  • S=4000S = 4000、T=0.25T = 0.25 处 ≈ 24%:左翼被深度虚值看跌的高 IV 抬起来,而且比隐含偏斜本身更陡——隐含 vol 是局部 vol 沿路径的某种平均,平均要达到 19.5%,低位的局部值就得更高。
  • S=5000S = 5000、T=0.25T = 0.25 处 ≈ 14%,右翼镜像地低于隐含。

这些值按构造精确复现所有市场报价。校准失败的方式也都认得出来:某个角落 σloc2\sigma^2_{\text{loc}} 为负(曲面有套利)、两翼在 S→0S \to 0 方向爆炸(外推没截断)、深度虚值处 ∂2C/∂K2→0\partial^2 C/\partial K^2 \to 0 让公式打出离谱的值(翼部报价太稀)。还有一条纪律:用校准到 1 年数据的曲面给 10 年期权定价是不行的,重新校准。理论是干净的,生产系统靠的是错误处理。

它错在哪

按构造,局部 vol 只对欧式期权”完全正确”。一旦产品依赖微笑将来怎么动,它就开始给错误答案。股票指数上有三个著名的偏差,而它们其实是同一件事的三个投影:

前向微笑太平。在校准到典型负偏斜曲面的局部 vol 模型里,远期起始的微笑随起始日推后而变平;经验上,市场的前向微笑基本保持和今天的现货微笑一样陡(Bergomi, 2008)。这就是定价 cliquet 和远期起始期权时著名的前向微笑问题——这类产品对前向偏斜和前向凸性的敞口被系统性算错,偏差可以到两位数百分比的量级,方向取决于产品结构吃哪一边。

现货-波动率相关被钉死在 −1-1。局部 vol 里 σ\sigma 是 SS 的确定性函数,瞬时相关的绝对值恒为 1;负偏斜曲面下就是 SS 跌、vol 升,相关 −1-1。经验上这个相关是负的但不完全,Heston 类校准通常给出 −0.7-0.7 上下的量级。确定性关联和随机关联是不同的现象,对冲比率会因此不同。

没有独立的波动率风险。上面两条的根源:模型里根本没有第二个随机源。vol 不会在 SS 不动时自己动,而现实中它会。

这三条正是随机 vol 模型(Heston、SABR)和前向方差模型(Bergomi)存在的理由。下一篇讲 Heston,就是从”给波动率一个自己的随机源”开始的。

前向方差

有一个量把局部 vol 和方差互换那一族工具连起来。定义前向方差为期望累积方差对期限的导数:

ξ(T)=∂∂T E[∫0Tσloc2(Su,u) du]=E[σloc2(ST,T)]\xi(T) = \frac{\partial}{\partial T}\, \mathbb{E}\left[\int_0^T \sigma^2_{\text{loc}}(S_u, u) \, du\right] = \mathbb{E}\left[\sigma^2_{\text{loc}}(S_T, T)\right]

它是模型对”时刻 TT 附近的瞬时方差”的今日预测。累积起来就是方差互换的公平执行价:

E[∫0Tσloc2(Su,u) du]=∫0Tξ(u) du=T⋅Kvar(T)\mathbb{E}\left[\int_0^T \sigma^2_{\text{loc}}(S_u, u) \, du\right] = \int_0^T \xi(u)\, du = T \cdot K_{\text{var}}(T)

而 KvarK_{\text{var}} 有一个不依赖任何模型的表达。按 Carr-Madan 公式(方差互换那篇文章会完整推导),方差互换的公平执行价可以直接从期权价格积分出来:

Kvar=2T∫0S0P(K)−(S0−K)+K2dK+2T∫S0∞C(K)−(K−S0)+K2dKK_{\text{var}} = \frac{2}{T} \int_0^{S_0} \frac{P(K) - (S_0 - K)^+}{K^2} dK + \frac{2}{T} \int_{S_0}^{\infty} \frac{C(K) - (K - S_0)^+}{K^2} dK

这里有一个值得记住的一致性:只要路径连续(没有跳跃),方差互换执行价由香草曲面唯一决定——所以精确拟合曲面的局部 vol 模型,自动复现模型无关的 KvarK_{\text{var}}。这不是巧合,是”曲面决定终值分布、终值分布决定对数合约价格”的直接推论。分歧出现在别处:有跳跃时复制公式本身失效;更重要的是,波动率互换、VIX 期权这类对前向方差怎么动敏感的产品,局部 vol 给出的动态是错的——前向方差曲线在局部 vol 里是确定性的,而市场里它自己会波动。静态的量对,动态的量错,这个模式贯穿局部 vol 的一切。

怎么用它

知道了缺陷,为什么各家的台还在天天跑局部 vol?因为它有三样别的模型给不了的东西。第一,它是唯一精确拟合所有报价欧式期权的模型——随机 vol 模型只有几个参数,市场有几百个行使价,精确拟合在数学上就做不到。第二,校准集上的 mark-to-market 误差是零(买卖价差以内),账面自洽。第三,对着曲面做 delta 和 gamma 对冲有可信的参照点。

所以正确的用法是把它当作校准的、确定性的参考点:日常欧式定价用它;奇异产品先用它出一个基准价,再用随机 vol 模型量出”微笑动态”值多少;当局部 vol 价格和市场成交价不一致时,那个差就是信息——要么是机会,要么是你的曲面有问题。近年不少团队干脆把隐含波动率曲面本身当作状态量看待:局部 vol、随机 vol、SABR、前向方差曲线,是同一组市场信念的不同表示,各自照亮不同的侧面。当账簿出现交易员解释不了的 mark-to-market P&L,答案往往是:曲面自己动了,而你的模型只会重新校准、不会描述这种移动。修法是换一个有微笑动态的模型,不是把曲面再拟合一遍。

局部 vol 描述的是”市场现在信什么”;随机 vol 描述的是”这个信念会怎么变”。两个都要有。


阅读清单。 Hull, Options, Futures, and Other Derivatives, 第 10 版(2018)中关于波动率微笑与局部波动率的章节。Wilmott, Paul Wilmott on Quantitative Finance, 第 2 版(2007)对前向 PDE 和 Dupire 推导的展开。Dupire, “Pricing with a Smile,” Risk (1994)。Gatheral, The Volatility Surface (2006)。Andreasen & Huge, “Volatility Interpolation,” Risk (2011)关于无套利局部 vol 校准。