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

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

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

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

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

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 最后说几句

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

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

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

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