跨市场价差基础
做量化交易这些年,我接触过不少策略。但要说最让我着迷的,还是价差回归策略。说白了,它就是在不同市场之间找那个「不该存在的价差」,然后赌它一定会消失。今天咱们就来聊聊这个基础中的基础——跨市场价差到底是什么,它从哪来,又有什么统计规律。
什么是跨市场价差
先给个最直白的定义:跨市场价差,就是同一资产在不同市场上的价格差。
举个例子。你想想看,苹果公司的股票,在纽交所和纳斯达克都能交易。理论上,同一时刻两个市场的价格应该一样。但现实呢?经常不一样。这个「不一样」就是价差。
用公式表示很简单:
价差 = 价格_A - 价格_B
其中A和B代表两个不同的市场。比如上海和香港的同一只股票,或者芝加哥和伦敦的黄金期货。
核心要点:价差不是随便找两个价格相减就完事了。你得确保两个市场交易的是「同一资产」或「高度相关的资产」。我在项目中见过有人把A股和H股的价格直接相减,结果发现价差序列完全不回归——后来才发现,两个市场的股票虽然代码一样,但流通股结构完全不同。
价差是怎么形成的
好,定义清楚了。那问题来了:为什么同一个东西,在不同市场上会卖出不同价格?
我总结下来,主要有三个原因。
1. 信息不对称
这个最好理解。不同市场的参与者,获取信息的速度不一样。
比如某家公司突然发布了一个利好消息。纽约的交易员可能比伦敦的交易员早几毫秒看到。于是纽约的价格先涨,伦敦的还没动。价差就出来了。
嗯,这里要注意:这种价差通常转瞬即逝。高频交易者就是靠这个吃饭的。但对我们做均值回归的人来说,这种「噪音价差」不是好猎物。
2. 交易成本
这个因素很多人会忽略。我刚开始做跨市场套利时也吃过亏。
不同市场的交易成本不一样。比如:
- 手续费:有的市场收万分之三,有的收万分之八
- 印花税:有些市场有,有些没有
- 汇率成本:跨市场交易往往涉及货币兑换
这些成本加起来,会形成一个「无套利区间」。价差只要落在这个区间内,套利就不划算。说白了,交易成本就像一层「保护膜」,让价差可以在一定范围内自由波动。
个人经验:我建议你在计算价差时,一定要把交易成本算进去。我曾经在黄金跨市场套利中,忽略了伦敦和纽约的仓储费差异,结果回测看起来很漂亮,实盘一跑就亏。后来我把成本模型细化到每笔交易,才真正稳定下来。
3. 流动性差异
这个因素最微妙。不同市场的流动性不一样,导致价格对订单的敏感度也不同。
举个例子。一个流动性好的市场,你卖100手可能只把价格压低0.1%。但流动性差的市场,同样卖100手,价格可能直接砸下去1%。
为什么会这样?因为流动性差的市场,买卖盘薄,大单容易造成价格冲击。这种冲击会形成暂时的价差,等流动性恢复后,价差才会回归。
我记得有一次做新加坡和香港的股指期货价差,发现价差总是在开盘和收盘时特别大。后来一查,原来是两个市场的开盘时间不同,流动性错配导致的。
价差序列的统计特征
了解了价差怎么来的,接下来就是关键了:我们怎么用统计工具去分析它?
我个人习惯,拿到一个价差序列,先看三个东西。
1. 平稳性
这是价差回归策略的命根子。如果价差序列不平稳,那回归就是扯淡。
什么叫平稳?简单说,就是价差的均值和方差不会随时间变化。用数学语言说,就是序列的统计性质在时间平移下保持不变。
检验平稳性,最常用的方法是ADF检验。代码很简单:
from statsmodels.tsa.stattools import adfuller
# 假设spread是价差序列
result = adfuller(spread)
print(f'ADF统计量: {result[0]}')
print(f'p值: {result[1]}')
if result[1] < 0.05:
print('价差序列平稳,可以做回归策略')
else:
print('价差不平稳,需要差分或找其他配对')
这里有个坑:ADF检验的p值阈值,我建议不要死守0.05。在实盘中,我一般用0.01,宁可错过一些机会,也不要做错。
2. 自相关性
价差序列的自相关性,决定了我们能不能用历史数据预测未来。
如果价差的自相关系数在滞后1期、2期时显著不为0,说明价差有「记忆性」。也就是说,今天的价差会影响明天的价差。这对回归策略是好事,因为我们可以利用这种记忆性来建仓。
但要注意:自相关性太强也不行。我曾经遇到一个价差序列,自相关系数在滞后10期还高达0.8。后来发现,那是因为两个市场存在结构性差异,价差根本不会回归。
避坑指南:我曾经在原油跨市场价差上吃过亏。当时看自相关图觉得完美,结果实盘发现价差在某个区间内来回震荡,但就是不回归到均值。后来才明白,那是两个市场的仓储成本差异导致的「伪平稳」。所以,自相关分析一定要结合基本面理解。
3. 均值回归速度
这个指标决定了策略的赚钱效率。回归速度越快,我们持仓时间越短,资金利用率越高。
衡量回归速度,我常用半衰期(half-life)。它表示价差偏离均值后,回到均值一半所需的时间。
计算半衰期的代码:
import numpy as np
from sklearn.linear_model import LinearRegression
def half_life(spread):
spread_lag = spread.shift(1).dropna()
spread_diff = spread.diff().dropna()
# 对齐数据
y = spread_diff.values
x = spread_lag.values.reshape(-1, 1)
model = LinearRegression().fit(x, y)
theta = model.coef_[0]
hl = -np.log(2) / theta
return hl
hl = half_life(spread)
print(f'半衰期: {hl:.2f} 天')
一般来说,半衰期在5-20天之间的价差,最适合做均值回归策略。太短了(比如1-2天),交易成本占比太高;太长了(比如超过30天),资金占用太久,年化收益会被拉低。
知识体系总览
说了这么多,我画了一张图,帮你把这一章的核心逻辑串起来:
这张图把咱们这一章的内容都串起来了。从定义出发,到三个形成原因,再到三个统计特征。你想想看,是不是每个环节都环环相扣?
最后说一句:跨市场价差的基础,说白了就是「找不同」——找不同市场之间的价格差异,理解它为什么存在,然后用统计工具去量化它。这一步做扎实了,后面的策略设计才能站得住脚。
公众号:蓝海资料掘金营,微信deep3321