第三节:价差分析——套利交易的核心密码

做跨市场套利这么多年,我越来越觉得,价差分析就是整个交易体系的「心脏」。你策略再花哨,风控再严密,如果价差分析没做到位,一切都是空中楼阁。今天我就把这块硬骨头拆开揉碎了讲给你听。

3.1 价差的计算方法

先说说最基础的东西——价差到底怎么算?很多人以为就是简单的「A价格减B价格」,其实没那么简单。

价差 = P₁ - P₂

这是最原始的定义。但实战中,我习惯用三种不同的计算方式,分别应对不同的场景:

计算方式 公式 适用场景
简单价差 P₁ - P₂ 同品种、同单位(如沪铜与伦铜)
对数价差 ln(P₁) - ln(P₂) 价格波动剧烈、需要稳定方差时
标准化价差 (P₁ - P₂) / σ 多品种比较、组合管理

我个人最常用的是对数价差。为什么?因为金融资产的价格往往是指数增长的,直接做差会导致方差随时间变大,统计检验容易出问题。取对数之后,序列会「老实」很多。

核心要点:价差计算不是死公式,要根据品种特性灵活选择。我见过太多新手直接用简单价差做统计套利,结果回测漂亮实盘亏钱——就是因为没考虑价格尺度问题。

举个例子,假设沪铜价格是70000元/吨,伦铜价格是9000美元/吨(约合65000元/吨)。简单价差是5000元。但如果铜价涨到80000元和10000美元,价差可能变成6000元。这5000和6000能直接比吗?不能。因为价格水平变了。对数价差就能消除这个「刻度效应」。

# Python代码:三种价差计算示例
import numpy as np

def calculate_spread(p1, p2, method='simple'):
    if method == 'simple':
        return p1 - p2
    elif method == 'log':
        return np.log(p1) - np.log(p2)
    elif method == 'standardized':
        spread = p1 - p2
        return spread / np.std(spread)
    else:
        raise ValueError("未知方法")

# 实战中,我一般先算对数价差,再检查平稳性
p1 = np.array([70000, 71000, 69500, 72000])
p2 = np.array([65000, 65800, 64500, 66800])
log_spread = calculate_spread(p1, p2, 'log')
print("对数价差:", log_spread)

3.2 价差的统计特征

算完价差,接下来就要看它的「脾气」了。价差序列有两个非常重要的统计特征:均值回归和波动率聚集。

3.2.1 均值回归

说白了,就是价差不会永远偏离一个「中心值」。它像一根被拉长的橡皮筋,拉得越远,弹回来的力量越大。

我在项目中遇到过最典型的例子是股指期货的期现套利。沪深300股指期货和ETF之间的价差,几乎永远在±20个点以内波动。一旦超过这个范围,套利资金就会蜂拥而入,把价差「打」回来。

判断均值回归的常用指标:

  • 半衰期(Half-life):价差偏离均值后,回到一半所需的时间。半衰期越短,回归越快。
  • 自相关系数:一阶自相关为负,说明有回归倾向。
  • 布林带宽度:价差突破上下轨后,大概率会回归。

我的经验:半衰期在5-20个周期(比如5-20分钟)的价差,最适合做高频套利。太短了来不及反应,太长了资金占用成本高。

3.2.2 波动率聚集

这个现象很有意思——价差波动大的时候,往往持续大;波动小的时候,持续小。就像人的情绪,生气的时候越说越气,平静的时候一直平静。

为什么会这样?因为市场信息是「簇状」到达的。一个突发消息引发套利盘涌入,价差剧烈波动;等消息消化完,波动又回归平静。

我建议用GARCH模型来捕捉这个特征。不过实战中,我更喜欢用滚动标准差来观察:

# 滚动标准差计算波动率聚集
import pandas as pd

def rolling_volatility(spread, window=20):
    return spread.rolling(window=window).std()

# 如果滚动标准差出现「阶梯状」变化,说明有波动率聚集
spread = pd.Series(log_spread)
vol = rolling_volatility(spread)
print("波动率序列:", vol)

注意:波动率聚集会导致你的止损策略失效。我曾经在波动率突然放大的时候,连续被止损了5次,亏了不少手续费。后来我加了波动率过滤器——波动率超过阈值时,暂停交易。

3.3 价差序列的平稳性检验

这是价差分析中最关键的一步,没有之一。如果价差不平稳,你做的所有统计套利都是伪回归,实盘必亏。

平稳性的定义:价差序列的均值、方差、自协方差不随时间变化。说白了,就是价差的「脾气」是稳定的。

常用的检验方法:

  • ADF检验(Augmented Dickey-Fuller):最主流的方法。p值小于0.05,说明平稳。
  • PP检验(Phillips-Perron):对异方差更稳健。
  • KPSS检验:原假设是平稳,与ADF相反。

我个人习惯用ADF检验,但会结合KPSS做双重确认。为什么?因为ADF的检验力在某些情况下不够强,容易把「趋势平稳」误判为「非平稳」。

# ADF检验示例
from statsmodels.tsa.stattools import adfuller

def check_stationarity(spread):
    result = adfuller(spread, autolag='AIC')
    p_value = result[1]
    if p_value < 0.05:
        print(f"价差平稳 (p={p_value:.4f})")
        return True
    else:
        print(f"价差不平稳 (p={p_value:.4f})")
        return False

# 实战中,我一般要求p值小于0.01才放心
check_stationarity(log_spread)

避坑指南:我曾经在螺纹钢和热卷的跨品种套利中,ADF检验显示p=0.03,我以为平稳了,直接上实盘。结果跑了两个月,价差一路漂移,亏了8%。后来才发现,那个「平稳」是伪的——因为样本期太短,刚好碰到震荡行情。从那以后,我坚持用至少500个数据点做检验,并且要求p值小于0.01。

还有一个容易被忽略的点:协整检验。如果你做的是配对交易,光看价差平稳性不够,还要看两个价格序列是否协整。协整是比平稳性更强的条件——它要求两个序列的线性组合是平稳的。

常用的协整检验方法:

  • Engle-Granger两步法:先回归,再检验残差平稳性。
  • Johansen检验:可以检验多个序列之间的协整关系。

嗯,这里要注意:协整关系可能会随时间变化。我建议每3个月重新检验一次,或者每次换月时重新计算。

知识体系总览

下面这张图是我自己整理的价差分析框架,你可以把它当作操作手册来用:

价差分析知识体系 价差计算方法 统计特征分析 平稳性检验 简单价差 对数价差 标准化价差 均值回归 波动率聚集 ADF检验 KPSS检验 协整检验 实战应用:套利策略构建 价差计算 → 统计特征判断 → 平稳性确认 → 开仓/平仓 核心原则:先检验,后交易;不平稳,不进场

这张图把价差分析的三个核心模块串起来了。你从左边开始,先选好计算方法,然后分析统计特征,最后做平稳性检验。三步走完,才能进入实战环节。

最后说一句:价差分析不是一次性工作。市场在变,品种在变,你的模型也要跟着变。我每周都会重新跑一遍平稳性检验,确保模型没有「过期」。这听起来麻烦,但能帮你省下大笔亏损。


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