3、波动率曲面构建(二):参数化模型(SVI、SSVI、SABR)原理与实现、曲面平滑与正则化、曲面外推与内插技巧
上一章我们聊了非参数化方法构建波动率曲面,说白了就是直接插值。但实际工作中,你会发现市场数据总有噪声,有些期限上的报价还特别稀疏。这时候,参数化模型就派上用场了。
我个人习惯把参数化模型比作「给波动率曲面穿上紧身衣」——它用少数几个参数,就能描述整个曲面的形状。今天咱们重点聊三个主流模型:SVI、SSVI 和 SABR。每个我都踩过坑,咱们边讲边避雷。
核心思路:参数化模型的核心是用一个数学函数,把隐含波动率表示为执行价格和到期时间的函数。好处是平滑、可外推、参数有经济含义。坏处是——拟合不好时,误差会系统性地偏。
3.1 SVI 模型:原始但好用
SVI(Stochastic Volatility Inspired)模型,是 Gatheral 在 2004 年提出的。它的想法很直接:用一条参数化曲线,描述某个到期日上的波动率微笑。
公式长这样:
σ_IV(k) = a + b * ( ρ * (k - m) + sqrt( (k - m)^2 + σ^2 ) )
其中 k = ln(K/F) 是货币性(log-moneyness),a、b、ρ、m、σ 是五个参数。每个参数都有直观含义:
| 参数 | 含义 | 取值范围 |
|---|---|---|
| a | 整体波动率水平 | a > 0 |
| b | 微笑的倾斜程度 | b > 0 |
| ρ | 微笑的偏度(左/右倾) | -1 < ρ < 1 |
| m | 微笑的最低点位置 | 实数 |
| σ | 微笑的曲率(平滑度) | σ > 0 |
我在项目中遇到过一个问题:直接用原始 SVI 拟合时,参数经常跑到边界上。比如 ρ 跑到 ±0.999,b 变得特别大。后来我发现,加一个简单的正则化项就能解决——把参数往合理区间拉一拉。
我的小技巧:拟合 SVI 时,先用 ATM 附近的点估算 a 和 m,再固定它们去拟合其他参数。这样收敛快得多,也不容易陷入局部最优。
3.2 SSVI 模型:把期限也加进来
SVI 只能处理单个到期日。但实际中,我们需要整个曲面。SSVI(Surface SVI)就是 Gatheral 和 Jacquier 在 2014 年提出的扩展版。
它的核心思想是:把每个到期日 T 上的 SVI 参数,用一条「期限结构」串起来。具体来说:
σ_IV(k, T) = θ_T * ( 1 + φ_T * ( ρ * k + sqrt( (k + ρ * φ_T)^2 + (1 - ρ^2) * φ_T^2 ) ) )
其中 θ_T 是 ATM 波动率水平,φ_T 是期限相关的曲率参数。SSVI 的好处是:
- 参数少:整个曲面只需要 3 个全局参数(ρ、η、γ)加上每个期限的 θ_T
- 无套利:只要参数满足一定条件,曲面天然无套利
- 可外推:对未交易的期限,可以插值 θ_T 和 φ_T
嗯,这里要注意:SSVI 的 φ_T 通常用 φ_T = η * T^(-γ) 来参数化。我试过用 η=2, γ=0.5 作为初始值,效果还不错。但如果你遇到的是加密货币期权市场——那里的期限结构特别陡,γ 可能要调到 0.8 以上。
避坑指南:我曾经在拟合 SSVI 时,发现 φ_T 在某些期限上变成负数。查了半天才发现,是数据里有个期限的报价特别少,导致 θ_T 估计偏了。解决办法:对 θ_T 做平滑后再拟合 φ_T。
3.3 SABR 模型:从动态角度出发
SABR(Stochastic Alpha Beta Rho)模型,是 Hagan 等人在 2002 年提出的。它不是一个纯粹的波动率曲面模型,而是一个随机波动率模型。但它的近似公式,可以直接用来拟合波动率微笑。
SABR 的近似公式(Hagan 2002):
σ_IV(K, F) = α / (F^(1-β)) * (1 + ... )
参数含义:
- α:波动率水平(类似 SVI 的 a)
- β:CEV 指数(0 ≤ β ≤ 1),控制 ATM 附近的形状
- ρ:价格与波动率的相关系数,控制偏度
- ν:波动率的波动率,控制曲率
我个人觉得 SABR 最大的优点是:参数有金融含义。β=0 时是正态模型,β=1 时是对数正态。我在做利率期权时,习惯用 β=0.5,因为市场数据拟合得最好。
但 SABR 有个坑:当 K 离 F 很远时,近似公式会失效。你想想看,深度虚值期权的波动率,用 SABR 算出来可能偏大 10% 以上。这时候,我建议用 Monte Carlo 校准,或者用「冻结参数」技巧。
3.4 曲面平滑与正则化
不管用哪个模型,拟合完都会遇到一个问题:参数在相邻期限上跳来跳去。比如 1 个月和 2 个月的 θ_T 差 5%,但 2 个月和 3 个月的又差 0.5%。这明显不合理。
解决办法是加正则化。我常用的两种:
- Tikhonov 正则化:在损失函数里加一项 λ * ||θ_T - θ_{T-1}||^2,让相邻期限的参数变化平滑
- 样条平滑:先拟合每个期限的参数,再用样条对参数序列做平滑
举个例子,用 Python 实现 Tikhonov 正则化:
import numpy as np
from scipy.optimize import minimize
def fit_ssvi_with_regularization(vol_surface, tenors, strikes, lambda_reg=0.1):
# vol_surface: dict, key=tenor, value=vol array
# 先拟合每个期限的 θ_T
theta_hat = []
for t in tenors:
# 用 ATM 附近的点拟合 θ_T
atm_idx = np.argmin(np.abs(strikes - forward_price))
theta_hat.append(vol_surface[t][atm_idx])
# 定义损失函数:拟合误差 + 正则化项
def loss(params):
theta = params[:len(tenors)]
phi = params[len(tenors):]
# 拟合误差
mse = 0
for i, t in enumerate(tenors):
vol_model = ssvi_vol(strikes, theta[i], phi[i], rho, eta, gamma)
mse += np.mean((vol_surface[t] - vol_model)**2)
# 正则化项:相邻 θ 的差异
reg = lambda_reg * np.sum(np.diff(theta)**2)
return mse + reg
# 优化
result = minimize(loss, x0=np.concatenate([theta_hat, phi_init]), method='L-BFGS-B')
return result.x
我的经验:λ 取 0.01 到 0.1 之间比较合适。太小了没效果,太大了会把曲面压成一条直线。你可以用交叉验证选 λ——把数据分成训练集和验证集,选验证集误差最小的 λ。
3.5 曲面外推与内插技巧
曲面建好了,但实际交易中,你经常需要某个没在市场上交易的期限或执行价。这时候就要外推或内插。
内插(Interpolation):
- 期限方向:用三次样条插值 θ_T 和 φ_T。我试过线性插值,效果太粗糙,尤其是短期端。
- 执行价方向:直接用参数化模型算。比如你要 1.5 个月的 105% 执行价,先内插出 1.5 个月的 SVI 参数,再代入公式算波动率。
外推(Extrapolation):
- 短期外推:T → 0 时,波动率应该趋于现货波动率。我习惯用 σ(T) = σ_spot + a * T 来外推,其中 a 从最近两个期限估计。
- 长期外推:T → ∞ 时,波动率趋于一个常数。可以用 σ(T) = σ_inf + b * exp(-c * T) 来拟合。
- 深度虚值外推:K 很远时,波动率应该趋于一个上限。SVI 模型本身有这个性质(因为 sqrt 项是线性的),但 SABR 没有,需要手动加一个 cap。
注意:外推时一定要检查无套利条件。我曾经在深度虚值外推时,算出来波动率比 ATM 还低,导致出现了蝶式套利机会。后来我加了一个约束:波动率关于 K 的凸性必须为正。
3.6 知识体系总览
下面这张图,是我自己总结的参数化波动率曲面建模流程。你看一眼,应该能对整个章节有个全局把握。
你看,整个流程其实就三步:选模型 → 拟合参数 → 后处理。但每一步都有细节。我刚开始做的时候,总觉得拟合完就完事了,结果曲面在期限之间扭来扭去,根本没法用。后来才明白,正则化和平滑才是真正体现功力的地方。
好了,这一章的内容就到这儿。参数化模型的好处是简洁、可解释,但坏处是——模型本身就有假设,如果市场行为变了,参数可能不再稳定。所以,实际工作中,我通常会同时跑 SVI 和 SABR,看看哪个拟合得更好,再决定用哪个。
一句话总结:SVI 适合单期限微笑拟合,SSVI 适合全曲面建模,SABR 适合有动态对冲需求的场景。选哪个,取决于你的数据质量和业务需求。