跨市场套利基础:价差概念、价差计算、价差序列的统计特征
各位同学,咱们今天聊点实在的。跨市场套利听起来高大上,但核心就一个字——差。说白了,就是同一个东西,在两个地方卖不同价,你低价买、高价卖,赚的就是这个差价。
我刚开始做量化那会儿,总觉得套利是件很复杂的事。后来踩过几次坑才明白,价差才是整个套利体系的灵魂。你搞懂了价差,就搞懂了套利的一半。
一、价差是什么?
价差,英文叫 Spread,就是两个相关资产价格之间的差值。
举个例子:
- 沪深300股指期货(IF)在上海中金所交易
- 沪深300ETF(510300)在沪深交易所交易
- 它们都跟踪沪深300指数,理论上价格应该差不多
但实际上呢?期货价格和ETF价格之间总会有差异。这个差异,就是价差。
价差公式:
价差 = 资产A价格 - 资产B价格
或者更严谨一点:
价差 = 期货价格 - 现货价格 × 转换因子
嗯,这里要注意一点。价差可以是正的,也可以是负的。正价差说明期货贵、现货便宜;负价差则相反。我个人习惯把价差看作一个随机变量,它会在某个均值附近来回波动。
二、价差怎么算?
计算价差本身不难,但有几个细节容易翻车。我给大家拆解一下。
2.1 简单价差
最简单的场景:两个资产面值相同、合约乘数一致。
# 简单价差计算示例
price_A = 5200.0 # 期货价格
price_B = 5185.5 # ETF价格
spread = price_A - price_B
print(f"价差 = {spread:.2f}") # 输出:14.50
这种计算方式适用于同品种、同面值的跨市场套利。比如沪港通下的同一只股票,A股和H股之间。
2.2 调整后的价差
但现实往往没那么简单。不同市场的合约规格、交易单位、汇率都可能不同。这时候就需要做标准化处理。
我的经验: 做跨市场套利,最怕的就是单位不统一。我曾经在黄金跨市场套利上吃过亏——伦敦金按盎司报价,上海金按克报价,忘了换算,直接算价差,结果亏了一笔手续费。
# 调整后的价差计算
# 场景:伦敦金(XAUUSD)vs 上海金(AU.SHF)
xau_price = 1950.0 # 美元/盎司
au_price = 450.0 # 元/克
usd_cny = 7.20 # 汇率
# 统一单位:将伦敦金转换为元/克
xau_cny_per_gram = xau_price * usd_cny / 31.1035
# 计算调整后的价差
adjusted_spread = xau_cny_per_gram - au_price
print(f"调整后价差 = {adjusted_spread:.2f} 元/克")
你看,多了两步:汇率换算、单位换算。这就是跨市场套利比同市场套利麻烦的地方。
2.3 价差序列的构建
单点的价差没太大意义。我们需要构建一个价差时间序列,才能分析它的规律。
import pandas as pd
import numpy as np
# 假设我们有期货和现货的日线数据
# df_futures: 期货价格序列
# df_spot: 现货价格序列
# 构建价差序列
spread_series = df_futures['close'] - df_spot['close']
# 重命名
spread_series.name = 'spread'
# 查看基本统计量
print(spread_series.describe())
关键点: 价差序列必须是同步数据。两个市场的交易时间可能不同,比如A股9:30开盘,港股9:00开盘。如果你用不同时间点的价格算价差,那就是在制造噪音。
三、价差序列的统计特征
有了价差序列,我们就要开始分析它了。为什么要分析?因为套利策略的核心假设就是:价差会回归均值。
说白了,价差不会一直大,也不会一直小。它像一根橡皮筋,拉长了总会弹回来。我们要做的就是找到它「弹回来」的规律。
3.1 均值与标准差
最基本的两个统计量:
| 统计量 | 含义 | 套利中的用途 |
|---|---|---|
| 均值(μ) | 价差的长期平均水平 | 判断当前价差是否偏离正常水平 |
| 标准差(σ) | 价差的波动幅度 | 设定开仓/平仓的阈值 |
我个人习惯用均值±2倍标准差作为开仓信号。当价差偏离到2σ以上时,说明市场出现了明显的定价错误,这时候进场套利,胜率比较高。
3.2 平稳性检验
这是套利策略能不能赚钱的关键。如果价差序列不平稳,那它可能越走越远,永远不会回来。你的套利就会变成「套牢」。
常用的检验方法是ADF检验(Augmented Dickey-Fuller Test)。
from statsmodels.tsa.stattools import adfuller
# 对价差序列进行ADF检验
result = adfuller(spread_series.dropna())
print(f"ADF统计量: {result[0]:.4f}")
print(f"p值: {result[1]:.4f}")
if result[1] < 0.05:
print("价差序列平稳,适合做套利策略")
else:
print("价差序列不平稳,需要进一步处理")
避坑指南: 我曾经在原油跨市场套利上栽过跟头。当时没做平稳性检验,直接按均值回归的思路做,结果价差一路扩大,亏了3%才止损。后来一查,原来是两个市场的仓储成本结构发生了变化,价差的均值已经漂移了。
所以,每过一段时间就要重新检验平稳性,别偷懒。
3.3 自相关性
价差序列还有一个重要特征:自相关性。简单说,就是今天的价差和昨天的价差有没有关系。
如果自相关系数高,说明价差有趋势性,不适合做均值回归套利。如果自相关系数低,说明价差随机波动,更适合做回归策略。
# 计算价差序列的自相关系数(滞后1期)
autocorr = spread_series.autocorr(lag=1)
print(f"一阶自相关系数: {autocorr:.4f}")
# 如果 autocorr 接近0,说明随机性强
# 如果 autocorr 接近1,说明趋势性强
3.4 分布特征
价差序列的分布也很重要。我一般会看两个指标:
- 偏度(Skewness):价差是否对称分布。正偏度说明价差更容易出现大的正值,负偏度则相反。
- 峰度(Kurtosis):价差是否容易出现极端值。峰度大于3说明厚尾,极端行情比正态分布更频繁。
你想想看,如果价差是厚尾分布,那用2σ作为阈值可能就不够用了。极端行情一来,你的止损可能直接被击穿。
四、知识体系总览
说了这么多,我画了一张图,帮你把跨市场套利的基础知识串起来。
五、实战中的几点提醒
最后,我结合自己的经验,给大家几个实操建议:
- 数据频率要匹配:做日内套利用分钟级数据,做跨日套利用日线数据。别混着用。
- 交易成本必须算进去:跨市场套利涉及两个市场的佣金、印花税、滑点。我见过太多人算出来价差有利润,扣掉成本反而亏钱。
- 流动性是隐形杀手:有些市场看起来价差很大,但一进去就发现根本出不来。流动性差的品种,价差再大也别碰。
- 定期回测:价差的统计特征会随着市场环境变化。我每季度都会重新跑一遍回测,看看之前的阈值还合不合理。
一个小技巧: 刚开始做跨市场套利,建议从高流动性、低门槛的品种入手。比如沪深300期货和ETF之间的套利,或者黄金ETF和黄金期货之间的套利。这些品种数据好拿,流动性也够,适合练手。
好了,这一章的内容就到这里。价差是跨市场套利的基石,你把它吃透了,后面的策略设计、风险控制才能站得住脚。下一章我们会聊具体的套利策略类型,到时候见。