4. 波动率曲面:波动率微笑与偏斜、曲面构建(SVI/SSVI模型)、曲面插值与平滑
各位同学,欢迎来到第四章。
前面几章我们聊了BSM模型,聊了希腊字母。但有个问题一直绕不开——真实的期权市场,波动率并不是常数。你去看盘,同样到期日、不同行权价的期权,隐含波动率往往不一样。这就是我们常说的波动率微笑和偏斜。
我个人习惯把波动率曲面看作是期权交易的「地图」。没有这张图,你根本不知道哪里贵、哪里便宜。今天我们就来手把手把这张地图画出来。
4.1 波动率微笑与偏斜
先说说这两个概念的区别。
- 波动率微笑:两端翘起,中间低。像一张笑脸。常见于外汇期权市场。
- 波动率偏斜:一边高一边低。通常是低行权价(虚值看跌)的IV更高。常见于股票指数期权。
为什么会这样?说白了,市场参与者对尾部风险的担忧不一样。股票市场大家更怕暴跌,所以虚值看跌期权被买贵了。外汇市场呢?两边都有可能,所以对称微笑。
核心要点:波动率曲面 = 不同到期日 × 不同行权价上的隐含波动率集合。
我记得刚入行那会儿,有个老交易员跟我说:「小伙子,别只看一个IV。你得看整个曲面。」当时我不太理解。后来自己做回测,发现只用一个IV去定价,策略表现时好时坏。嗯,从那以后我就老老实实开始研究曲面了。
4.2 曲面构建:SVI模型
构建曲面,说白了就是找一条曲线去拟合不同行权价上的IV。最经典的方法之一就是SVI(Stochastic Volatility Inspired)模型。
SVI模型由Gatheral提出,公式长这样:
w(k) = a + b * ( ρ * (k - m) + sqrt( (k - m)^2 + σ^2 ) )
其中:
w(k):总方差(IV² × T)k:对数行权价(ln(K/S))a, b, ρ, m, σ:五个待估参数
这五个参数各有各的脾气:
| 参数 | 含义 | 取值范围 |
|---|---|---|
| a | 整体水平 | 实数 |
| b | 倾斜程度 | ≥ 0 |
| ρ | 偏斜方向 | [-1, 1] |
| m | 微笑中心 | 实数 |
| σ | 曲率 | ≥ 0 |
你想想看,五个参数去拟合一条曲线,自由度其实挺高的。但这也意味着容易过拟合。我建议你在实际使用时,对参数加一些约束,比如让 b 和 σ 不要太大。
小技巧:SVI的参数初始化很关键。我一般用ATM附近的IV去估计 a 和 m,然后用两端的数据去猜 ρ 和 b。别上来就随机初始化,容易掉进局部最优。
4.3 SSVI:更稳定的版本
SVI有个问题——不同到期日之间的参数不连续。你今天拟合1个月到期的,明天拟合3个月到期的,参数可能跳来跳去。这就引出了SSVI(Surface SVI)。
SSVI的核心思想是:把到期日也纳入模型。它假设:
w(k, t) = θ_t / 2 * ( 1 + ρ * φ_t * k + sqrt( (φ_t * k + ρ)^2 + (1 - ρ^2) ) )
其中 θ_t 是ATM总方差,φ_t 是倾斜参数随到期日的变化函数。
这样做的好处是:整个曲面用一个统一的公式描述。参数更少,更稳定。
我曾经在实盘项目中用过SSVI。当时需要实时更新曲面,SVI每根期限单独拟合,参数跳得厉害。换成SSVI后,曲面平滑多了,交易员也愿意用。
注意:SSVI虽然稳定,但也不是万能的。在极端行权价(比如深度虚值)上,拟合效果可能不如SVI。你需要根据数据覆盖范围做取舍。
4.4 曲面插值与平滑
模型拟合完了,但市场数据是离散的。你只有几个到期日、几个行权价。怎么得到任意时刻、任意行权价的IV?这就靠插值了。
常用的方法有:
- 线性插值:简单粗暴,但导数不连续。做对冲时会不舒服。
- 样条插值:三次样条是标配。平滑性好,但要注意边界条件。
- 双线性插值:在到期日和行权价两个维度上分别插值。适合快速计算。
我个人更推荐三次样条 + 单调性约束。为什么?因为期权价格对行权价应该是凸的,如果插值破坏了凸性,可能会出现套利机会。嗯,这在实际交易中是不能接受的。
平滑呢?市场数据总有噪声。你直接拟合,曲线可能弯弯曲曲。这时候可以加一个正则化项,比如惩罚曲率的二阶导数。说白了就是让曲线别太「浪」。
# 一个简单的正则化拟合示例
import numpy as np
from scipy.optimize import minimize
def svi_loss(params, k, w_obs, lambda_reg=0.1):
a, b, rho, m, sigma = params
w_pred = a + b * (rho * (k - m) + np.sqrt((k - m)**2 + sigma**2))
mse = np.mean((w_obs - w_pred)**2)
# 惩罚曲率:二阶导数的平方和
curvature = np.gradient(np.gradient(w_pred, k), k)
reg = lambda_reg * np.mean(curvature**2)
return mse + reg
# 初始化参数
params0 = [0.1, 0.2, -0.5, 0.0, 0.1]
result = minimize(svi_loss, params0, args=(k_data, w_data), method='L-BFGS-B')
你看,代码里加了一个 lambda_reg 参数。调大它,曲线就更平滑。调小,就更贴近数据。这个值怎么选?我一般用交叉验证,或者直接问交易员:「你觉得这条曲线合理吗?」
4.5 知识体系总览
下面这张图,是我自己整理的波动率曲面构建流程。你可以把它当作一个检查清单:
这张图里,我特意画了一个循环箭头。为什么?因为实际工作中,你很少能一次搞定。拟合完发现插值不平滑?回去调参数。插值完发现出现套利?回去加约束。这就是工程实践。
4.6 避坑指南
最后,分享几个我踩过的坑:
- 数据清洗:市场数据里经常有「垃圾」报价。比如深度虚值期权,流动性差,报价可能偏离很大。我建议先过滤掉买卖价差过大的数据。
- 参数稳定性:SVI的五个参数,有些对初始值很敏感。我曾经因为初始化没做好,拟合出来的曲面在ATM附近是负的。嗯,那画面太美不敢看。
- 实时更新:如果你做高频,每次重新拟合所有参数太慢。可以考虑用滚动窗口,或者只更新部分参数。
一句话总结:波动率曲面不是终点,而是起点。有了它,你才能做更精细的定价、对冲和套利。
好了,这一章就到这里。下一章我们聊聊随机波动率模型,看看怎么把「波动率会变」这个事实更好地建模。
公众号:蓝海资料掘金营,微信deep3321