第三节 价差分析:价差的计算方法、统计特征与平稳性检验

做跨市场套利,说白了就是在赌价差会回归。

但怎么定义这个“价差”?怎么知道它会不会回归?

这一节,我们就来拆解价差分析的三个核心步骤:怎么算、长啥样、稳不稳

一、价差的计算方法

价差不是简单的价格相减。我见过不少新手,上来就用A价格减B价格,结果发现价差序列越跑越偏,根本没法用。

为什么?因为两个市场的价格量级可能不同,或者存在固定的基差。

我个人习惯,先分清楚三种情况:

  1. 直接相减法:适用于同品种、同单位、同市场的价差。比如沪铜和伦铜,单位都是元/吨,直接减就行。
  2. 对数价差法:适用于价格量级差异大的品种。比如一个价格1000,一个价格10,直接减没意义。取对数再减,相当于看相对变化率。
  3. 回归残差法:适用于存在协整关系的品种。先做线性回归,用残差作为价差。这是最严谨的做法。

核心公式

直接价差 = PA - PB

对数价差 = ln(PA) - ln(PB)

回归价差 = PA - (α + β × PB)

举个例子。我在做螺纹钢跨期套利时,发现近月和远月合约价格差经常在-50到+50之间波动。直接相减法就够用了。但做股指期货和ETF套利时,因为两者价格量级差很多,我一般用对数价差。

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

# 假设有价格序列
price_a = np.array([100, 102, 101, 103, 105])
price_b = np.array([98, 99, 100, 101, 102])

# 直接价差
spread_direct = price_a - price_b

# 对数价差
spread_log = np.log(price_a) - np.log(price_b)

# 回归价差(简单线性回归)
beta = np.cov(price_a, price_b)[0,1] / np.var(price_b)
alpha = np.mean(price_a) - beta * np.mean(price_b)
spread_reg = price_a - (alpha + beta * price_b)

print("直接价差:", spread_direct)
print("对数价差:", spread_log)
print("回归价差:", spread_reg)

二、价差的统计特征

算完价差,下一步就是看它的“脾气”。

我一般会看四个指标:均值、标准差、偏度、峰度。

  • 均值:价差长期围绕什么水平波动?这是回归的锚点。
  • 标准差:价差波动有多大?决定了开仓阈值。
  • 偏度:价差是否对称?正偏意味着极端正价差更多。
  • 峰度:价差是否有厚尾?峰度越高,极端行情越频繁。

我的经验:如果价差的峰度大于5,我会特别小心。因为这意味着价差经常出现“意料之外”的极端值,普通的高斯模型根本不管用。

举个例子。我曾经做过一个豆粕跨期套利策略,价差均值是20,标准差是8。按道理,价差超过均值±2倍标准差(即4到36)就该开仓了。但实际跑下来,价差经常冲到40以上还不回归。后来一查,峰度高达7.2,说明厚尾严重。我不得不把开仓阈值调到3倍标准差。

# 统计特征计算
mean_spread = np.mean(spread_direct)
std_spread = np.std(spread_direct)
skew_spread = pd.Series(spread_direct).skew()
kurt_spread = pd.Series(spread_direct).kurtosis()

print(f"均值: {mean_spread:.2f}")
print(f"标准差: {std_spread:.2f}")
print(f"偏度: {skew_spread:.2f}")
print(f"峰度: {kurt_spread:.2f}")

三、平稳性检验

这是最关键的一步。

价差不平稳,套利就是空中楼阁。你想想看,如果价差没有均值回归的特性,那开仓后可能越亏越多,永远等不到回归的那一天。

我常用的方法是ADF检验(Augmented Dickey-Fuller Test)。

避坑指南:我曾经犯过一个错误——直接用原始价差做ADF检验,结果p值0.3,显示不平稳。后来发现,是因为价差序列里有一个明显的趋势项。加上常数项和趋势项后,p值变成了0.01,平稳了。所以,做ADF检验时,一定要根据数据特征选择合适的回归形式。

ADF检验的原假设是“存在单位根,序列不平稳”。如果p值小于0.05,就拒绝原假设,认为序列平稳。

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

result = adfuller(spread_direct, autolag='AIC')
print(f"ADF统计量: {result[0]:.4f}")
print(f"p值: {result[1]:.4f}")
if result[1] < 0.05:
    print("价差序列平稳,适合套利")
else:
    print("价差序列不平稳,需要进一步处理")

除了ADF,我偶尔也会用PP检验(Phillips-Perron Test)作为辅助。PP检验对异方差更稳健,但小样本下表现不如ADF。

四、价差分析的知识体系

下面这张图,是我自己总结的价差分析框架。每次做新策略前,我都会按这个流程走一遍。

价差分析知识体系 第一步:价差计算 直接相减法 | 对数价差法 | 回归残差法 第二步:统计特征分析 均值(回归锚点) | 标准差(波动阈值) | 偏度(对称性) | 峰度(厚尾风险) 第三步:平稳性检验 ADF检验(主流) | PP检验(辅助) | 注意:选择合适的回归形式 决策:是否适合套利?

五、实战中的注意事项

嗯,这里要注意几个坑:

  • 数据频率问题:日线数据做ADF检验,和分钟线数据做ADF检验,结果可能完全不同。我个人习惯,先用日线数据做初步筛选,再用分钟线数据做精细化分析。
  • 结构突变问题:如果价差序列中间发生了政策变化、合约换月等事件,平稳性可能会被破坏。我一般会分段检验,或者用Zivot-Andrews检验处理结构突变。
  • 多重比较问题:如果你同时检验了10个品种的价差,其中1个显示平稳,这可能是偶然。记得做多重比较校正,或者用滚动窗口验证。

总结一句话:价差分析不是一锤子买卖。算出来、看特征、验平稳,三步走完,才能放心上实盘。

专注资料整理