第三章:价差统计特征——均值回归检验、价差分布分析、价差波动率聚类、价差自相关性分析
做跨期套利,说白了就是在赌价差会“回来”。但怎么知道它一定会回来?靠感觉?不行。得靠统计。
这一章,我带你从四个维度把价差扒个底朝天。均值回归检验、分布形态、波动率行为、自相关性。这四个东西搞明白了,你基本就能判断一个价差序列能不能做套利,以及怎么做。
3.1 均值回归检验:价差到底会不会回来?
先问个问题:你看到一个价差序列,上下波动,看着挺美。但你怎么知道它不是随机游走?万一它一去不回头呢?
我个人习惯,第一步先做单位根检验。最常用的是ADF检验(Augmented Dickey-Fuller)。
简单说,ADF检验就是看价差序列有没有“记忆”。如果检验统计量小于临界值,说明序列平稳,均值回归特征显著。反之,可能就是随机游走,别碰。
核心要点:
- ADF检验的p值 < 0.05,通常认为存在均值回归
- p值 > 0.1,基本可以放弃这个品种的跨期套利
- 注意:检验前要确认价差序列没有明显的趋势项
我在项目中遇到过一件事。有一次做螺纹钢的跨期套利,价差看着挺规整,ADF检验p值0.03,我以为稳了。结果实盘跑了两个月,价差直接偏离了三个标准差,亏得我头皮发麻。后来复盘发现,那段时间钢厂环保限产,近月合约被资金硬拉,价差结构变了。所以,检验通过不代表永远有效,要定期重检。
# Python示例:ADF检验
import statsmodels.api as sm
from statsmodels.tsa.stattools import adfuller
# 假设spread是价差序列
result = adfuller(spread, autolag='AIC')
print(f'ADF统计量: {result[0]:.4f}')
print(f'p值: {result[1]:.4f}')
if result[1] < 0.05:
print('价差存在均值回归特征')
else:
print('价差不平稳,谨慎操作')
我的小技巧:除了ADF,我还会用KPSS检验做交叉验证。ADF原假设是“有单位根”,KPSS原假设是“平稳”。两个都通过,才放心。
3.2 价差分布分析:你的价差长什么样?
均值回归检验通过了,接下来要看价差的分布形态。说白了,就是搞清楚价差平时在什么范围内晃悠,极端值出现的概率有多大。
我一般看三个东西:
- 偏度(Skewness):正偏还是负偏?正偏说明价差容易向上偏离,负偏则相反。做套利时,这会影响你开仓的方向偏好。
- 峰度(Kurtosis):尖峰还是平峰?尖峰意味着价差经常在均值附近,但偶尔会有极端值。这对止损设置很重要。
- 分位数:5%、25%、50%、75%、95%分位数。我习惯用这个来设定开仓和止盈的阈值。
举个例子。我曾经做豆粕的跨期套利,发现价差分布是明显的尖峰厚尾。这意味着什么?意味着大部分时间价差在窄幅波动,但一旦突破,就是大行情。所以我设了比较宽的止损,防止被假突破洗出去。
# Python示例:分布统计
import numpy as np
from scipy import stats
skew = stats.skew(spread)
kurt = stats.kurtosis(spread, fisher=True) # 正态分布为0
quantiles = np.percentile(spread, [5, 25, 50, 75, 95])
print(f'偏度: {skew:.3f}')
print(f'峰度: {kurt:.3f}')
print(f'分位数: {quantiles}')
注意:峰度值如果大于3(或Fisher峰度大于0),说明尾部风险比正态分布大。这时候用正态分布假设去算概率,会严重低估极端风险。我曾经吃过这个亏,后来改用经验分布。
3.3 价差波动率聚类:大波动后面跟着大波动
做套利的人,最怕的不是波动,而是波动突然变大。因为波动率一上来,价差可能瞬间打穿你的止损线。
波动率聚类,说白了就是“大波动后面往往跟着大波动,小波动后面跟着小波动”。这不是玄学,是金融时间序列的典型特征。
我一般用两个方法来看:
- 滚动标准差:计算过去N期的价差标准差,看它是不是有聚集现象。
- ARCH效应检验:用拉格朗日乘子检验(LM检验),看残差是否存在条件异方差。
如果存在波动率聚类,那你的仓位管理就要更谨慎。我个人的做法是:当波动率处于高位时,降低仓位;波动率低位时,可以适当加仓。
# Python示例:波动率聚类可视化
import matplotlib.pyplot as plt
# 计算20日滚动标准差
rolling_std = spread.rolling(window=20).std()
plt.figure(figsize=(12, 6))
plt.subplot(2, 1, 1)
plt.plot(spread, label='价差')
plt.legend()
plt.subplot(2, 1, 2)
plt.plot(rolling_std, label='20日滚动标准差', color='red')
plt.legend()
plt.show()
避坑指南:我曾经在波动率高位时硬扛,结果连续被止损三次。后来我学乖了,波动率超过历史90%分位数时,直接暂停交易,等波动率回落再说。
3.4 价差自相关性分析:价差有没有“惯性”?
最后一个维度,自相关性。这玩意儿告诉你:今天的价差和昨天的价差有没有关系?
如果自相关系数显著为正,说明价差有趋势性,今天涨了明天可能继续涨。如果显著为负,说明价差有反转性,今天涨了明天可能跌。如果是零附近,那就是随机波动。
做跨期套利,我更喜欢负自相关。因为这意味着价差偏离后,回归的概率更大。正自相关的话,你追进去可能被趋势继续打脸。
我一般看两个东西:
- 自相关函数(ACF):看各阶滞后的相关系数。
- 偏自相关函数(PACF):排除中间变量后的净相关。
# Python示例:自相关分析
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8))
plot_acf(spread, lags=30, ax=ax1)
plot_pacf(spread, lags=30, ax=ax2)
plt.show()
实战经验:如果ACF在滞后1-3阶显著为负,且之后快速衰减到零附近,这是典型的均值回归信号。我遇到这种价差,基本会重仓做。但如果ACF衰减很慢,比如10阶以后还显著,那就要小心了,可能是长记忆过程,回归周期很长,不适合短线套利。
知识体系总览
这四个维度不是孤立的。我一般按这个流程走:先做均值回归检验,过了再看分布形态,然后检查波动率特征,最后分析自相关性。四个维度都符合预期,才敢上实盘。
下面这张图,是我自己总结的价差统计特征分析框架,你可以参考一下。
嗯,这一章的内容就到这。四个统计特征,每个都有它的用处。你回去可以把你的价差数据跑一遍,看看符合几条。如果四条都满足,那恭喜你,找到了一个不错的套利标的。
公众号:蓝海资料掘金营,微信deep3321