价差定义:价差的计算方式、标准化处理与统计特征
做套利交易,说白了就是在玩「价差」这个核心变量。
你想想看,无论你是做跨期套利、跨品种套利,还是期现套利,最终盯着的都是那个价差。价差怎么算?怎么让它变得干净、可用?它的统计特征又告诉我们什么?
这一节,我把这些基础但关键的东西掰开揉碎了讲清楚。
一、价差的计算方式
价差的计算,听起来简单——两个价格相减嘛。但实际项目中,我见过太多人在这里栽跟头。
1. 简单价差(绝对价差)
最直观的方式:
价差 = P1 - P2
比如螺纹钢RB2301和RB2305,当前价格分别是4200和4150,价差就是50。
但这里有个坑:价格尺度不同。你拿黄金和白银做价差,黄金1800美元,白银25美元,直接相减?那价差几乎被黄金价格完全主导。这就不合理了。
2. 标准化价差(Z-score)
为了解决尺度问题,我们通常对价差做标准化处理:
Z = (当前价差 - 价差均值) / 价差标准差
Z-score告诉我们:当前价差偏离均值多少个标准差。Z=2,意味着价差处于历史高位,可能回归。
我个人习惯用滚动窗口计算均值和标准差,比如60期滚动窗口。为什么?因为市场结构会变,固定窗口容易过时。
3. 对数价差
对于价格序列存在趋势或波动率随时间变化的情况,对数价差更合适:
对数价差 = ln(P1) - ln(P2) = ln(P1/P2)
这实际上就是价格比的对数。它的好处是:消除了绝对价格水平的影响,而且更容易处理波动率非平稳的问题。
二、标准化处理:让价差变得「干净」
原始价差往往包含噪声、异常值、非平稳成分。直接用它做交易信号,你会被假突破坑死。
1. 去异常值处理
我常用的方法:
- MAD(中位数绝对偏差)法:比标准差更稳健,不受极端值影响
- 分位数截断法:去掉上下1%或0.5%的极端值
# MAD去异常值示例
import numpy as np
def remove_outliers_mad(series, threshold=3):
median = np.median(series)
mad = np.median(np.abs(series - median))
modified_z_scores = 0.6745 * (series - median) / mad
return series[np.abs(modified_z_scores) < threshold]
2. 去趋势处理
如果价差存在明显趋势,说明两个品种的价差关系在漂移。这时候需要:
- 差分处理:一阶差分后做平稳性检验
- HP滤波:分离趋势成分和周期成分
- 回归残差法:用P1对P2做回归,取残差作为调整后的价差
我记得有一次做豆粕和菜粕的套利,简单价差看起来有趋势,但用回归残差法处理后,发现其实是两个品种的供需基本面在变化,价差关系本身是稳定的。这个发现让我避免了错误开仓。
3. 波动率标准化
不同时间段的波动率不同。2015年股灾期间和2020年疫情期间,价差的波动幅度完全不是一个量级。所以:
标准化价差 = 原始价差 / 近期波动率(如ATR或滚动标准差)
这样处理后,交易信号的阈值可以统一设置,不用频繁调整参数。
三、统计特征:读懂价差的「脾气」
价差处理干净了,接下来要摸清它的脾气。我一般从以下几个维度分析:
1. 平稳性检验
这是套利交易的前提。如果价差不平稳,说明两个品种没有长期均衡关系,套利逻辑不成立。
| 检验方法 | 适用场景 | 我的建议 |
|---|---|---|
| ADF检验 | 最常用,适合大多数情况 | 默认使用,p值<0.05认为平稳 |
| PP检验 | 存在异方差时更稳健 | 作为ADF的补充验证 |
| KPSS检验 | 原假设为平稳(与ADF相反) | 交叉验证,避免单一检验的偏差 |
2. 自相关结构
价差序列的自相关函数(ACF)告诉我们:价差偏离后,需要多久回归。
- ACF快速衰减 → 价差均值回归速度快,适合短线套利
- ACF缓慢衰减 → 价差有记忆性,回归需要时间,适合中线持仓
我一般看ACF的1阶和5阶系数。如果1阶系数大于0.8,说明价差有很强的趋势性,做均值回归策略要小心——你可能在逆势交易。
3. 分布特征
价差的分布形态直接影响交易信号的设置:
- 偏度:正偏态说明价差更容易出现极端正值,做空价差时要更谨慎
- 峰度:高峰度说明价差有厚尾特征,极端行情比正态分布更频繁
我曾经在原油跨期套利中,发现价差的峰度高达8(正态分布是3)。这意味着用2倍标准差作为开仓阈值,一年会被假突破坑好几次。后来我把阈值调整到2.5倍标准差,效果好了很多。
4. 半衰期
半衰期是量化均值回归速度的指标。它告诉我们:价差偏离后,平均需要多长时间回归一半。
# 计算半衰期
import statsmodels.api as sm
def half_life(series):
lag_series = series.shift(1).dropna()
diff_series = series.diff().dropna()
# 对齐数据
y = diff_series.values
x = lag_series.values
x = sm.add_constant(x)
model = sm.OLS(y, x).fit()
theta = model.params[1]
half_life = -np.log(2) / theta
return half_life
半衰期短(比如1-2小时),适合高频套利;半衰期长(比如5-10天),适合低频、大仓位套利。
四、知识体系总览
下面这张图,把价差定义、计算、标准化、统计特征串起来了。你可以把它当作一个检查清单:
嗯,价差这块内容就这些。说白了,计算方式选对、标准化做干净、统计特征摸透,你的套利策略就成功了一半。剩下的,就是执行和风控了。