第4章:价差分析——价差的定义、计算与统计特征
做跨市场套利,说白了就是吃价差这碗饭。
你想想看,同一个东西,在两个市场卖不同价格,这不就是明摆着的赚钱机会吗?但这里有个坑——价差不是一成不变的,它有自己的脾气。我做了这么多年量化,见过太多人一上来就冲进去,结果被价差的波动打得鼻青脸肿。
今天咱们就把价差这东西彻底聊透。
4.1 价差的定义:到底什么是价差?
价差,简单粗暴地说,就是两个市场同一品种的价格差。
比如沪铜和伦铜,一个在上海,一个在伦敦。沪铜价格48000元/吨,伦铜价格6000美元/吨,换算成人民币大概42000元/吨。那价差就是48000 - 42000 = 6000元/吨。
嗯,就这么简单。
但实际交易中,价差有几种常见形式:
- 绝对价差:P₁ - P₂,直接相减。适合同币种、同单位的品种。
- 相对价差:(P₁ - P₂) / P₂,或者P₁ / P₂。适合价格水平差异大的品种。
- 对数价差:ln(P₁) - ln(P₂)。统计上更稳定,我比较喜欢用这个。
我个人习惯:做统计套利时,优先用对数价差。为什么?因为对数价差近似等于收益率之差,更容易满足正态性假设。这个细节,很多教材不会讲。
4.2 价差的计算:手把手教你算
咱们拿一个真实案例来算。假设你有沪铜和伦铜的日线数据:
# Python代码:计算价差
import pandas as pd
import numpy as np
# 模拟数据
data = {
'date': ['2024-01-01', '2024-01-02', '2024-01-03'],
'SHFE_CU': [48000, 48200, 47900], # 沪铜,元/吨
'LME_CU': [6000, 6050, 5980] # 伦铜,美元/吨
}
df = pd.DataFrame(data)
# 汇率转换(假设汇率7.0)
df['LME_CU_CNY'] = df['LME_CU'] * 7.0
# 计算绝对价差
df['spread_abs'] = df['SHFE_CU'] - df['LME_CU_CNY']
# 计算相对价差
df['spread_rel'] = (df['SHFE_CU'] - df['LME_CU_CNY']) / df['LME_CU_CNY']
# 计算对数价差
df['spread_log'] = np.log(df['SHFE_CU']) - np.log(df['LME_CU_CNY'])
print(df[['date', 'spread_abs', 'spread_rel', 'spread_log']])
输出结果:
| 日期 | 绝对价差 | 相对价差 | 对数价差 |
|---|---|---|---|
| 2024-01-01 | 6000 | 0.1429 | 0.1335 |
| 2024-01-02 | 5850 | 0.1381 | 0.1294 |
| 2024-01-03 | 6040 | 0.1442 | 0.1347 |
避坑指南:我曾经在计算跨市场价差时,忽略了汇率的时间戳对齐问题。沪铜收盘是北京时间15:00,伦铜收盘是伦敦时间17:00(北京时间次日凌晨1:00)。直接拿收盘价算价差,会引入时间错配误差。后来我改用同一时间戳的日内数据,效果好了很多。
4.3 价差的统计特征:摸清它的脾气
价差不是随机游走的。它有自己的一套规律。我总结了三个核心统计特征:
4.3.1 均值回归性
这是套利策略的命根子。价差会在某个均值附近来回摆动,不会无限发散。
怎么验证?算一下自相关函数(ACF)。如果滞后1期的自相关系数显著为负,说明有均值回归倾向。
# 检验均值回归
from statsmodels.tsa.stattools import adfuller
# 对价差序列做ADF检验
result = adfuller(df['spread_abs'])
print(f'ADF统计量: {result[0]:.4f}')
print(f'p值: {result[1]:.4f}')
# p值小于0.05,说明价差是平稳的,有均值回归特性
我的经验:ADF检验的p值小于0.01,我才敢放心做套利。0.05到0.1之间,我会再观察一段时间。低于0.1的,我基本放弃——价差发散的风险太大。
4.3.2 波动率聚集性
价差的波动不是均匀的。大波动后面跟着大波动,小波动后面跟着小波动。这就是波动率聚集。
你想想看,如果价差突然从100跳到300,接下来几天大概率不会立刻回到100,而是在200-400之间来回震荡。
怎么量化?用GARCH模型拟合一下:
from arch import arch_model
# 拟合GARCH(1,1)模型
model = arch_model(df['spread_abs'] * 100, vol='Garch', p=1, q=1)
result = model.fit()
print(result.summary())
如果alpha和beta系数都显著,说明波动率聚集性存在。这时候做套利,要动态调整仓位——波动率大的时候减仓,波动率小的时候加仓。
4.3.3 尖峰厚尾分布
价差的分布不是正态的。它尖峰、厚尾。什么意思?
- 尖峰:大部分时间价差在均值附近,比正态分布更集中。
- 厚尾:极端值出现的概率比正态分布高得多。
这意味着什么?你按正态分布算出来的止损位,可能根本不够用。我曾经吃过这个亏——按3倍标准差设止损,结果价差直接干到5倍标准差,爆仓了。
重要提醒:做套利策略时,不要用正态分布假设来算VaR或止损。改用t分布或者极值理论(EVT)。这是血的教训换来的。
4.4 知识体系总览
下面这张图,把价差分析的核心逻辑串起来了:
4.5 实战中的几个关键点
聊了这么多理论,说点实在的。我在实盘中总结了几条铁律:
- 价差不是越窄越好。很多人看到价差收窄就兴奋,觉得要回归了。不一定。价差可能是在酝酿更大的发散。
- 关注价差的波动率。波动率低的时候入场,波动率高的时候离场。这个节奏踩对了,胜率能提高不少。
- 别迷信历史均值。价差的均值会漂移。我见过太多人死抱着两年前的均值不放,结果亏得底裤都不剩。定期更新均值,比如用60日滚动均值。
- 手续费和滑点要算进去。价差套利本来就是薄利,手续费一扣,可能就变成负的了。我习惯在模拟回测时把滑点设成1个tick,手续费按实际算。
一个小技巧:我每次分析价差时,会同时看三个时间维度——日线、小时线、15分钟线。日线看大趋势,小时线找入场点,15分钟线做精细调整。三个维度共振的时候,胜率最高。
价差分析这块,说白了就是搞清楚两个市场之间的"价格差"到底有什么规律。你把它摸透了,套利策略就成功了一半。剩下的,就是执行和纪律了。