第12章:局部波动率模型:Dupire公式与局部波动率曲面
聊到波动率曲面,很多人第一反应就是BS隐含波动率。但说实话,BS模型有个硬伤——它假设波动率是常数。这在实际市场中根本不成立。你想想看,同一个标的,不同行权价、不同到期日的期权,隐含波动率能差出好几个百分点。
那怎么办?学术界和业界都在想:能不能搞一个更灵活的模型,让波动率既随标的价格变,又随时间变?这就是局部波动率模型(Local Volatility Model)的出发点。
12.1 从BS到局部波动率:为什么要升级?
BS模型里,我们假设股价服从几何布朗运动:
dS = μS dt + σ S dW
这里的σ是常数。但真实市场里,波动率有明显的“微笑”和“偏斜”特征。比如指数期权,虚值看跌期权的隐含波动率通常比平值高不少。这说明什么?市场认为大跌的概率比BS模型预测的要大。
我刚开始做期权交易那会儿,就吃过这个亏。用BS模型算出来的对冲比率,在极端行情下完全失效。后来才明白,不是公式错了,是假设太理想化了。
局部波动率模型的核心思想很简单:让波动率成为标的价格S和时间t的函数,即σ(S, t)。这样就能捕捉到波动率的“微笑”特征。
12.2 Dupire公式:从期权价格反推局部波动率
1994年,Dupire发表了一篇里程碑式的论文。他证明了一个重要结论:如果市场上有足够多的欧式期权价格数据,我们可以唯一地反推出局部波动率函数。
这个公式长这样:
σ²_loc(K, T) = [∂C/∂T + (r - q)K ∂C/∂K + qC] / [½ K² ∂²C/∂K²]
其中:
- C(K, T) 是行权价为K、到期日为T的欧式看涨期权价格
- r 是无风险利率
- q 是股息率
说白了,这个公式就是在告诉你:给定一个完整的期权价格曲面,你可以算出每个(S, t)点上的瞬时波动率。
关键理解:Dupire公式的本质是“反问题”。从期权价格反推波动率,而不是像BS那样从波动率算价格。
12.3 局部波动率曲面的构建流程
在实际操作中,构建局部波动率曲面需要几个步骤。我画了一张图,帮你理清思路:
嗯,这里要注意:步骤2的插值方法选择很关键。我见过有人直接用线性插值,结果搞出来的曲面全是锯齿。我个人习惯用三次样条或者带平滑项的插值方法。
12.4 数值实现:Dupire公式的离散化
实际代码中,我们需要对Dupire公式做离散化处理。下面是一个Python实现的简化版本:
import numpy as np
from scipy.interpolate import RectBivariateSpline
def dupire_local_vol(S, T, K_grid, T_grid, price_surface, r, q):
"""
计算局部波动率
S: 当前标的价格
T: 到期时间
K_grid: 行权价网格
T_grid: 到期时间网格
price_surface: 期权价格曲面 (K x T)
"""
# 对价格曲面做二维样条插值
interp = RectBivariateSpline(K_grid, T_grid, price_surface)
# 计算偏导数
dC_dT = interp(K_grid, T_grid, dx=0, dy=1) # ∂C/∂T
dC_dK = interp(K_grid, T_grid, dx=1, dy=0) # ∂C/∂K
d2C_dK2 = interp(K_grid, T_grid, dx=2, dy=0) # ∂²C/∂K²
# Dupire公式
numerator = dC_dT + (r - q) * K_grid * dC_dK + q * price_surface
denominator = 0.5 * K_grid**2 * d2C_dK2
# 避免除零
mask = denominator > 1e-10
local_vol = np.sqrt(np.maximum(numerator / denominator, 0))
local_vol[~mask] = np.nan
return local_vol
实战技巧:代码里我加了denominator的阈值判断。为什么?因为深度虚值期权的二阶导数可能接近零,直接除会出问题。我曾经在生产环境里遇到过这个坑,结果算出来的波动率全是inf。
12.5 局部波动率模型的优缺点
任何模型都有两面性。局部波动率模型也不例外:
| 优点 | 缺点 |
|---|---|
| 完美拟合市场期权价格 | 对未来波动率的预测能力有限 |
| 模型自洽,无套利 | 计算量大,需要频繁校准 |
| 可以用于奇异期权定价 | 在极端行情下可能失效 |
| 对冲效果比BS好 | 参数稳定性差,容易过拟合 |
我记得有一次做回测,局部波动率模型在正常市场环境下表现很好。但到了2018年2月的“波动率末日”事件,模型完全崩溃了。为什么?因为局部波动率假设波动率是S和t的确定函数,但真实市场里波动率本身也是随机的。
12.6 避坑指南:实际应用中的注意事项
这些年我用局部波动率模型踩过不少坑,总结几条给你:
- 数据清洗是第一关:期权报价里经常有异常值,比如深度虚值的报价明显不合理。我曾经因为没做清洗,算出来的局部波动率曲面全是尖刺。
- 插值方法要选对:我建议用带平滑项的样条插值,或者用SVI参数化方法先拟合隐含波动率曲面,再转成价格曲面。
- 边界处理要小心:在行权价的两端,二阶导数可能不稳定。我一般会在边界处用线性外推,或者截断到合理范围。
- 定期重新校准:局部波动率曲面不是一成不变的。我习惯每天开盘前重新校准一次,如果市场波动大,盘中也会更新。
重要警告:局部波动率模型不是万能药。它最大的问题是“向前看”的能力弱。如果你要做的是波动率预测或者风险管理,建议结合随机波动率模型一起使用。
12.7 小结
局部波动率模型是连接BS模型和更复杂模型的桥梁。Dupire公式给了我们一个从市场数据反推波动率曲面的方法。虽然它有不少局限性,但在期权定价和对冲中仍然是一个重要的工具。
我个人觉得,理解局部波动率模型的关键在于:它不是一个预测模型,而是一个插值模型。它告诉你的是“当前市场隐含的瞬时波动率是多少”,而不是“未来波动率会怎么走”。
如果你刚开始接触这个领域,建议先从简单的代码实现开始,用真实市场数据跑一遍。你会发现,理论公式和实际代码之间,还有不少细节需要处理。