第十五章:套利策略:跨交易所价差套利、三角套利、延迟套利

套利,说白了就是「捡漏」。

同一个东西,在不同地方卖不同价。或者几个东西之间,价格关系暂时乱了。你眼疾手快,低买高卖,赚个差价。

听起来简单?嗯,做起来全是坑。我在量化这行干了快十年,见过太多人兴冲冲搞套利,结果被手续费和滑点吃得骨头都不剩。

今天咱们就聊聊三种最常见的套利玩法:跨交易所价差套利、三角套利、延迟套利。

15.1 跨交易所价差套利

这是最直观的套利方式。同一个币,在A交易所卖100,在B交易所卖101。你从A买,到B卖,净赚1块。

但现实哪有这么美好?

核心逻辑:同一资产在不同交易所的价格差异,就是你的利润空间。

我刚开始做的时候,以为这就是印钞机。结果第一次实盘,就被上了一课。

15.1.1 价差是怎么产生的?

说白了,就是信息不对称和流动性差异。

  • 地域差异:不同国家的交易所,受当地政策、资金进出限制影响,价格天然有差。
  • 流动性差异:大交易所深度好,小交易所深度差。大单砸下去,小交易所价格直接崩。
  • 时间差:行情剧烈波动时,各交易所的订单簿更新速度不一样。

我记得2020年312暴跌那会儿,比特币在币安和火币之间的价差一度超过5%。如果你有机器跑着套利策略,那一晚上能赚不少。但前提是——你的网络延迟够低,资金够快。

15.1.2 实操中的坑

避坑指南:我曾经因为没算清楚手续费,跑了一个月的套利策略,最后发现是亏的。

手续费是套利的头号杀手。你想想看,价差可能只有0.1%,但交易所吃你0.1%的maker费,再吃0.1%的taker费。一来一回,0.2%没了。价差不够大,就是白忙活。

还有转账时间。跨交易所套利,你得先把币从A转到B。比特币转账确认要10分钟,黄花菜都凉了。所以真正做跨所套利的,用的都是那些转账快的链——比如TRC20的USDT,或者交易所内部转账。

我的建议:做跨所套利,优先选支持「内部转账」的交易所对。比如币安和欧易之间,如果都有TRC20通道,转账秒到。

15.1.3 一个简单的价差监控代码

下面这个代码,我当年用来监控币安和OKX的BTC价差。逻辑很简单,但够用。

import ccxt
import time

def monitor_spread(exchange1, exchange2, symbol, threshold=0.001):
    """
    监控两个交易所的价差
    threshold: 触发阈值,0.001 = 0.1%
    """
    while True:
        try:
            ticker1 = exchange1.fetch_ticker(symbol)
            ticker2 = exchange2.fetch_ticker(symbol)
            
            bid1 = ticker1['bid']
            ask2 = ticker2['ask']
            
            # 计算价差百分比
            spread = (bid1 - ask2) / ask2
            
            if spread > threshold:
                print(f"发现套利机会!价差: {spread*100:.2f}%")
                print(f"在 {exchange1.name} 买入: {ask2}")
                print(f"在 {exchange2.name} 卖出: {bid1}")
                
            time.sleep(1)
            
        except Exception as e:
            print(f"出错了: {e}")
            time.sleep(5)

# 初始化交易所
binance = ccxt.binance()
okx = ccxt.okx()

monitor_spread(binance, okx, 'BTC/USDT', threshold=0.002)

这个代码只是监控,没做自动交易。为什么?因为自动交易涉及到资金管理、订单簿深度判断、滑点控制。这些加在一起,才是完整的套利策略。

15.2 三角套利

三角套利,听着玄乎,其实原理很简单。

你有三个币:A、B、C。它们之间有三个交易对:A/B、B/C、C/A。正常情况下,这三个价格应该满足一个关系:A/B × B/C × C/A ≈ 1。

如果不等于1,就说明有套利空间。

核心逻辑:利用三个交易对之间的价格不一致,循环交易一圈,回到起点时发现钱变多了。

15.2.1 三角套利的路径

举个例子。假设你有USDT、BTC、ETH三个币。

交易对 价格
BTC/USDT 50000
ETH/BTC 0.07
ETH/USDT 3600

我们来算一下:

  • 用1 USDT买BTC:得到 1/50000 = 0.00002 BTC
  • 用0.00002 BTC买ETH:得到 0.00002/0.07 = 0.0002857 ETH
  • 用0.0002857 ETH买USDT:得到 0.0002857 × 3600 = 1.0285 USDT

你看,1 USDT转了一圈,变成了1.0285 USDT。净赚2.85%。

为什么会这样?因为ETH/USDT的价格被低估了,或者BTC/USDT的价格被高估了。总之,三个价格之间出现了不一致。

15.2.2 三角套利的难点

说实话,三角套利现在很难做。为什么?

  • 机会转瞬即逝:市场上的做市商和量化基金都在盯着,价差出现不到几毫秒就被吃掉了。
  • 手续费三重叠加:你要做三笔交易,手续费是三次。如果每笔收0.1%,三次就是0.3%。利润不够的话,就是亏。
  • 滑点问题:你算好的价格,等你下单时可能已经变了。尤其是小币种,深度差,滑点大。

我曾经踩过的坑:有一次我算出一个三角套利机会,利润大概0.5%。我兴冲冲地下了第一笔单,结果第二笔单成交时价格已经变了。最后三笔全做完,反而亏了0.2%。

15.2.3 三角套利的代码实现

下面是一个三角套利的检测逻辑。注意,这只是检测,不是执行。

def detect_triangle_arbitrage(exchange, base_currency, quote_currency, intermediate_currency):
    """
    检测三角套利机会
    """
    # 获取三个交易对的价格
    pair1 = f"{base_currency}/{quote_currency}"  # 比如 BTC/USDT
    pair2 = f"{intermediate_currency}/{base_currency}"  # 比如 ETH/BTC
    pair3 = f"{intermediate_currency}/{quote_currency}"  # 比如 ETH/USDT
    
    ticker1 = exchange.fetch_ticker(pair1)
    ticker2 = exchange.fetch_ticker(pair2)
    ticker3 = exchange.fetch_ticker(pair3)
    
    # 计算循环套利比率
    # 路径: USDT -> BTC -> ETH -> USDT
    rate = (1 / ticker1['ask']) * (1 / ticker2['ask']) * ticker3['bid']
    
    if rate > 1.002:  # 0.2% 以上才考虑
        print(f"发现正向套利机会!比率: {rate}")
        print(f"路径: {quote_currency} -> {base_currency} -> {intermediate_currency} -> {quote_currency}")
    
    # 反向路径
    reverse_rate = ticker1['bid'] * ticker2['bid'] * (1 / ticker3['ask'])
    
    if reverse_rate > 1.002:
        print(f"发现反向套利机会!比率: {reverse_rate}")
    
    return rate, reverse_rate

15.3 延迟套利

延迟套利,说白了就是「吃时间差」。

不同交易所的订单簿更新速度不一样。有的快,有的慢。如果你能比市场快一步,就能在价格还没同步之前下单。

核心逻辑:利用交易所之间的信息传播延迟,抢先交易。

15.3.1 延迟套利的两种形式

第一种:跨交易所延迟套利

比如,币安上BTC突然涨了1%。但OKX的订单簿还没更新。你可以在OKX上以旧价格买入,然后在币安上以新价格卖出。

这种套利,拼的是网络延迟。你的服务器离交易所越近,你的光纤越直连,你的优势越大。

第二种:衍生品与现货的延迟套利

期货价格和现货价格之间,理论上应该有一个合理价差(基差)。但有时候,期货价格会先动,现货还没跟上。这时候你可以做多现货、做空期货,等基差回归。

我的经验:延迟套利对硬件要求极高。我见过有人直接把服务器托管在交易所的机房里,延迟能压到微秒级。普通人别想了,老老实实做价差套利吧。

15.3.2 延迟套利的风险

  • 网络延迟:你以为是延迟,其实是你的网络慢。等你看到机会,别人已经吃完了。
  • 回滚风险:有些交易所会出现「交易回滚」,你买到了,但交易所说这笔交易无效。那你已经卖出的单怎么办?
  • 资金占用:延迟套利通常需要你在两个交易所都有资金。资金分散了,机会来了你也不一定够用。

避坑指南:我曾经做过一个延迟套利策略,跑了一个月,收益曲线很漂亮。结果有一天交易所升级系统,延迟突然变了,策略直接亏了20%。从那以后,我每次上线新策略都会加一个「延迟自适应」模块。

15.4 三种套利策略的对比

策略类型 核心依赖 难度 收益潜力 主要风险
跨交易所价差套利 价差监控、转账速度 中等 中等 手续费、转账延迟
三角套利 价格关系计算、多笔订单 低(机会少) 滑点、手续费三重叠加
延迟套利 网络延迟、硬件配置 极高 高(但门槛高) 网络波动、交易所回滚

15.5 套利策略的核心框架

下面这张图,是我自己总结的套利策略设计框架。每次做新策略,我都会先过一遍这个流程。

套利策略核心框架 数据获取 实时行情、订单簿深度 机会检测 价差计算、三角关系、延迟判断 风险评估 手续费、滑点、延迟 执行决策 下单、资金管理、订单簿保护 监控与调整 持仓监控、止损、再平衡 复盘优化 回测、参数调优 持续循环迭代 每个环节都可能成为套利策略的瓶颈 特别是「风险评估」和「执行决策」两步

这个框架,说白了就是一套「发现机会 → 评估风险 → 执行 → 复盘」的闭环。我每次做新策略,都会先画一遍这个图,看看哪个环节可能出问题。

15.6 最后说几句

套利策略,听起来很美,做起来很难。

我见过太多人,一开始觉得套利是无风险收益。结果呢?手续费、滑点、延迟、交易所故障……任何一个环节出问题,都可能让你从盈利变成亏损。

我个人建议,新手先从跨交易所价差套利开始。选两个流动性好的交易所,监控价差,手动交易。等跑通了,再考虑自动化。

记住一句话:套利不是印钞机,而是精细活。你赚的每一分钱,都是对市场效率的「修复」。市场越有效,套利空间越小。你能做的,就是比别人更快、更稳、更聪明。