第十九章:多资产期权组合的协方差曲面建模

说实话,做期权量化这几年,我踩过最大的坑就是——把多资产组合当成单资产来管。

你想想看,单资产期权组合,你盯着波动率曲面就够了。但一旦涉及多个标的,比如沪深300 + 中证500 + 创业板指,问题就来了:它们之间的相关性不是常数,而是会随着时间、市场状态、甚至行权价变化而变化。这就是我们今天要聊的——协方差曲面建模

为什么需要协方差曲面?

先讲个我自己的经历。几年前我做了一个跨品种的期权套利策略,底层是50ETF和300ETF的价差。我一开始用的是历史相关系数,大概0.85左右。结果2020年3月那波暴跌,相关性直接跳到0.97,我的对冲头寸瞬间失效,亏了不少。

事后复盘我才意识到:相关性不是一条线,而是一个曲面。它跟波动率一样,有期限结构,有偏斜,甚至还有“相关性微笑”。

核心观点: 协方差曲面 = 波动率曲面 × 相关性曲面。你不能只建模波动率,而忽略相关性随时间和行权价的变化。

协方差曲面的数学表达

我们先从最基础的开始。对于两个资产 i 和 j,它们的协方差可以写成:

Σ_{ij}(t, K_i, K_j) = ρ_{ij}(t, K_i, K_j) × σ_i(t, K_i) × σ_j(t, K_j)

其中:

  • t 是剩余期限
  • K_i, K_j 是各自的行权价
  • σ_i, σ_j 是各自的隐含波动率曲面
  • ρ_{ij} 是隐含相关系数曲面

嗯,这里要注意:ρ_{ij} 不是常数,它本身也是一个曲面。我习惯把它叫做“隐含相关性曲面”,因为它跟隐含波动率一样,是从市场报价中反推出来的。

隐含相关性曲面的构建方法

我个人比较常用的方法有三种,各有优劣:

方法 原理 优点 缺点
1. 基于价差期权 从价差期权价格反推相关性 直接反映市场预期 流动性差,数据稀疏
2. 基于历史+动态调整 用历史相关性做基准,用GARCH等模型动态调整 数据充足,稳定 滞后性,无法捕捉极端事件
3. 混合方法 用历史数据做先验,用期权数据做后验校准 兼顾稳定性和市场敏感性 实现复杂,计算量大

我在实际项目中,强烈推荐第三种。为什么?因为纯历史方法在极端行情下会失效,纯期权方法又受限于流动性。混合方法虽然麻烦,但效果最好。

实战:用Python构建协方差曲面

下面我给出一个简化版的实现思路。假设我们有两只股票(比如茅台和五粮液),我们要构建它们的协方差曲面。

import numpy as np
import pandas as pd
from scipy.interpolate import griddata

# 假设我们已经有了两个资产的波动率曲面
# sigma_surface_1, sigma_surface_2 是已经插值好的曲面
# 我们还需要构建相关性曲面

def build_correlation_surface(option_prices, strikes_1, strikes_2, maturities):
    """
    从价差期权价格反推隐含相关性曲面
    """
    # 1. 提取价差期权价格
    spread_prices = option_prices  # 假设已预处理
    
    # 2. 用Black-Scholes模型反推隐含相关性
    # 这里用简化公式:ρ ≈ (σ_spread² - σ₁² - σ₂²) / (2σ₁σ₂)
    # 注意:实际中要用更复杂的模型
    
    correlation_surface = np.zeros((len(maturities), len(strikes_1), len(strikes_2)))
    
    for t_idx, T in enumerate(maturities):
        for k1_idx, K1 in enumerate(strikes_1):
            for k2_idx, K2 in enumerate(strikes_2):
                sigma_1 = sigma_surface_1[t_idx, k1_idx]
                sigma_2 = sigma_surface_2[t_idx, k2_idx]
                sigma_spread = spread_vol[t_idx, k1_idx, k2_idx]
                
                # 反推相关性
                rho = (sigma_spread**2 - sigma_1**2 - sigma_2**2) / (2 * sigma_1 * sigma_2)
                rho = np.clip(rho, -0.999, 0.999)  # 防止越界
                correlation_surface[t_idx, k1_idx, k2_idx] = rho
    
    return correlation_surface

# 最终协方差曲面
cov_surface = correlation_surface * np.einsum('tij,tkj->tij', sigma_surface_1, sigma_surface_2)
小技巧: 实际中价差期权流动性很差,我一般会用“合成价差期权”来替代——就是用两个单腿期权的组合来模拟价差期权的收益结构。虽然精度差一点,但数据量会多很多。

协方差曲面的可视化

我习惯用热力图来展示相关性曲面。下面是一个SVG示意图,展示不同期限和行权价下的相关性变化:

隐含相关性曲面示意图 行权价 (K₁) 0.8 1.0 1.2 剩余期限 1M 6M 12M ρ=0.85 ρ=0.92 ρ=0.88 ρ=0.72 ρ=0.78 ρ=0.75 ρ=0.55 ρ=0.62 ρ=0.58 高相关性 (0.8-0.95) 中相关性 (0.6-0.8) 低相关性 (0.4-0.6)

从这张图你能看到几个规律:

  • 期限越短,相关性越高——短期市场情绪驱动,大家同涨同跌
  • 平值附近相关性最高——深度实值或虚值期权,相关性会下降
  • 极端行权价相关性不对称——虚值看跌期权的相关性往往比虚值看涨更高(避险情绪)
我曾经踩过的坑: 有一次我直接用历史相关性矩阵去计算多资产期权的VaR,结果在2022年4月那波下跌中,相关性从0.6飙到0.9,VaR低估了将近40%。从那以后,我再也不敢用静态相关性了。协方差曲面必须动态更新,至少每天校准一次。

协方差曲面在组合优化中的应用

有了协方差曲面,我们就可以做更精细的组合优化。我常用的一个场景是:

  1. 波动率套利组合:利用协方差曲面识别相关性偏离的品种对
  2. 风险预算分配:根据协方差曲面的期限结构,动态调整各期限的权重
  3. 尾部风险对冲:重点关注协方差曲面在极端行权价处的变化

举个例子,如果你发现某两个资产的隐含相关性远低于历史相关性,那可能意味着市场在定价一个“相关性回归”的机会。这时候你可以做多价差期权,赌相关性回归均值。

实现中的注意事项

最后分享几个实战经验:

  • 数据清洗是第一关:价差期权的报价经常有噪音,我一般会用中位数滤波先处理一遍
  • 插值方法要选对:相关性曲面比波动率曲面更平滑,用三次样条就够了,别用太复杂的模型
  • 正定性约束:构建出来的协方差矩阵必须正定,否则优化时会出问题。我习惯用“收缩估计”来保证正定性
  • 计算效率:如果你有10个资产,协方差曲面就是10×10×T×K的维度,计算量很大。我一般用GPU加速或者降维处理

嗯,协方差曲面建模这块内容确实有点烧脑。但说白了,它就是让你从“看单个资产”升级到“看资产之间的关系”。做多资产期权组合,这才是真正的核心竞争力。


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