跨市场价差套利:从价格偏离到可控执行

本文系统介绍跨市场价差套利的核心原理与工程实践。从 Bid/Ask 定义真实价差,到统计入场阈值、成本模型、双边下单、退出策略和风险控制,结合 Binance 与 Exness 黄金案例,讲解如何构建一个可长期运行的量化套利系统,而不仅仅是一个简单的套利策略。

跨市场价差套利:从价格偏离到可控执行
Photo by Sandisk / Unsplash

引言

同一个资产,在不同市场里的价格并不会永远完全一致。多数时候,这种差异小到不足以覆盖成本;但在行情快速跳动、流动性短暂变薄、报价源更新不同步,或者某个市场交易约束发生变化时,价差会被短暂拉开。

价差套利做的不是预测下一根 K 线,而是观察这种偏离是否显著、是否有历史规律、是否能覆盖交易成本,并在风险可控的前提下同时建立两边仓位。它赚的不是单边方向,而是价格关系从“异常”回到“正常”的过程。

举个例子:假设同一类黄金合约在 Binance 报 4035.54,Exness 报 4031.24,两边价差约 4.30。正常情况下,这个价差可能在 1-4 附近来回波动。如果你认为 4 附近已经偏高,就可以考虑在相对低价的一边做多、相对高价的一边做空,等待价差回落到 1-2 区间。

套利不一定只赚价差。永续合约一侧的资金费如果方向有利,可能成为隐藏收益;经纪商侧的隔夜费也可能因为品种、账户类型或地区规则不同而较低甚至不收。但这些都不应该单独成为入场理由,只能作为成本模型的一部分动态评估。


价差怎么定义

跨市场价差不能简单用两个最新价相减。真正能成交的价格取决于方向:买入要吃 ask,卖出只能打 bid。

以 Binance 和 Exness 的黄金报价为例:

市场BidAsk
Binance4035.534035.55
Exness4031.234031.25

两个方向的入场价差不同:

方向入场价差结果
做多 Exness / 做空 Binance4035.53 - 4031.254.28
做多 Binance / 做空 Exness4031.23 - 4035.55-4.32

价差为正,才说明这个方向存在理论空间。系统会同时计算两个方向,再选择更优的一边。

实际交易里通常会维护三种口径:

  • 入场价差:按真实买卖方向计算,用于判断能不能开仓。
  • 平仓价差:按反向操作计算,用于判断价差是否已经回归。
  • 中间价差:用 mid price 计算,适合研究和画图,但不直接用于下单。
价差在两个市场之间波动,当偏离超过统计阈值时产生套利机会

成本决定能不能做

套利看起来赚的是价差,实际赚的是扣除全部交易摩擦后的净价差。如果成本模型过于乐观,系统会把很多“看起来有利润”的机会误判为可交易。

主要成本包括:

成本项说明
交易手续费maker/taker、固定佣金或阶梯费率
买卖价差两边 bid/ask 本身就是隐含成本
资金费永续合约资金费可能是成本,也可能是收益
隔夜费经纪商 swap 可能存在,也可能因规则不同不收
滑点看到的报价不等于最终成交均价
汇率损耗计价货币不同,需要统一换算

假设单位价差从 4.28 回落到 1.5,回归空间是 2.78。如果交易 10 单位,理论价差收益约 27.8。扣除手续费、点差、滑点、资金费和隔夜费之后,剩下的才是真正利润。

因此系统需要一条成本保护线。常见做法是取历史成本的偏高分位,例如 P90。只有当前价差超过这条保护线,并且还有足够净利润空间,才进入下一步。

不同品种的成本结构差异显著,成本模型需要保守

什么时候入场

固定阈值很容易失效。一个品种的价差长期在 1-4 之间波动,另一个品种可能只有几个最小跳动单位;同一个阈值放在不同品种上,要么太宽松,要么完全不触发。

更合理的方式是让每个品种用自己的历史分布计算入场线:

reachable_entry = max(P75(entry_spreads), mean + 1.0 * std)
entry_threshold = max(reachable_entry, min_entry_spread)

含义很直观:

  • P75 保证当前价差在历史上已经偏大。
  • mean + 1σ 保证偏离不是普通噪声。
  • min_entry_spread 防止冷启动阶段统计样本过少。

假设某个黄金跨市场价差的 P75 是 3.2,成本保护线是 0.8。当前价差 4.28,则:

  • 4.28 高于入场线 3.2。
  • 4.28 覆盖成本保护线 0.8。
  • 每单位理论空间约 3.48。

这时才算进入“可执行候选”。它还不是最终下单,因为下单前还要重新确认行情、账户、交易时段和流动性。


从信号到下单

信号说“可以买”,不代表立刻下单。两个交易场所是独立系统,不存在分布式事务。如果一腿成交、另一腿失败,就会形成单腿暴露,这是套利系统最危险的状态。

下单前至少要确认几件事:

检查目的
信号是否仍然有效防止使用过期机会
品种映射是否正确防止下错合约或数量
当前是否允许交易交易时段、只平仓、账户权限
报价是否同步防止假价差
账户和订单规模是否安全防止过度使用保证金
流动性是否足够防止目标数量无法成交

最关键的是执行前复核。扫描阶段看到价差 4.28,等到准备下单时,行情可能已经变成 2.8。如果入场线是 3.2,这笔交易就应该放弃。套利系统不能信任旧缓存,必须在执行前重新计算一次。

仓位大小也不能只按名义价值粗算。不同市场的合约规格、最小下单量和数量步进往往不同。系统需要先把两边统一到同一个 USD 名义价值口径,再分别换算成合法数量。

从信号触发到双边下单,每一步都可能中止执行


什么时候退出

开仓后,系统等待的不是价格上涨或下跌,而是价差回归。常见退出条件有三类:

退出条件说明
价差回归平仓价差达到历史低分位或目标退出线
超时退出持仓太久且利润仍达标,先释放资金
利润保护估算利润不足时不自动平仓

退出线可以这样理解:

退出线 = min(P25(历史平仓价差), 入场价差 - 成本 - 利润缓冲)

如果入场价差是 4.28,成本是 0.8,退出线是 1.5,那么价差回到 1.5 时,单位利润大约是:

4.28 - 1.5 - 0.8 = 1.98

如果持仓时间已经很长,价差只回到 2.2,但利润仍然达标,也可以通过超时退出先锁定收益。因为价差回归不是必然的,资金占用、资金费和隔夜费都会随着时间累积。

平仓不是等一个条件,而是多个退出条件共同保护收益和资金效率

风控比信号更重要

价差套利最怕的不是没有机会,而是把噪声当机会、把小机会做成大风险。

风控模块要覆盖几类问题:

  • 行情抖动:价差在入场线附近反复穿越时,暂停新开仓。
  • 报价过期:任一市场报价太旧,直接拒绝执行。
  • 交易时段限制:某些市场可能只允许平仓,不允许开仓。
  • 单腿异常:一腿成交另一腿失败时,先停止扩大风险,再决定补腿、冲销或人工介入。
  • 过热标记:价差超过极端分位时打标提示,但不一定直接阻断。

断路器是一个典型例子。当短时间内价差方向频繁反转,系统会暂停该品种的新开仓,等市场稳定后再恢复。实际实现中,最好把“禁止新开仓”和“允许减风险平仓”拆开,避免风控模块在极端行情下反而阻止退出。


工程上的几个取舍

真正让套利系统能长期运行的,往往不是策略公式,而是工程细节。

成本估算要保守。 手续费、点差、资金费、隔夜费、滑点和汇率损耗都可能吃掉利润。资金费和隔夜费还有方向性,有时是成本,有时是收益。

报价估算要回写真实成交。 开仓时看到的是报价,最终拿到的是成交均价。滑点、部分成交和延迟都会让两者不同。后续平仓必须基于真实成交价差,而不是触发信号时的估算价差。

热路径和历史数据要分开。 高频扫描适合走内存状态,历史快照可以低频批量持久化。扫描快照可以少量丢失,订单、成交和对冲组状态不能丢。

实盘要渐进验证。 先模拟,再用小额探针校准真实成交质量,最后才进入受保护实盘。模拟环境觉得有利润,不代表真实市场仍然有利润。


总结

跨市场价差套利的核心不是“哪里便宜就买,哪里贵就卖”这么简单。真正要解决的是:

  • 如何用 bid/ask 定义可成交价差。
  • 如何用统计分布判断当前偏离是否足够大。
  • 如何把手续费、点差、资金费、隔夜费和滑点纳入成本。
  • 如何在双边下单中控制单腿风险。
  • 如何在异常行情里保护资金,而不是盲目追机会。

策略思路是公开的,成本模型和信号计算也不是秘密。能不能稳定完成高频计算、能不能在双边下单中控制风险、能不能在异常情况下正确恢复,才是套利系统能否长期运行的关键。