10. 波动率曲面模型:SVI、SSVI等参数化模型
做波动率指数交易的朋友,一定对曲面不陌生。说白了,波动率曲面就是不同行权价、不同期限的隐含波动率拼出来的一张网。但问题来了——市场上报价是离散的,你不可能每个点都有数据。这时候就需要参数化模型来帮忙。
我个人习惯把这类模型分成两派:一派是纯粹为了拟合而拟合,另一派是背后有点金融逻辑的。SVI和SSVI属于后者,它们不是瞎拟合,而是抓住了波动率曲面的几个关键特征。
10.1 为什么需要参数化模型?
先聊聊痛点。我记得刚入行那会儿,做VIX期权交易,每天面对几百个合约的报价。如果直接用插值法,结果经常出现负的日历价差——这在实际交易中根本不可能存在。
参数化模型能解决三个核心问题:
- 去噪:市场报价有噪音,模型能帮你把真实信号提取出来
- 插值外推:没有报价的地方,模型能给出合理估计
- 一致性:保证无套利条件,比如日历价差不能为负
你想想看,如果模型连基本的无套利都保证不了,那用它做交易策略就是在玩火。
10.2 SVI模型:原始版本
SVI全称是Stochastic Volatility Inspired,由Gatheral在2004年提出。名字听着唬人,其实核心公式很简单:
w(k) = a + b * (ρ * (k - m) + sqrt((k - m)² + σ²))
其中:
- w(k) 是总方差(隐含波动率平方 × 到期时间)
- k 是log-moneyness,即 ln(K/F)
- a, b, ρ, m, σ 是五个待估参数
这五个参数各有各的脾气:
| 参数 | 作用 | 取值范围 |
|---|---|---|
| a | 控制曲面的整体水平 | 实数 |
| b | 控制倾斜程度(斜率) | b ≥ 0 |
| ρ | 控制左右不对称性 | |ρ| < 1 |
| m | 控制曲面的水平偏移 | 实数 |
| σ | 控制曲面的曲率(平滑度) | σ > 0 |
我在项目中遇到过一个问题:直接用原始SVI拟合短期期权(比如一周到期的),结果经常出现参数跑到边界上。后来发现,短期曲面的曲率太大,σ参数容易发散。解决办法是加个正则化项,或者改用后面要讲的SSVI。
核心要点:SVI的五个参数不是独立的。b和σ共同决定了曲面的"微笑"深度,ρ决定了左右哪边更陡。如果你发现拟合结果中b接近0,说明市场基本没有波动率微笑——这在VIX期权上很少见。
10.3 SSVI模型:更稳健的版本
SSVI是Gatheral和Jacquier在2014年提出的改进版。全称是Surface SVI,专门为了解决原始SVI在期限结构上的不一致问题。
SSVI的核心思想是:把参数和期限θ(总方差)关联起来。公式长这样:
w(k, θ) = θ/2 * [1 + ρ * φ(θ) * k + sqrt((φ(θ) * k + ρ)² + (1 - ρ²))]
其中φ(θ)是一个关于θ的函数,常见形式有:
- φ(θ) = η / θ^γ (幂律形式)
- φ(θ) = η * exp(-γ * θ) + c (指数衰减形式)
我建议新手先从幂律形式入手。为什么?因为参数少,而且物理意义明确——γ控制着微笑随期限衰减的速度,η控制着短期微笑的强度。
实战技巧:用SSVI拟合VIX期权曲面时,γ通常在0.3到0.5之间。如果γ超过0.7,说明你的数据可能有问题——要么是报价噪音太大,要么是期限结构出现了异常。
10.4 两种模型的对比
直接上对比表,一目了然:
| 维度 | SVI | SSVI |
|---|---|---|
| 参数数量 | 5个(每个期限独立) | 全局参数 + 期限函数 |
| 期限一致性 | 差,各期限独立拟合 | 好,自动保证日历价差非负 |
| 拟合速度 | 快,每个期限单独优化 | 稍慢,需要全局优化 |
| 外推能力 | 弱,远期限容易出问题 | 强,期限结构有约束 |
| 适用场景 | 单期限深度分析 | 全曲面建模 |
嗯,这里要注意:SSVI虽然好,但不是万能药。我曾经在极端行情下(比如2020年3月),SSVI的幂律形式拟合效果很差。后来换成指数衰减形式才搞定。所以别死守一种形式,要根据市场状态灵活切换。
10.5 知识体系结构图
下面这张图把本章的核心逻辑串起来了:
10.6 实际应用中的坑
讲几个我踩过的坑,希望对你有帮助:
避坑指南1:参数初始化
我曾经直接用随机初始值跑SVI拟合,结果10次有8次收敛到局部最优。后来学乖了:先用简单的线性回归估计ρ和m,再用网格搜索找b和σ的初值。这样基本一次就能收敛。
避坑指南2:期限结构断裂
用SVI单独拟合每个期限,你会发现相邻期限的参数跳来跳去。比如1个月到期的ρ是-0.6,2个月到期的ρ突然变成-0.2。这在逻辑上说不通。SSVI通过全局参数约束,能有效避免这个问题。
我的建议:如果你只做单一期限的交易(比如只交易VIX期货),用SVI就够了。但如果你要做跨期限策略(比如日历价差),必须上SSVI。别嫌麻烦,这是血的教训换来的。
10.7 代码实现思路
最后给个简单的Python伪代码,帮你理解实现流程:
# SVI拟合(单个期限)
def fit_svi(k, w):
# k: log-moneyness数组
# w: 总方差数组
def svi_func(params, k):
a, b, rho, m, sigma = params
return a + b * (rho * (k - m) + np.sqrt((k - m)**2 + sigma**2))
def loss(params):
return np.sum((svi_func(params, k) - w)**2)
# 参数约束
bounds = [(None, None), (0, None), (-0.99, 0.99),
(None, None), (1e-4, None)]
result = minimize(loss, x0=initial_guess, bounds=bounds)
return result.x
# SSVI拟合(全曲面)
def fit_ssvi(k_matrix, theta_array, w_matrix):
# k_matrix: 每个期限的log-moneyness
# theta_array: 各期限的总方差
# w_matrix: 各期限的总方差曲面
def ssvi_func(params, k, theta):
rho, eta, gamma = params
phi = eta / (theta ** gamma) # 幂律形式
return theta/2 * (1 + rho*phi*k +
np.sqrt((phi*k + rho)**2 + (1 - rho**2)))
# 全局优化所有期限
def loss(params):
total = 0
for i, theta in enumerate(theta_array):
w_pred = ssvi_func(params, k_matrix[i], theta)
total += np.sum((w_pred - w_matrix[i])**2)
return total
bounds = [(-0.99, 0.99), (0.1, 5), (0.1, 1)]
result = minimize(loss, x0=[-0.5, 1.0, 0.4], bounds=bounds)
return result.x
代码看着简单,但实际跑起来要注意:SSVI的全局优化对初始值很敏感。我一般先用SVI拟合几个关键期限,把ρ的均值作为SSVI的ρ初值,这样成功率能提高不少。
公众号:蓝海资料掘金营,微信deep3321