第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。为什么?因为标的一涨,虚值期权变成了平值,曲面上的波动率从低波区跑到了高波区。这个效应,常数波动率根本抓不住。

核心要点:曲面希腊字母必须考虑波动率的局部动态。建议用有限差分法(bump and reprice)来算,虽然慢一点,但准确。

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对冲完全失效。后来加了倾斜因子和曲率因子的监控,再也没出过问题。

实战建议:每天收盘后,计算三个因子的暴露度,画成雷达图。如果某个因子的暴露度突然超过历史95%分位数,就要警惕了。

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万。压力测试救了他一命。

警告:压力测试的参数不要拍脑袋。建议基于历史极端行情来校准。比如2018年2月的波动率爆发、2020年3月的流动性危机,把这些历史事件的曲面变化参数化,作为标准压力场景。

19.4 知识体系总览

为了让你更直观地理解这三层风险度量的关系,我画了一张图:

波动率曲面风险度量三层架构 第一层:希腊字母 Delta / Gamma / Vega Theta / Rho 基于曲面波动率计算 第二层:曲面风险因子 水平因子 / 倾斜因子 曲率因子 PCA分解 + 敏感度分析 第三层:压力测试 崩盘场景 / 波动率爆发 流动性枯竭 历史极端行情参数化 三层递进关系 • 希腊字母:单个头寸的微观风险,用于日常对冲 • 曲面风险因子:投资组合的整体暴露,用于仓位管理 • 压力测试:极端情景下的生存能力,用于风控限额 三者缺一不可。只做希腊字母,会忽略曲面变形风险; 只做压力测试,会缺乏日常对冲的精细度。

这张图我反复改了好几版。你看,三层之间是递进关系:希腊字母是基础,曲面因子是组合视角,压力测试是终极防线。做风险管理,这三层都得覆盖到。

最后说一句:风险度量不是为了预测市场,而是为了知道自己能承受多大的意外。曲面分析做到这个份上,才算真正落地了。

公众号:蓝海资料掘金营,微信deep3321