一、三角套利:外汇市场中的套利机会

三角套利,说白了就是利用三个货币对之间的价格不一致来赚钱。我刚开始接触这个策略时,觉得它特别神奇——明明看起来每个货币对都是合理定价,但三个放在一起,居然能算出无风险利润。

嗯,这里要注意:三角套利不是让你去猜汇率涨跌,而是捕捉市场短暂的定价错误。这种机会通常转瞬即逝,所以需要程序化交易来执行。

1.1 三角套利的数学原理

假设我们有三个货币:美元(USD)、欧元(EUR)、英镑(GBP)。

正常情况下,三个汇率应该满足一个关系:

EUR/USD × GBP/EUR × USD/GBP = 1

如果乘积不等于1,就存在套利机会。

举个例子:

  • EUR/USD = 1.1800(1欧元换1.18美元)
  • GBP/EUR = 1.1400(1英镑换1.14欧元)
  • USD/GBP = 0.7400(1美元换0.74英镑)

计算一下:1.1800 × 1.1400 × 0.7400 = 0.9957

乘积小于1,说明存在套利空间。具体怎么操作?

我习惯用1美元起步,走一圈看看能变回多少:

  1. 1美元 → 0.74英镑(用USD/GBP)
  2. 0.74英镑 → 0.8436欧元(用GBP/EUR)
  3. 0.8436欧元 → 0.9957美元(用EUR/USD)

你看,1美元变成了0.9957美元,亏了0.43%。等等,这不是亏钱吗?

对,如果乘积小于1,正向走一圈是亏的。但反过来走一圈呢?

  1. 1美元 → 0.8475欧元(用EUR/USD的倒数)
  2. 0.8475欧元 → 0.7434英镑(用GBP/EUR的倒数)
  3. 0.7434英镑 → 1.0043美元(用USD/GBP的倒数)

1美元变成了1.0043美元,赚了0.43%。这就是套利!

核心结论:

  • 如果 EUR/USD × GBP/EUR × USD/GBP < 1,正向走亏钱,反向走赚钱
  • 如果乘积 > 1,正向走赚钱,反向走亏钱
  • 如果乘积 = 1,没有套利空间

1.2 三角套利的完整流程

下面这张图展示了三角套利的完整逻辑:

三角套利核心流程 USD EUR GBP EUR/USD GBP/EUR USD/GBP 乘积 ≠ 1 ? 套利机会存在 → 执行反向交易

1.3 Python代码实现

下面是我写的一个三角套利检测器。我在项目中遇到过一个问题:如果直接拿市场报价来计算,会因为买卖价差(Bid-Ask Spread)吃掉利润。所以代码里必须同时考虑买入价和卖出价。

import pandas as pd
import numpy as np
from decimal import Decimal, ROUND_HALF_UP

class TriangularArbitrage:
    """
    三角套利检测器
    支持任意三种货币的组合
    """
    
    def __init__(self):
        # 模拟市场报价
        # 格式: (bid, ask)
        self.quotes = {
            'EUR/USD': (1.1795, 1.1805),
            'GBP/EUR': (1.1395, 1.1405),
            'USD/GBP': (0.7395, 0.7405),
            'USD/JPY': (109.50, 109.60),
            'EUR/JPY': (129.20, 129.30),
            'GBP/USD': (1.3820, 1.3830)
        }
    
    def detect_arbitrage(self, base_currency, currency_a, currency_b):
        """
        检测三角套利机会
        
        参数:
            base_currency: 基础货币(比如USD)
            currency_a: 第二种货币
            currency_b: 第三种货币
        """
        # 构建三个货币对
        pair1 = f'{currency_a}/{base_currency}'  # EUR/USD
        pair2 = f'{currency_b}/{currency_a}'     # GBP/EUR
        pair3 = f'{base_currency}/{currency_b}'  # USD/GBP
        
        # 获取报价
        rate1_bid, rate1_ask = self.quotes[pair1]
        rate2_bid, rate2_ask = self.quotes[pair2]
        rate3_bid, rate3_ask = self.quotes[pair3]
        
        # 正向套利:用卖出价
        # 1 base → 用pair3的bid换 → currency_b
        # → 用pair2的bid换 → currency_a
        # → 用pair1的bid换 → base
        forward_result = rate3_bid * rate2_bid * rate1_bid
        
        # 反向套利:用买入价
        # 1 base → 用pair1的ask换 → currency_a
        # → 用pair2的ask换 → currency_b
        # → 用pair3的ask换 → base
        reverse_result = (1 / rate1_ask) * (1 / rate2_ask) * (1 / rate3_ask)
        
        print(f'正向套利乘积: {forward_result:.6f}')
        print(f'反向套利乘积: {reverse_result:.6f}')
        
        # 判断套利机会
        # 考虑交易成本,设置阈值
        threshold = 0.001  # 0.1%
        
        if forward_result > 1 + threshold:
            print(f'✅ 发现正向套利机会!预期收益: {(forward_result - 1)*100:.2f}%')
            print(f'操作: 买入 {pair3} → 买入 {pair2} → 买入 {pair1}')
            return 'forward', forward_result - 1
            
        elif reverse_result > 1 + threshold:
            print(f'✅ 发现反向套利机会!预期收益: {(reverse_result - 1)*100:.2f}%')
            print(f'操作: 买入 {pair1} → 买入 {pair2} → 买入 {pair3}')
            return 'reverse', reverse_result - 1
            
        else:
            print('❌ 未发现套利机会')
            return None, 0
    
    def calculate_profit(self, amount, direction, profit_rate):
        """计算实际利润"""
        if direction == 'forward':
            profit = amount * profit_rate
        else:
            profit = amount * profit_rate
        
        # 扣除交易成本(假设每笔0.05%)
        cost = amount * 0.0005 * 3  # 三笔交易
        net_profit = profit - cost
        
        return net_profit

# 使用示例
if __name__ == '__main__':
    arb = TriangularArbitrage()
    
    print('=== 三角套利检测 ===')
    print('货币组合: USD, EUR, GBP\n')
    
    direction, rate = arb.detect_arbitrage('USD', 'EUR', 'GBP')
    
    if direction:
        profit = arb.calculate_profit(100000, direction, rate)
        print(f'\n投入10万美元,净利润: ${profit:.2f}')

避坑指南:

我曾经在实盘测试时发现,代码跑出来的套利机会,手动一算利润很可观,但实际执行时却亏了。后来才意识到,问题出在买卖价差上。市场报价的bid和ask之间通常有2-5个点的差距,这个差距会直接吃掉你的利润。

所以我的建议是:一定要用bid和ask分别计算,不要用中间价。另外,设置一个合理的阈值(比如0.1%),低于这个阈值的"机会"直接忽略。

1.4 实战中的注意事项

因素 说明 我的建议
买卖价差 bid和ask之间的差距 至少留出2个点的安全边际
交易成本 每笔交易的手续费 按0.05%计算,三笔共0.15%
执行速度 套利机会转瞬即逝 用WebSocket实时获取报价
滑点 实际成交价与报价的差异 预留0.02%的滑点缓冲
资金规模 大资金会影响市场价格 单笔不超过市场深度的5%

重要警告:

别以为三角套利是稳赚不赔的买卖。我见过太多人拿着教科书上的公式就去实盘,结果亏得血本无归。原因很简单:

  • 你看到的报价和你能成交的价格是两码事
  • 高频交易团队用毫秒级的速度在抢这些机会
  • 你的交易成本可能比想象中高得多

所以,先用模拟盘跑一个月,确认策略真的能赚钱,再考虑实盘。

1.5 小结

三角套利的原理其实不复杂,就是利用三个货币对之间的定价不一致。但真正难的是执行层面——速度、成本、滑点,每一个环节都可能让你的利润消失。

我个人习惯把三角套利当作一个入门级的量化策略来学习。它教会你两件事:第一,市场不是完全有效的;第二,抓住市场的错误需要付出代价(速度、成本)。

如果你能把这个策略跑通,那恭喜你,你已经迈出了量化交易的第一步。


专注资料整理