跨市场价差套利:从价格偏离到可控执行
本文系统介绍跨市场价差套利的核心原理与工程实践。从 Bid/Ask 定义真实价差,到统计入场阈值、成本模型、双边下单、退出策略和风险控制,结合 Binance 与 Exness 黄金案例,讲解如何构建一个可长期运行的量化套利系统,而不仅仅是一个简单的套利策略。
引言
同一个资产,在不同市场里的价格并不会永远完全一致。多数时候,这种差异小到不足以覆盖成本;但在行情快速跳动、流动性短暂变薄、报价源更新不同步,或者某个市场交易约束发生变化时,价差会被短暂拉开。
价差套利做的不是预测下一根 K 线,而是观察这种偏离是否显著、是否有历史规律、是否能覆盖交易成本,并在风险可控的前提下同时建立两边仓位。它赚的不是单边方向,而是价格关系从“异常”回到“正常”的过程。
举个例子:假设同一类黄金合约在 Binance 报 4035.54,Exness 报 4031.24,两边价差约 4.30。正常情况下,这个价差可能在 1-4 附近来回波动。如果你认为 4 附近已经偏高,就可以考虑在相对低价的一边做多、相对高价的一边做空,等待价差回落到 1-2 区间。
套利不一定只赚价差。永续合约一侧的资金费如果方向有利,可能成为隐藏收益;经纪商侧的隔夜费也可能因为品种、账户类型或地区规则不同而较低甚至不收。但这些都不应该单独成为入场理由,只能作为成本模型的一部分动态评估。
价差怎么定义
跨市场价差不能简单用两个最新价相减。真正能成交的价格取决于方向:买入要吃 ask,卖出只能打 bid。
以 Binance 和 Exness 的黄金报价为例:
| 市场 | Bid | Ask |
|---|---|---|
| Binance | 4035.53 | 4035.55 |
| Exness | 4031.23 | 4031.25 |
两个方向的入场价差不同:
| 方向 | 入场价差 | 结果 |
|---|---|---|
| 做多 Exness / 做空 Binance | 4035.53 - 4031.25 | 4.28 |
| 做多 Binance / 做空 Exness | 4031.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 定义可成交价差。
- 如何用统计分布判断当前偏离是否足够大。
- 如何把手续费、点差、资金费、隔夜费和滑点纳入成本。
- 如何在双边下单中控制单腿风险。
- 如何在异常行情里保护资金,而不是盲目追机会。
策略思路是公开的,成本模型和信号计算也不是秘密。能不能稳定完成高频计算、能不能在双边下单中控制风险、能不能在异常情况下正确恢复,才是套利系统能否长期运行的关键。