第3章:价差分析

价差分析,说白了就是套利交易的核心基本功。你想想看,跨市场套利赚的是什么钱?赚的就是价差回归的钱。所以搞懂价差怎么算、有什么统计特征,是咱们这行的必修课。

我个人习惯把价差分析分成三个层次:定义与计算、统计特征、实战应用。今天咱们先把前两个讲透。

3.1 价差的定义

价差,就是两个相关资产价格之间的差值。在跨市场套利中,我们通常关注的是同一品种在不同交易所、不同合约月份之间的价差。

举个例子:

  • 跨交易所价差:BTC在币安的价格 vs 在OKX的价格
  • 跨期价差:沪深300股指期货当月合约 vs 下月合约
  • 跨品种价差:螺纹钢期货 vs 热卷期货

嗯,这里要注意:不是随便两个品种都能算价差。必须得有强相关性,否则你算出来的价差就是噪音,不是信号。

3.2 价差的计算方式

价差的计算其实很简单,但不同场景下有不同的处理方式。我给大家整理了几种常用方法:

计算方式 公式 适用场景
简单价差 P₁ - P₂ 同品种、同单位
百分比价差 (P₁ - P₂) / P₂ × 100% 价格差异较大时
对数价差 ln(P₁) - ln(P₂) 时间序列分析
标准化价差 (P₁ - P₂) / σ 多品种比较

我在项目中遇到过一个问题:用简单价差做比特币套利时,价格从1万涨到6万,价差的绝对值也跟着放大,导致信号失真。后来我改用百分比价差,效果就好多了。

核心要点:选择哪种价差计算方式,取决于你的品种特性和策略周期。短线高频用简单价差,中长线用百分比或对数价差更靠谱。

3.3 价差的统计特征

价差不是随机游走的。它有明显的统计规律,咱们重点讲两个:均值回归和波动率聚类。

3.3.1 均值回归

均值回归是价差最迷人的特性。说白了,价差不会无限偏离,它总会回到某个均衡值附近。为什么?因为套利者会搬砖啊。

我记得2019年做ETH跨交易所套利时,价差经常在±2%之间波动。一旦超过3%,就会有大量套利资金涌入,几分钟内就把价差打回原形。这就是均值回归的力量。

如何量化均值回归?我常用两个指标:

  • 半衰期(Half-life):价差偏离后,回到均值一半所需的时间。半衰期越短,回归越快。
  • 自相关系数:价差序列的一阶自相关。负值越大,均值回归越强。

下面是我常用的半衰期计算代码:

import numpy as np
from statsmodels.tsa.stattools import adfuller

def calculate_half_life(spread):
    """
    计算价差序列的半衰期
    """
    spread_lag = spread.shift(1).dropna()
    spread_diff = spread.diff().dropna()
    
    # 用OLS回归估计均值回归速度
    X = spread_lag.values.reshape(-1, 1)
    y = spread_diff.values
    
    # 添加常数项
    X = np.column_stack([np.ones(len(X)), X])
    
    # 计算回归系数
    beta = np.linalg.lstsq(X, y, rcond=None)[0]
    
    # 半衰期 = -ln(2) / ln(1 + beta[1])
    half_life = -np.log(2) / np.log(1 + beta[1])
    
    return half_life

# 使用示例
spread = price_1 - price_2
hl = calculate_half_life(spread)
print(f"价差半衰期: {hl:.2f} 个时间单位")
实战技巧:半衰期在5-20个时间单位之间的价差,最适合做均值回归策略。太短(<3)说明噪音大,太长(>50)说明回归太慢,资金效率低。

3.3.2 波动率聚类

波动率聚类,是价差的另一个重要特征。简单说就是:大波动后面跟着大波动,小波动后面跟着小波动。这不是玄学,是市场微观结构的体现。

为什么会这样?你想想看,当套利机会出现时,第一批套利者进场,价差开始收敛。但有时候收敛不彻底,第二批套利者又来了,价差继续波动。这种"一波未平一波又起"的现象,就是波动率聚类。

我曾经吃过这个亏。2018年做螺纹钢跨期套利,看到价差偏离了2个标准差,直接重仓进场。结果价差不仅没回归,反而继续扩大。后来复盘发现,当时正处于波动率聚类的高峰期,价差的波动幅度被低估了。

如何识别波动率聚类?我常用GARCH模型:

from arch import arch_model

def fit_garch(spread_returns):
    """
    拟合GARCH(1,1)模型,检测波动率聚类
    """
    model = arch_model(spread_returns * 100, vol='Garch', p=1, q=1)
    result = model.fit(disp='off')
    
    print("GARCH模型参数:")
    print(result.params)
    
    # 条件波动率
    conditional_vol = result.conditional_volatility / 100
    
    return conditional_vol

# 使用示例
returns = spread.pct_change().dropna()
vol = fit_garch(returns)
避坑指南:我曾经在波动率聚类期间,用固定阈值开仓,结果连续止损。后来我改用动态阈值——根据当前波动率调整开仓阈值。波动率大时放宽阈值,波动率小时收紧阈值。效果立竿见影。

3.4 价差分析的知识体系

为了让大家更直观地理解价差分析的完整框架,我画了一张结构图:

价差分析知识体系 价差定义 价差计算方式 简单价差 百分比价差 对数价差 标准化价差 统计特征 均值回归 半衰期 / 自相关系数 波动率聚类 GARCH模型 / 条件波动率

3.5 实战中的注意事项

讲完了理论,说几个实战中容易踩的坑:

  1. 数据频率要匹配:做价差分析时,两个品种的数据必须用同一时间戳。我见过有人用1分钟K线对5分钟K线,算出来的价差全是错的。
  2. 注意交易成本:价差回归的利润,往往很薄。如果交易成本太高,可能赚的钱还不够交手续费。我一般会先算一下盈亏比,低于2:1的就不做了。
  3. 警惕结构突变:价差的均值不是一成不变的。交易所调整费率、合约规则变更、市场结构变化,都可能导致价差的均值发生偏移。我习惯每周重新计算一次均值,动态调整。
总结一下:价差分析是套利交易的基石。搞懂了价差的定义、计算方式和统计特征,你就掌握了捕捉套利机会的基本功。均值回归告诉你"什么时候进场",波动率聚类告诉你"怎么控制风险"。两者结合,才能做出稳健的套利策略。

嗯,今天就先聊到这儿。下一章咱们会深入讲价差的平稳性检验和协整关系,那是构建套利策略的另一个关键环节。


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