4. 价差计算:实时计算不同交易所之间的价差,识别套利机会

价差计算,说白了就是套利策略的“眼睛”。

你想想看,跨市场套利的核心逻辑就一句话:同一个资产,在不同地方卖不同价。我们要做的,就是实时捕捉这个差价,然后快速出手。

我个人习惯把价差计算拆成三个层次:原始价差归一化价差信号价差。咱们一层层剥开。

4.1 原始价差:最朴素的减法

最直接的方式,就是拿交易所A的价格减去交易所B的价格。

比如BTC/USDT,币安报价50000,OKX报价50020,那价差就是20 USDT。

def raw_spread(price_a, price_b):
    return price_a - price_b

但这里有个坑——交易对可能不一样。我在项目中遇到过,有的交易所用BTC/USDT,有的用BTC/USD,还有的用XBT/USD。直接减?那算出来的价差毫无意义。

⚠️ 我曾经踩过的坑: 不同交易所的报价精度不同。币安报价到小数点后两位,Bitfinex可能到小数点后五位。直接相减会产生大量“假价差”。建议先统一精度,再计算。

4.2 归一化价差:消除“刻度”差异

原始价差有个问题:BTC价格50000时,20 USDT的价差算大;但价格5000时,20 USDT的价差就很大了。所以我们需要归一化。

我常用的归一化公式:

def normalized_spread(price_a, price_b):
    return (price_a - price_b) / ((price_a + price_b) / 2) * 10000  # 返回基点(bps)

用基点(bps)表示,1个基点 = 0.01%。这样不管价格高低,价差都能统一比较。

💡 我的经验: 阈值设置上,我一般用5-10 bps作为套利信号的起点。低于5 bps,扣除手续费后基本没利润;高于20 bps,就要警惕是不是数据延迟或者交易所出问题了。

4.3 信号价差:过滤噪音,识别真机会

实时价差波动很大,直接拿原始数据做交易,你会被来回打脸。我建议加一层信号处理。

常用的方法:

  • 移动平均平滑:用过去N笔价差的均值代替当前值
  • 中位数滤波:剔除极端值,取中位数
  • 标准差阈值:价差超过均值±2倍标准差才触发信号
import numpy as np

def signal_spread(spread_history, window=20, threshold=2):
    mean = np.mean(spread_history[-window:])
    std = np.std(spread_history[-window:])
    current = spread_history[-1]
    
    if current > mean + threshold * std:
        return 'long_spread'  # 价差过大,做空价差
    elif current < mean - threshold * std:
        return 'short_spread' # 价差过小,做多价差
    else:
        return 'no_signal'

📌 避坑指南: 我曾经用5秒窗口做平滑,结果发现遇到交易所API抖动时,平滑后的价差反而滞后严重。后来改成中位数滤波+3秒窗口,效果好了很多。嗯,这里要注意:窗口大小要根据你的交易频率来调。

4.4 多交易所价差矩阵

如果你同时监控3个以上交易所,手动算价差就太累了。我习惯用价差矩阵,一目了然。

交易所 币安 OKX Bybit Bitget
币安 0 +12.3 bps -5.1 bps +8.7 bps
OKX -12.3 bps 0 -17.4 bps -3.6 bps
Bybit +5.1 bps +17.4 bps 0 +13.8 bps
Bitget -8.7 bps +3.6 bps -13.8 bps 0

正数表示行交易所价格高于列交易所,负数反之。一眼就能看出哪个交易所最便宜、哪个最贵。

4.5 核心逻辑流程图

下面这张图,是我做套利系统时画的价差计算核心流程。你看一遍就懂了。

价差计算核心流程 交易所A 实时价格 交易所B 实时价格 原始价差 = A - B 归一化价差 = (A-B) / 均价 * 10000 单位:基点(bps) 信号价差处理 移动平均平滑 | 中位数滤波 | 标准差阈值 过滤噪音,识别真实套利机会 输出:套利信号 价差过大 → 做空价差 | 价差过小 → 做多价差

4.6 实战中的几个要点

讲完理论,说点实在的。我在实盘里总结了几条经验:

  1. 数据对齐是前提:两个交易所的报价时间戳必须对齐。差1秒,价差可能就变了。我一般用WebSocket推送,不用REST轮询。
  2. 手续费要算进去:别只看价差。币安maker手续费0.1%,OKX 0.08%,一进一出就是0.18%。价差没超过这个数,做了就是亏。
  3. 滑点不可忽视:你看到的价差是盘口价,实际成交可能滑点。我习惯在价差基础上再减5 bps作为安全垫。
  4. 网络延迟是隐形杀手:我曾经因为服务器在东京,连美国交易所,价差信号到了,单子已经没了。后来把服务器放在交易所同机房,延迟从80ms降到2ms。

🔥 核心总结: 价差计算不是简单的减法。原始价差 → 归一化价差 → 信号价差,三步走,才能过滤掉90%的假信号。记住:你赚的不是价差,而是别人没看到的价差

专注资料整理