价差分析:定义、统计特征与平稳性检验
做跨市场套利,核心就一句话:价差是利润的来源,也是风险的源头。
我个人习惯把价差比作「心跳」。正常人的心跳是有规律的,过快过慢都不行。价差也一样——它得在某个范围内稳定波动,我们才能从中获利。如果价差像脱缰的野马一样乱跑,那套利策略基本就废了。
这一节,我们就来彻底搞懂价差。我会从定义讲起,然后分析它的统计特征,最后重点说说平稳性检验——这是判断价差是否「可套利」的关键一步。
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检验却死活不通过。后来发现,这两个股票虽然走势相似,但存在一个固定的偏移量——说白了就是价差围绕一个非零的均值波动。这种情况下,我建议先做去均值处理,或者用协整检验来确认它们之间是否存在长期均衡关系。
4. 价差分析的知识体系
说了这么多,我们来画个图总结一下价差分析的核心逻辑。这张图是我做项目时自己梳理的,分享给你:
这张图把价差分析的流程串起来了。从定义出发,到计算方式,再到统计特征,最后落到平稳性检验。每一步都有它的意义,缺一不可。
最后说一句:价差分析不是一次性工作。市场在变,价差的统计特征也在变。我建议每周至少做一次平稳性检验,看看你的价差是否还「健康」。如果发现它开始「生病」了,及时调整策略,别死扛。
公众号:蓝海资料掘金营,微信deep3321