第19章 波动率曲面风险度量:希腊字母计算、曲面风险因子、压力测试
波动率曲面建好了,模型也校准了。然后呢?
很多新手会卡在这一步——曲面做出来就不知道干嘛了。其实,曲面真正的价值在于风险管理。说白了,我们费这么大劲去拟合曲面,不是为了好看,是为了算清楚:我的头寸到底暴露在哪些风险里?
我个人习惯把曲面风险拆成三层来看:
- 第一层:单个期权的希腊字母,但要用曲面上的波动率来算
- 第二层:曲面本身的形状变化,比如斜率和曲率
- 第三层:极端行情下,曲面会怎么变?扛不扛得住?
嗯,咱们一层一层说。
19.1 基于曲面的希腊字母计算
传统的BSM希腊字母,用的是常数波动率。但实际交易中,波动率是随行权价和期限变化的。所以,我们要把曲面插值出来的波动率塞进希腊字母公式里。
举个例子,计算Delta:
def delta_from_surface(S, K, T, r, surface):
"""
从波动率曲面获取波动率,再计算Delta
surface: 一个可调用的插值函数 sigma(K, T)
"""
sigma = surface(K, T) # 从曲面拿到波动率
d1 = (np.log(S / K) + (r + 0.5 * sigma**2) * T) / (sigma * np.sqrt(T))
return norm.cdf(d1)
这里有个坑——曲面波动率本身也是S的函数。你想想看,当标的价格变动时,曲面上的点也会移动。所以严格来说,Delta应该包含两部分:
- 直接Delta:BSM公式里对S求偏导
- 影子Delta:S变动导致曲面波动率变化,间接影响期权价格
我在项目中遇到过这种情况:一个深度虚值期权,用常数波动率算出来Delta接近0,但用曲面算出来Delta有0.15。为什么?因为标的一涨,虚值期权变成了平值,曲面上的波动率从低波区跑到了高波区。这个效应,常数波动率根本抓不住。
19.2 曲面风险因子
单个希腊字母只能管一个期权。但一个交易簿上可能有几百个期权,我们需要从曲面整体角度来管理风险。
我习惯把曲面风险因子分成三类:
| 风险因子 | 含义 | 度量方式 |
|---|---|---|
| 水平因子 | 曲面整体平移 | ATM波动率变动1% |
| 倾斜因子 | 虚值/实值端的斜率变化 | 25-Delta 蝶式价差变动 |
| 曲率因子 | 曲面弯曲程度变化 | 10-Delta与ATM的波动率差 |
为什么要拆成这三个?
因为市场冲击曲面时,这三个因子的反应是不一样的。比如财报公布前,水平因子会飙升(整体波动率上升),但倾斜因子可能变化不大。而市场暴跌时,倾斜因子会急剧变陡(虚值Put的波动率暴涨)。
计算这些因子的敏感度,我一般用主成分分析(PCA):
from sklearn.decomposition import PCA
# 假设我们有历史曲面数据,shape = (n_days, n_points)
pca = PCA(n_components=3)
pca.fit(historical_surface_returns)
# 前三个主成分的载荷向量
loadings = pca.components_ # shape = (3, n_points)
# 每个主成分的解释方差比例
explained_var = pca.explained_variance_ratio_
print(f"前三个主成分解释了 {explained_var.sum():.2%} 的曲面变动")
我曾经用这个方法帮一家自营团队重构了风控体系。他们之前只盯着Vega,结果一次事件驱动行情中,曲面倾斜因子剧烈变动,Vega对冲完全失效。后来加了倾斜因子和曲率因子的监控,再也没出过问题。
19.3 压力测试
压力测试,说白了就是问一个问题:如果明天发生极端行情,我的头寸会亏多少?
对于波动率曲面,压力测试不能只改一个参数。因为市场极端行情下,曲面是整体变形的。我常用的压力场景有:
- 崩盘场景:标的价格跌20%,ATM波动率翻倍,倾斜因子变陡3倍
- 波动率爆发:标的价格不动,但所有期限的波动率上升50%
- 流动性枯竭:远月期权波动率飙升,近月变化不大,期限结构倒挂
实现起来其实不复杂:
def stress_test(portfolio, surface, scenario):
"""
portfolio: 期权头寸列表
surface: 当前曲面
scenario: 压力场景参数
"""
# 1. 根据场景参数,生成新的曲面
stressed_surface = apply_scenario(surface, scenario)
# 2. 用新曲面重新定价所有头寸
pnl = 0
for option in portfolio:
old_price = price_option(option, surface)
new_price = price_option(option, stressed_surface)
pnl += (new_price - old_price) * option.position
return pnl
嗯,这里要注意:压力测试的结果不是预测,而是边界检查。我曾经见过一个交易员,他的头寸在正常市场下每天赚几万,但压力测试显示崩盘场景会亏2000万。结果三个月后真的发生了类似行情,亏了1800万。压力测试救了他一命。
19.4 知识体系总览
为了让你更直观地理解这三层风险度量的关系,我画了一张图:
这张图我反复改了好几版。你看,三层之间是递进关系:希腊字母是基础,曲面因子是组合视角,压力测试是终极防线。做风险管理,这三层都得覆盖到。
最后说一句:风险度量不是为了预测市场,而是为了知道自己能承受多大的意外。曲面分析做到这个份上,才算真正落地了。