4、配对交易策略:协整配对、距离方法与随机价差模型

配对交易,说白了就是找两个「长得像」的股票,等它们走散了再买回来。我做了这么多年量化,这招在震荡市里特别好用。今天咱们就把三种主流方法掰开揉碎了讲。

4.1 协整配对:最正统的方法

协整这个概念,我刚开始接触时也觉得绕。其实很简单——两个价格序列各自随机游走,但它们的线性组合是平稳的。这就叫协整。

为什么会这样?因为背后有共同的驱动因素。比如茅台和五粮液,都是白酒龙头,长期看价差会回归。

核心步骤:

  1. 选候选股票对(同行业、同板块优先)
  2. 用ADF检验确认协整关系
  3. 估计对冲比率(通常用OLS回归)
  4. 构建价差序列,设定开平仓阈值

代码实现其实不复杂。我习惯用statsmodels做协整检验:

import statsmodels.api as sm
from statsmodels.tsa.stattools import adfuller

# 假设price_a和price_b是两列价格序列
def find_cointegrated_pair(price_a, price_b):
    # OLS回归估计对冲比率
    price_a = sm.add_constant(price_a)
    model = sm.OLS(price_b, price_a).fit()
    hedge_ratio = model.params[1]
    
    # 计算价差
    spread = price_b - hedge_ratio * price_a['price_a']
    
    # ADF检验
    adf_result = adfuller(spread.dropna())
    p_value = adf_result[1]
    
    return hedge_ratio, p_value

嗯,这里要注意:p值小于0.05才算协整。我在项目中遇到过p值刚好0.051的情况,硬着头皮上了,结果回测惨不忍睹。后来我给自己定了个规矩——低于0.01才用。

个人经验:协整配对适合日频以上交易。高频的话,交易成本会吃掉大部分利润。我建议至少用1小时K线。

4.2 距离方法:简单粗暴但有效

距离方法就直白多了。把两个价格序列标准化,然后算欧氏距离。距离大了就做空,小了就做多。

你想想看,这方法不需要做协整检验,省了不少事。但代价是——它假设价格已经标准化了,实际中可能不成立。

具体步骤:

  1. 将价格序列标准化(减去均值除以标准差)
  2. 计算标准化价格的差值
  3. 设定阈值(比如±2个标准差)
  4. 当差值超过阈值时开仓,回归时平仓

我曾经用这个方法做过美股ETF配对。SPY和IVV,都是标普500ETF,距离方法跑出来的夏普比率有1.8。但要注意,这个方法对参数很敏感。

避坑指南:我曾经把回看窗口设成60天,结果遇到2020年3月的暴跌,距离直接崩了。后来我改成滚动窗口,并且加了波动率过滤。记住,距离方法在极端行情下会失效。

4.3 随机价差模型:进阶玩法

随机价差模型,说白了就是把价差当成一个均值回归过程来建模。最常用的是Ornstein-Uhlenbeck过程。

模型长这样:

dX(t) = θ(μ - X(t))dt + σdW(t)

其中θ是回归速度,μ是长期均值,σ是波动率。参数估计可以用最大似然估计。

我个人的习惯是用卡尔曼滤波做在线估计。这样参数会随着市场变化而调整,比固定参数强多了。

代码实现:

import numpy as np
from scipy.optimize import minimize

def estimate_ou_params(spread):
    # 最大似然估计OU过程参数
    def neg_log_likelihood(params):
        theta, mu, sigma = params
        n = len(spread)
        dt = 1
        
        # 计算似然函数
        ll = 0
        for i in range(1, n):
            x_prev = spread[i-1]
            x_curr = spread[i]
            mean = x_prev * np.exp(-theta*dt) + mu*(1 - np.exp(-theta*dt))
            var = sigma**2 * (1 - np.exp(-2*theta*dt)) / (2*theta)
            ll += -0.5*np.log(2*np.pi*var) - (x_curr - mean)**2 / (2*var)
        
        return -ll
    
    # 初始值
    init_params = [1.0, np.mean(spread), np.std(spread)]
    result = minimize(neg_log_likelihood, init_params, method='L-BFGS-B')
    
    return result.x

三种方法对比:

方法 优点 缺点 适用场景
协整配对 理论基础扎实 需要检验,参数多 日频以上,长期稳定关系
距离方法 简单快速 假设强,极端行情失效 高频,短期套利
随机价差模型 动态调整,适应性强 计算复杂,过拟合风险 中低频,需要自适应

4.4 实战中的坑与对策

做了这么多年配对交易,我踩过的坑能写本书。这里挑几个重点说说:

  • 幸存者偏差:回测时用现在的股票池,但历史上有些股票退市了。我建议用当时的成分股做回测。
  • 交易成本:配对交易频率高,佣金和滑点能吃掉利润。我一般按双边万三算成本。
  • 流动性风险:小盘股配对容易遇到流动性枯竭。我习惯只做日均成交额1亿以上的股票。

我的小技巧:开仓后设个止损线。比如价差超过3个标准差就止损。虽然会亏点钱,但能避免黑天鹅。我曾经靠这个躲过了2015年的股灾。

最后说一句,配对交易不是万能药。它适合震荡市,趋势行情里会亏得很难看。所以,一定要结合市场环境来用。

配对交易策略知识体系 配对交易策略 协整配对 核心:ADF检验 + OLS回归 优点:理论基础扎实 缺点:参数多,需检验 适用:日频以上 距离方法 核心:标准化 + 欧氏距离 优点:简单快速 缺点:假设强,极端失效 适用:高频短期 随机价差模型 核心:OU过程 + 卡尔曼滤波 优点:动态自适应 缺点:计算复杂 适用:中低频 实战要点 ✓ 幸存者偏差:用当时成分股回测 ✓ 交易成本:双边万三 ✓ 流动性:日均成交额1亿以上 ✓ 止损:价差超过3个标准差
专注资料整理