3. 协整与波动率:协整关系的波动率依赖性、残差波动率建模

协整关系,说白了就是两个价格序列之间有个「长期拉手」的关系。但很多人忽略了一个关键点——这个「拉手」的松紧程度,其实跟市场波动率密切相关。我刚开始做跨品种套利时,就吃过这个亏。

3.1 协整关系的波动率依赖性

你想想看,当市场风平浪静时,两个品种的价差往往很稳定。但一旦波动率飙升,价差就开始「抽风」。这不是偶然,而是协整关系本身就有波动率依赖性。

为什么会这样?因为协整关系本质上是一个线性组合:

spread = price_A - β × price_B

当波动率低时,这个β值相对稳定。但波动率一高,β就开始漂移。我在项目中遇到过这种情况:2018年做螺纹钢和热卷的套利,平时协整系数稳定在1.02左右,但一遇到供给侧改革政策出台,波动率瞬间翻倍,β直接跳到1.15。

核心观点:协整关系不是静态的,它随波动率变化而变化。高波动率环境下,协整关系可能暂时失效。

我个人习惯的做法是,先对波动率进行分箱处理。把波动率分成低、中、高三档,然后分别估计协整系数:

import numpy as np
import statsmodels.api as sm

def rolling_cointegration(price_A, price_B, window=60):
    """滚动协整估计,附带波动率分箱"""
    results = []
    for i in range(window, len(price_A)):
        # 计算滚动波动率
        ret_A = np.diff(price_A[i-window:i]) / price_A[i-window:i-1]
        vol = np.std(ret_A) * np.sqrt(252)
        
        # 分箱
        if vol < 0.15:
            regime = 'low_vol'
        elif vol < 0.30:
            regime = 'mid_vol'
        else:
            regime = 'high_vol'
        
        # 协整回归
        X = sm.add_constant(price_B[i-window:i])
        model = sm.OLS(price_A[i-window:i], X).fit()
        
        results.append({
            'beta': model.params[1],
            'regime': regime,
            'vol': vol
        })
    return results

避坑指南:我曾经直接用全样本估计协整系数,结果在波动率突变时亏得很惨。后来改成滚动窗口+波动率分箱,效果好了很多。

3.2 残差波动率建模

协整回归做完后,我们得到残差序列。这个残差就是套利信号的基础。但残差本身也有波动率聚集效应——大波动后面跟着大波动,小波动后面跟着小波动。

嗯,这里要注意。如果你直接用原始残差做交易信号,很容易被假突破骗进去。我建议对残差进行波动率建模,把残差标准化后再用。

常用的方法有两种:

  1. GARCH模型:对残差序列拟合GARCH(1,1),得到条件波动率
  2. 滚动标准差:用过去N天的滚动标准差作为波动率估计

我个人更倾向于GARCH,因为它能捕捉波动率的自相关性。来看代码:

from arch import arch_model

def residual_vol_modeling(residuals):
    """对协整残差进行波动率建模"""
    # 拟合GARCH(1,1)
    model = arch_model(residuals * 100, vol='Garch', p=1, q=1)
    res = model.fit(disp='off')
    
    # 获取条件波动率
    conditional_vol = res.conditional_volatility / 100
    
    # 标准化残差
    standardized_residuals = residuals / conditional_vol
    
    return standardized_residuals, conditional_vol

标准化后的残差,均值接近0,标准差接近1。这样设置交易阈值就简单多了——比如±2倍标准差作为开仓信号。

注意:GARCH模型对异常值敏感。如果残差中有极端值,建议先做截尾处理。我一般用99%分位数截尾。

3.3 波动率状态切换策略

既然协整关系和残差波动率都跟市场状态有关,那策略也得跟着变。我总结了一套「三态切换」策略:

波动率状态 协整系数稳定性 交易频率 止损宽度
低波动(<15%) 正常 1.5倍标准差
中波动(15%-30%) 中等 降低50% 2.0倍标准差
高波动(>30%) 暂停交易 不设止损,等待回归

你看,高波动时我干脆不交易。为什么?因为协整关系在高波动下容易断裂,强行交易就是送钱。

我记得有一次做豆粕和菜粕的套利,波动率突然从18%飙到35%。按我的策略应该暂停,但当时贪心想多赚一笔。结果价差突破4倍标准差还不回归,亏了2%才砍仓。从那以后,高波动暂停交易就成了铁律。

3.4 实战中的残差监控

最后说一个细节。残差波动率建模不是一劳永逸的,需要实时监控模型效果。我一般每天检查三个指标:

  • 残差自相关性:如果残差还有明显的自相关,说明模型没捕捉全
  • 波动率预测误差:实际波动率跟GARCH预测的偏差
  • 标准化残差的分布:应该接近正态分布,如果偏度或峰度异常,要警惕

一句话总结:协整套利的本质是赌残差回归,而残差的波动率决定了这个赌局的风险大小。管不好波动率,就别谈套利。

好了,这一章的内容就这些。波动率管理是套利策略的「安全带」,系好了才能开快车。


专注资料整理