第九章:SVI模型——从原理到实战
各位同学,今天我们来聊聊SVI模型。说实话,这个模型在期权交易圈子里,几乎是做波动率曲面必学的工具。我当年刚入行时,看着一堆期权报价完全摸不着头脑,直到带我的老交易员甩给我一篇论文——"去把SVI搞明白"。嗯,那会儿可没现在这么多现成的Python库,全是手撸代码。
9.1 SVI模型到底在讲什么?
SVI的全称是Stochastic Volatility Inspired,直译过来就是"受随机波动率启发"。但你别被名字吓到,它本质上就是一个参数化公式,用来拟合隐含波动率随行权价变化的形状。
为什么需要SVI?你想想看,市场上期权报价是离散的,就那么几个行权价。但做定价、做风控时,我们需要连续完整的波动率曲面。SVI就是干这个活的——用5个参数,把一条波动率微笑曲线给"捏"出来。
核心公式:
σ(k) = a + b * (ρ * (k - m) + sqrt((k - m)² + σ²))
其中:
k = ln(K/F) 即对数行权价
a:整体水平参数
b:倾斜程度参数
ρ:左右不对称性参数(-1到1之间)
m:曲线中心位置
σ:曲率参数(控制微笑的"弯度")
这5个参数各有各的脾气。我个人习惯把a想象成"基准波动率",b是"斜率",ρ控制左右哪边更高,m是"波谷位置",σ则是"微笑的弧度"。你调过几次参数后,自然就找到感觉了。
9.2 参数拟合——最磨人的一步
理论讲完了,接下来就是实战。SVI参数拟合,说白了就是找一组参数,让模型算出来的波动率,跟市场上实际报价最接近。
我在项目中遇到过最头疼的问题:参数不收敛。明明看着曲线形状差不多,但优化算法就是死活找不到最优解。后来怎么解决的?我告诉你几个关键点:
- 初始值很重要——别随便给个0。我一般用线性回归先估个大概。
- 加约束条件——ρ必须在[-1,1]之间,σ必须大于0。否则算法会跑到奇怪的地方去。
- 目标函数选对——直接用均方误差(MSE)就行,但记得对近月合约加权大一点。
避坑指南:
我曾经遇到过一组数据,拟合出来的参数a是负数。当时我还纳闷,波动率怎么能是负的?后来才发现是数据里有个深度虚值期权的报价异常。所以记住:拟合前一定要做数据清洗,把明显异常的报价剔除掉。
9.3 Python实现——手把手教你写
好了,直接上代码。这是我常用的SVI拟合实现,经过多次实战检验,你可以直接拿去用。
import numpy as np
from scipy.optimize import minimize
def svi_model(k, a, b, rho, m, sigma):
"""SVI模型核心函数"""
return a + b * (rho * (k - m) + np.sqrt((k - m)**2 + sigma**2))
def fit_svi(strikes, forward, implied_vols):
"""拟合SVI参数"""
# 计算对数行权价
k = np.log(strikes / forward)
# 设置初始值(经验值)
a0 = np.mean(implied_vols)
b0 = 0.1
rho0 = 0.0
m0 = 0.0
sigma0 = 0.1
# 约束条件
bounds = [
(0.01, 1.0), # a
(0.01, 1.0), # b
(-0.99, 0.99), # rho
(-0.5, 0.5), # m
(0.01, 1.0) # sigma
]
def objective(params):
a, b, rho, m, sigma = params
pred = svi_model(k, a, b, rho, m, sigma)
return np.mean((pred - implied_vols)**2)
result = minimize(
objective,
[a0, b0, rho0, m0, sigma0],
bounds=bounds,
method='L-BFGS-B'
)
return result.x
# 使用示例
strikes = np.array([3.6, 3.7, 3.8, 3.9, 4.0, 4.1, 4.2])
forward = 3.9
vols = np.array([0.25, 0.23, 0.22, 0.21, 0.22, 0.24, 0.27])
params = fit_svi(strikes, forward, vols)
print(f"拟合参数: a={params[0]:.4f}, b={params[1]:.4f}, "
f"rho={params[2]:.4f}, m={params[3]:.4f}, sigma={params[4]:.4f}")
小技巧:
如果你发现拟合效果不好,可以试试先固定ρ和m,只优化a、b、σ三个参数。等这三个稳定了,再放开所有参数一起优化。这叫"分步拟合法",我在做股指期权时经常用这招。
9.4 可视化——看看拟合效果
参数拟合完了,一定要画图看看。我见过太多人只看数值结果,结果曲线形状完全不对还在那用。下面这个图展示了SVI拟合的效果:
从图上你能看到:蓝色虚线是SVI拟合出来的曲线,橙色点是市场上的实际报价。拟合效果好不好,就看这些点是不是紧贴着曲线。如果偏差太大,要么是参数没优化好,要么是数据本身有问题。
9.5 实战中的几个坑
最后,我把自己踩过的坑总结一下,你遇到了可以直接对照排查:
| 问题现象 | 可能原因 | 解决办法 |
|---|---|---|
| 参数a为负 | 数据中有异常报价 | 清洗数据,剔除异常值 |
| ρ接近±1 | 微笑形状太极端 | 检查是否数据太少,或加正则化 |
| σ特别大 | 曲线太平坦 | 尝试固定σ,先拟合其他参数 |
| 拟合不收敛 | 初始值给得太离谱 | 用线性回归估算初始值 |
嗯,SVI模型的内容就这些。它虽然只有5个参数,但用好了能解决很多实际问题。我自己的经验是:别光看理论,多动手调参数,多画图看效果。做多了,你自然就能一眼看出哪组参数靠谱、哪组参数有问题。
核心要点回顾:
- SVI用5个参数描述波动率微笑曲线
- 参数拟合的关键:好初始值 + 合理约束 + 数据清洗
- Python实现用scipy.optimize.minimize即可
- 拟合完一定要可视化验证
公众号:蓝海资料掘金营,微信deep3321