第三节:价差分析——套利交易的核心密码
做跨市场套利这么多年,我越来越觉得,价差分析就是整个交易体系的「心脏」。你策略再花哨,风控再严密,如果价差分析没做到位,一切都是空中楼阁。今天我就把这块硬骨头拆开揉碎了讲给你听。
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个月重新检验一次,或者每次换月时重新计算。
知识体系总览
下面这张图是我自己整理的价差分析框架,你可以把它当作操作手册来用:
这张图把价差分析的三个核心模块串起来了。你从左边开始,先选好计算方法,然后分析统计特征,最后做平稳性检验。三步走完,才能进入实战环节。
最后说一句:价差分析不是一次性工作。市场在变,品种在变,你的模型也要跟着变。我每周都会重新跑一遍平稳性检验,确保模型没有「过期」。这听起来麻烦,但能帮你省下大笔亏损。
公众号:蓝海资料掘金营,微信deep3321