跨市场套利基础:价差概念、价差计算、价差序列的统计特征

各位同学,咱们今天聊点实在的。跨市场套利听起来高大上,但核心就一个字——。说白了,就是同一个东西,在两个地方卖不同价,你低价买、高价卖,赚的就是这个差价。

我刚开始做量化那会儿,总觉得套利是件很复杂的事。后来踩过几次坑才明白,价差才是整个套利体系的灵魂。你搞懂了价差,就搞懂了套利的一半。

一、价差是什么?

价差,英文叫 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σ作为阈值可能就不够用了。极端行情一来,你的止损可能直接被击穿。

四、知识体系总览

说了这么多,我画了一张图,帮你把跨市场套利的基础知识串起来。

跨市场套利基础:价差知识体系 价差(Spread) 价差概念 价差计算 统计特征 定义:两个资产价格之差 正价差 / 负价差 套利机会的根源 简单价差:P_A - P_B 调整价差:考虑汇率/单位 构建价差时间序列 均值与标准差 平稳性检验(ADF) 自相关与分布特征 核心逻辑:价差均值回归 → 套利机会 平稳性 + 阈值设定 = 可执行的套利策略

五、实战中的几点提醒

最后,我结合自己的经验,给大家几个实操建议:

  1. 数据频率要匹配:做日内套利用分钟级数据,做跨日套利用日线数据。别混着用。
  2. 交易成本必须算进去:跨市场套利涉及两个市场的佣金、印花税、滑点。我见过太多人算出来价差有利润,扣掉成本反而亏钱。
  3. 流动性是隐形杀手:有些市场看起来价差很大,但一进去就发现根本出不来。流动性差的品种,价差再大也别碰。
  4. 定期回测:价差的统计特征会随着市场环境变化。我每季度都会重新跑一遍回测,看看之前的阈值还合不合理。

一个小技巧: 刚开始做跨市场套利,建议从高流动性、低门槛的品种入手。比如沪深300期货和ETF之间的套利,或者黄金ETF和黄金期货之间的套利。这些品种数据好拿,流动性也够,适合练手。

好了,这一章的内容就到这里。价差是跨市场套利的基石,你把它吃透了,后面的策略设计、风险控制才能站得住脚。下一章我们会聊具体的套利策略类型,到时候见。


专注资料整理