第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} 个时间单位")
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 价差分析的知识体系
为了让大家更直观地理解价差分析的完整框架,我画了一张结构图:
3.5 实战中的注意事项
讲完了理论,说几个实战中容易踩的坑:
- 数据频率要匹配:做价差分析时,两个品种的数据必须用同一时间戳。我见过有人用1分钟K线对5分钟K线,算出来的价差全是错的。
- 注意交易成本:价差回归的利润,往往很薄。如果交易成本太高,可能赚的钱还不够交手续费。我一般会先算一下盈亏比,低于2:1的就不做了。
- 警惕结构突变:价差的均值不是一成不变的。交易所调整费率、合约规则变更、市场结构变化,都可能导致价差的均值发生偏移。我习惯每周重新计算一次均值,动态调整。
嗯,今天就先聊到这儿。下一章咱们会深入讲价差的平稳性检验和协整关系,那是构建套利策略的另一个关键环节。
公众号:蓝海资料掘金营,微信deep3321