7. SVI模型详解:随机波动率启发模型、参数含义、拟合方法
说到波动率曲面建模,SVI模型是我个人非常喜欢的一个工具。它全称是Stochastic Volatility Inspired模型,说白了就是受随机波动率启发而诞生的参数化模型。2010年左右,Gatheral和Jacquier把它系统化之后,这玩意儿就成了业界标配。
为什么这么火?因为它参数少、拟合快、而且能很好地捕捉波动率曲面的微笑和偏斜特征。我在做期权做市商系统的时候,每天收盘后第一件事就是跑SVI拟合,嗯,这已经成了肌肉记忆。
7.1 SVI模型的数学形式
SVI模型的核心思想很简单:用一组参数来描述隐含波动率随行权价变化的形状。它的原始形式是这样的:
σ(k) = a + b * [ ρ * (k - m) + sqrt( (k - m)² + σ² ) ]
其中:
- k 是log-moneyness,即 ln(K/S)
- σ(k) 是隐含波动率
- a, b, ρ, m, σ 是五个待估参数
你可能会问,为什么是五个参数?其实每个参数都有明确的几何意义。我刚开始学的时候也觉得抽象,后来画了几次图就全明白了。
7.2 参数含义详解
| 参数 | 取值范围 | 几何意义 | 实际影响 |
|---|---|---|---|
| a | 实数 | 波动率整体水平 | 决定了曲面的"高度" |
| b | b > 0 | 微笑的倾斜程度 | 越大,两翼越陡峭 |
| ρ | -1 < ρ < 1 | 偏斜方向 | 负值表示左翼更高(常见于股指期权) |
| m | 实数 | 微笑的最低点位置 | 决定了ATM附近的位置 |
| σ | σ > 0 | 微笑的曲率半径 | 越小,微笑越尖锐 |
这里有个关键点:ρ 这个参数特别有意思。我在做美股期权时发现,SPX期权的ρ通常在-0.6到-0.8之间,说明市场对下行风险的定价远高于上行。而个股期权有时候ρ接近0,甚至为正,说明市场情绪不同。
核心洞察:SVI模型的五个参数恰好对应了波动率曲面的五个自由度——水平、斜率、曲率、位置和偏斜。这就是为什么它能用最少的参数描述最复杂的曲面。
7.3 SVI的变体
实际应用中,我们很少直接用原始SVI。我个人最常用的是rawSVI和naturalSVI两种变体。
7.3.1 rawSVI
这是最直接的参数化形式,直接对波动率进行建模。优点是参数直观,缺点是拟合时容易陷入局部最优。
7.3.2 naturalSVI
这种形式把波动率平方(即方差)作为建模对象:
w(k) = Δ + Δ' * [ ρ * (k - m) + sqrt( (k - m)² + σ² ) ]
其中w(k)是总方差(波动率平方乘以到期时间)。为什么用方差?因为方差在时间维度上是可加的,做期限结构插值时更方便。
我的经验:如果你只做单一期限的曲面,用rawSVI就够了。但如果你要做整个波动率曲面(多个期限),强烈建议用naturalSVI,因为它在期限间的插值效果要好得多。
7.4 拟合方法
好了,理论说完了,咱们来点实际的。SVI的拟合本质上是一个非线性最小二乘问题。我踩过不少坑,这里分享几个靠谱的方法。
7.4.1 两步法拟合
这是我个人最推荐的方法,稳定且高效:
- 第一步:用线性回归估计a和b的初始值
- 第二步:用Levenberg-Marquardt算法优化全部五个参数
为什么要两步走?因为直接扔给优化器,五个参数一起动,很容易跑飞。先固定ρ, m, σ,把a和b定下来,再整体微调,收敛速度快得多。
7.4.2 Python实现
import numpy as np
from scipy.optimize import least_squares
def svi_raw(k, a, b, rho, m, sigma):
"""SVI原始模型"""
return a + b * (rho * (k - m) + np.sqrt((k - m)**2 + sigma**2))
def fit_svi(k, vol, initial_guess=None):
"""拟合SVI参数"""
if initial_guess is None:
# 启发式初始值
a0 = np.mean(vol)
b0 = 0.1
rho0 = -0.5
m0 = 0.0
sigma0 = 0.1
initial_guess = [a0, b0, rho0, m0, sigma0]
def residuals(params):
a, b, rho, m, sigma = params
# 约束条件
if b <= 0 or sigma <= 0 or abs(rho) >= 1:
return 1e10 * np.ones_like(k)
return svi_raw(k, a, b, rho, m, sigma) - vol
result = least_squares(residuals, initial_guess,
method='trf',
bounds=([-np.inf, 1e-6, -0.999, -np.inf, 1e-6],
[np.inf, np.inf, 0.999, np.inf, np.inf]))
return result.x
避坑指南:我曾经在拟合时忘记加参数约束,结果b变成了负数,整个曲面形状完全反了。后来我养成了习惯——每次拟合完先画图看看形状对不对,别光看误差大小。
7.5 实战中的注意事项
做了这么多年SVI拟合,我总结了几条铁律:
- 数据清洗是第一关:远离ATM的深度价外期权,流动性差,报价经常失真。我一般只保留delta在0.1到0.9之间的数据。
- 初始值很重要:别用默认的[0, 0.1, 0, 0, 0.1],要根据数据特征来设。比如m可以设为ATM对应的log-moneyness。
- 检查残差:拟合完后看残差分布,如果有明显的系统性偏差,说明模型可能不适合当前数据。
- 时间序列一致性:相邻交易日的参数应该平滑变化,如果某天参数突然跳变,大概率是数据有问题。
7.6 知识体系总览
下面这张图是我自己整理的SVI知识框架,你可以把它当作学习路线图:
说实话,SVI模型虽然看起来简单,但真正用好它需要大量的实践。我建议你从历史数据开始,每天跑一遍拟合,观察参数的变化规律。慢慢地,你就能建立起对参数意义的直觉——看到ρ突然变大,就知道市场情绪变了;看到σ变小,就知道微笑变尖锐了。
这种直觉,是任何书本都给不了你的。