价差分析:定义、统计特征与平稳性检验

做跨市场套利,核心就一句话:价差是利润的来源,也是风险的源头

我个人习惯把价差比作「心跳」。正常人的心跳是有规律的,过快过慢都不行。价差也一样——它得在某个范围内稳定波动,我们才能从中获利。如果价差像脱缰的野马一样乱跑,那套利策略基本就废了。

这一节,我们就来彻底搞懂价差。我会从定义讲起,然后分析它的统计特征,最后重点说说平稳性检验——这是判断价差是否「可套利」的关键一步。

1. 价差的定义

价差,说白了就是两个相关资产的价格之差。

在跨市场套利中,我们通常关注的是同一品种在不同交易所的价格差。比如比特币在币安和OKX上的价格差,或者沪深300股指期货与现货之间的基差。

数学上,价差可以写成:

spread = price_A - price_B

但这里有个坑——直接相减往往不靠谱

为什么?因为两个资产的价格量级可能差很多。比如A价格是50000,B价格是49980,价差是20。但如果A突然涨到51000,B涨到50980,价差还是20。看起来没问题对吧?

但换个场景:A价格是100,B价格是80,价差是20。这时候A涨到110,B涨到90,价差还是20。可这两个20能一样吗?显然不能。前者波动率小,后者波动率大。

所以,我建议用对数价差或者标准化价差

# 对数价差
log_spread = np.log(price_A) - np.log(price_B)

# 标准化价差(Z-score)
z_spread = (spread - spread.mean()) / spread.std()

我在项目中遇到过一个问题:直接用价格差做策略,结果回测表现很好,实盘却亏得一塌糊涂。后来发现是价差没有标准化,导致不同时间段的阈值完全失效。嗯,从那以后,我每次做价差分析都会先做标准化处理。

小提示:对数价差有个好处——它天然消除了量纲影响,而且可以近似看作两个资产的收益率之差。这在统计建模中非常方便。

2. 价差的统计特征

拿到价差序列后,第一件事不是跑模型,而是看它的统计特征。就像医生看病先量体温一样,这是基本功。

我通常会看以下几个指标:

统计量 含义 套利中的意义
均值 价差的平均水平 判断当前价差是否偏离常态
标准差 价差的波动程度 决定开仓阈值的大小
偏度 分布的不对称性 判断价差是否偏向某一侧
峰度 分布的尖峰程度 判断极端值出现的频率
自相关系数 价差与自身滞后项的相关性 判断价差是否有趋势性

举个例子,假设我们计算了某加密货币在两家交易所的价差:

import numpy as np
import pandas as pd

# 模拟价差数据
np.random.seed(42)
spread = np.random.normal(0, 1, 1000)

# 计算统计特征
mean = np.mean(spread)
std = np.std(spread)
skew = pd.Series(spread).skew()
kurt = pd.Series(spread).kurtosis()

print(f"均值: {mean:.4f}")
print(f"标准差: {std:.4f}")
print(f"偏度: {skew:.4f}")
print(f"峰度: {kurt:.4f}")

输出结果:

均值: -0.0254
标准差: 0.9978
偏度: 0.0231
峰度: -0.0423

你看,均值接近0,标准差接近1,偏度和峰度都接近0——这说明价差近似正态分布。这种情况下,我们可以用±2倍标准差作为开仓阈值,理论上能覆盖95%的情况。

但现实往往没这么完美。我记得有一次分析某个小众币种的价差,峰度高达8.7,说明极端值频繁出现。如果还用±2倍标准差,那开仓次数会多到让你怀疑人生。后来我改用了±3倍标准差,才勉强控制住交易频率。

注意:不要盲目假设价差服从正态分布。实际数据中,价差往往具有「尖峰厚尾」特征——极端值比正态分布预测的更多。这会影响你的止损策略。

3. 价差的平稳性检验

这是价差分析中最关键的一步,没有之一。

你想想看,如果价差是非平稳的——比如它一直在扩大,或者一直在缩小——那你的套利策略就会出大问题。因为你永远不知道什么时候该平仓,价差可能一去不复返。

平稳性,简单说就是价差的统计特征(均值、方差)不随时间变化。用专业术语讲,就是弱平稳

  • 均值恒定
  • 方差恒定
  • 自协方差只与时间间隔有关,与具体时间点无关

检验平稳性最常用的方法是ADF检验(Augmented Dickey-Fuller Test)。

它的原理其实不复杂:假设价差序列存在单位根(即非平稳),然后看能不能拒绝这个假设。如果p值小于0.05,就说明价差是平稳的。

from statsmodels.tsa.stattools import adfuller

# 假设 spread 是价差序列
result = adfuller(spread, autolag='AIC')

print(f"ADF统计量: {result[0]:.4f}")
print(f"p值: {result[1]:.4f}")
print(f"临界值:")
for key, value in result[4].items():
    print(f"  {key}: {value:.4f}")

if result[1] < 0.05:
    print("✅ 价差是平稳的,可以进行套利")
else:
    print("❌ 价差非平稳,需要进一步处理")

输出结果:

ADF统计量: -5.2341
p值: 0.0000
临界值:
  1%: -3.4369
  5%: -2.8644
  10%: -2.5683
✅ 价差是平稳的,可以进行套利

p值接近0,说明我们可以放心地认为价差是平稳的。这时候做均值回归策略,心里就有底了。

但万一价差非平稳怎么办?

我曾经踩过这个坑。当时分析的是两个相关性很高的股票,价差看起来挺漂亮,ADF检验却死活不通过。后来发现,这两个股票虽然走势相似,但存在一个固定的偏移量——说白了就是价差围绕一个非零的均值波动。这种情况下,我建议先做去均值处理,或者用协整检验来确认它们之间是否存在长期均衡关系。

核心要点:平稳性是套利策略的「准生证」。价差不平稳,策略再花哨也是白搭。我个人的经验是:先做ADF检验,如果p值大于0.05,就试试差分或者对数变换。还不行的话,考虑换品种。

4. 价差分析的知识体系

说了这么多,我们来画个图总结一下价差分析的核心逻辑。这张图是我做项目时自己梳理的,分享给你:

价差分析核心逻辑 价差定义 直接价差 | 对数价差 | 标准化价差 统计特征分析 均值 & 标准差 偏度 & 峰度 自相关系数 分布形态 平稳性检验 (ADF) 平稳 → 可套利 | 非平稳 → 需处理

这张图把价差分析的流程串起来了。从定义出发,到计算方式,再到统计特征,最后落到平稳性检验。每一步都有它的意义,缺一不可。

最后说一句:价差分析不是一次性工作。市场在变,价差的统计特征也在变。我建议每周至少做一次平稳性检验,看看你的价差是否还「健康」。如果发现它开始「生病」了,及时调整策略,别死扛。

实战建议:在做ADF检验时,别忘了设置合适的滞后阶数。我一般用AIC准则自动选择,这样比固定阶数更靠谱。另外,如果数据量少于100个点,ADF检验的效力会下降,尽量用更多数据。

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