首页
Preview

加密货币自动三角套利的4个步骤

用Python构建自己的套利交易算法

简介

套利利用市场中资产价格的差异。传统上,套利已在外汇市场中进行多年,但考虑到加密市场的波动性,它也可以应用于加密市场。套利机会可以存在于同一交易所或跨交易所。

三角套利是一种技术,试图同时利用三种不同资产之间的价格差异。例如,我们可以将BTC兑换为USDT,将BTC兑换为ETH,然后将ETH再兑换回USDT。如果同时执行这三个交易的净值有利可图,则执行这3个交易。

三角套利示例(作者提供的图片)

在本文中,我们将探讨同一交易所内的套利机会,特别是我们将深入研究三角套利方法。重点是开发和实施一个交易算法,该算法可以识别利润并触发所需的交易订单。

与传统交易相比,套利被认为是一种较低风险的交易方法,因为买入/卖出的时机至关重要。此外,在套利中,所有必需的交易同时执行,因此可以立即知道利润/损失。

三角套利的方法

有不同的方法来购买/销售3种资产以实现三角套利。在本文中,我们将考虑两种方法。

方法1:买入-买入-卖出

买入-买入-卖出的三角套利方法(作者提供的图片)

在上面的例子中,我们以USDT作为初始投资。执行3个交易后,我们最终又剩下USDT。以下是将执行的交易:

  • 使用Tether(USDT)购买比特币(BTC)
  • 使用Bitcoin(BTC)购买以太坊(ETH)
  • 将以太坊(ETH)出售以获得Tether(USDT) 在第三次交易结束时,我们可以将最终的USDT与步骤1中开始的初始投资进行比较。如果这导致实质性利润,则可以同时启动3个交易。

方法2:买入-卖出-卖出

买入-卖出-卖出的三角套利方法(作者提供的图片)

与第一种方法类似,使用相同的资产在不同的流程中检查套利机会。在上面的例子中,评估了以下3个交易:

  • 使用Tether(USDT)购买以太坊(ETH)
  • 出售以太坊(ETH)以获得Bitcoin(BTC)
  • 出售Bitcoin(BTC)以获得Tether(USDT)

交易算法-四步实现

以下是实现三角套利交易算法的不同步骤概述。在接下来的章节中,我们将详细研究每个步骤。

步骤1:获取所有有效的加密组合
步骤2:执行三角套利
步骤3:下单交易
步骤4:打包在一起

在继续这些步骤之前,我们需要初始化交易所以进行套利。选择你拥有交易账户并支持基于API的交易的交易所。在本示例中,我使用了WazirX交易所,因为我在这个交易所拥有交易账户。

import ccxt
from config import myconfig
exchange = ccxt.wazirx({
                         “apiKey”: myconfig.API_KEY,
                         “secret”: myconfig.API_SECRET
                       })

包ccxt支持各种交易所,如果你在其他任何交易所拥有账户,则可以通过在上面的片段中更改交易所的名称来使相同的代码工作。请参阅此页面以获取ccxt支持的交易所列表。

步骤1:获取所有有效的加密组合

我们需要一种以我们交易账户中的初始投资作为基础货币来开始的方法。在这里,我们将USDT作为基础货币。请注意,甚至可以将像INR或USD这样的法定货币视为基础货币。

交易所支持数百种加密货币,因此我们可以推导出不同的组合以执行三角套利。我们可以将其硬编码为有限的组合集,也可以允许代码考虑交易所中可用的所有可能组合。以下代码片段实现了识别所有可能套利组合的第二种方法。

在撰写本文时,该交易所支持543个加密资产。


markets = exchange.fetchMarkets()
market_symbols = [market['symbol'] for market in markets]

接下来,提取所有可能的组合以应用三角套利的买入-买入-卖出和买入-卖出-卖出方法。

def get_crypto_combinations(market_symbols, base):
    combinations = []
    for sym1 in market_symbols:   
        sym1_token1 = sym1.split('/')[0]
        sym1_token2 = sym1.split('/')[1]   
        if (sym1_token2 == base):
            for sym2 in market_symbols:
                sym2_token1 = sym2.split('/')[0]
                sym2_token2 = sym2.split('/')[1]
                if (sym1_token1 == sym2_token2):
                    for sym3 in market_symbols:
                        sym3_token1 = sym3.split('/')[0]
                        sym3_token2 = sym3.split('/')[1]
                        if((sym2_token1 == sym3_token1) and (sym3_token2 == sym1_token2)):
                            combination = {
                                'base':sym1_token2,
                                'intermediate':sym1_token1,
                                'ticker':sym2_token1,
                            }
                            combinations.append(combination)
    return combinations
        
wx_combinations_usdt = get_crypto_combinations(market_symbols,'USDT')

代码能够识别63种不同的套利组合。

例如:如果要在第一个条目上应用买入-买入-卖出算法,则:

  • 使用USDT(基础)购买BTC(中间)
  • 使用BTC(中间)购买XRP(代码)
  • 出售XRP(代码)以获得USDT(基础) 如果此循环交易可以带来利润,则我们可以同时执行3个交易。

步骤2:执行三角套利

从交易所中提取三种资产的价格,并在执行三次买入/卖出转换后确定最终价格。

def check_buy_buy_sell(scrip1, scrip2, scrip3,initial_investment):
    
    ## SCRIP1
    investment_amount1 = initial_investment
    current_price1 = fetch_current_ticker_price(scrip1)
    final_price = 0
    scrip_prices = {}
    
    if current_price1 is not None:
        buy_quantity1 = round(investment_amount1 / current_price1, 8)
        time.sleep(1)
        ## SCRIP2
        investment_amount2 = buy_quantity1     
        current_price2 = fetch_current_ticker_price(scrip2)
        if current_price2 is not None:
            buy_quantity2 = round(investment_amount2 / current_price2, 8)
            time.sleep(1)
            ## SCRIP3
            investment_amount3 = buy_quantity2     
            current_price3 = fetch_current_ticker_price(scrip3)
            if current_price3 is not None:
                sell_quantity3 = buy_quantity2
                final_price = round(sell_quantity3 * current_price3,3)
                scrip_prices = {scrip1 : current_price1, scrip2 : current_price2, scrip3 : current_price3}
                
    return final_price, scrip_prices

类似地,也需要实现买入-卖出-卖出方法。此处仅提供代码片段,以避免代码拥堵。请参考文章结尾链接的git存储库以获取完整的可执行代码。

通过考虑每笔交易的交易所佣金和交易所期望的最小利润来计算执行此三角套利的利润/损失。

def check_profit_loss(total_price_after_sell,initial_investment,transaction_brokerage, min_profit):
    apprx_brokerage = transaction_brokerage * initial_investment/100 * 3
    min_profitable_price = initial_investment + apprx_brokerage + min_profit
    profit_loss = round(total_price_after_sell - min_profitable_price,3)
    return profit_loss

步骤3:下单交易

以下是在交易所上执行三个交易的代码。如果交易所不支持市场价格交易,则需要执行限价交易。如果价格在订单执行之前波动,则限价订单有时会导致交易订单被卡住。# 第四步:将其捆绑在一起

def place_buy_order(scrip, quantity, limit):
    order = exchange.create_limit_buy_order(scrip, quantity, limit)
    return order

def place_sell_order(scrip, quantity, limit):
    order = exchange.create_limit_sell_order(scrip, quantity, limit)
    return order 

def place_trade_orders(type, scrip1, scrip2, scrip3, initial_amount, scrip_prices):
    final_amount = 0.0
    if type == 'BUY_BUY_SELL':
        s1_quantity = initial_amount/scrip_prices[scrip1]
        place_buy_order(scrip1, s1_quantity, scrip_prices[scrip1])
        
        s2_quantity = s1_quantity/scrip_prices[scrip2]
        place_buy_order(scrip2, s2_quantity, scrip_prices[scrip2])
        
        s3_quantity = s2_quantity
        place_sell_order(scrip3, s3_quantity, scrip_prices[scrip3])
        
    elif type == 'BUY_SELL_SELL':
        s1_quantity = initial_amount/scrip_prices[scrip1]
        place_buy_order(scrip1, s1_quantity, scrip_prices[scrip1])
        
        s2_quantity = s1_quantity
        place_sell_order(scrip2, s2_quantity, scrip_prices[scrip2])
        
        s3_quantity = s2_quantity * scrip_prices[scrip2]
        place_sell_order(scrip3, s3_quantity, scrip_prices[scrip3])
        
    return final_amount

将上述步骤打包成一个单一的程序,并对所有可能的组合运行它。

对于每个组合,执行以下3个步骤(例如:买-BTC/USDT,卖-ETH/BTC,卖-ETH/USDT):

  • 确定执行3次交易后的最终卖出价格
  • 计算进行这些交易的利润/损失
  • 如果交易导致期望的利润,则下单执行这3个交易订单
def perform_triangular_arbitrage(scrip1, scrip2, scrip3, arbitrage_type,initial_investment, 
                               transaction_brokerage, min_profit):
    final_price = 0.0
    if(arbitrage_type == 'BUY_BUY_SELL'):
        # Check this combination for triangular arbitrage: scrip1 - BUY, scrip2 - BUY, scrip3 - SELL
        final_price, scrip_prices = check_buy_buy_sell(scrip1, scrip2, scrip3,initial_investment)
        
    elif(arbitrage_type == 'BUY_SELL_SELL'):
        # Check this combination for triangular arbitrage: scrip1 - BUY, scrip2 - SELL, scrip3 - SELL
        final_price, scrip_prices = check_buy_sell_sell(scrip1, scrip2, scrip3,initial_investment)
        
    profit_loss = check_profit_loss(final_price,initial_investment, transaction_brokerage, min_profit)

    if profit_loss>0:
        print(f"PROFIT-{datetime.now().strftime('%H:%M:%S')}:"\
              f"{arbitrage_type}, {scrip1},{scrip2},{scrip3}, Profit/Loss: {round(final_price-initial_investment,3)} ")
        place_trade_orders(arbitrage_type, scrip1, scrip2, scrip3, initial_investment, scrip_prices)
INVESTMENT_AMOUNT_DOLLARS = 100
MIN_PROFIT_DOLLARS = 0.5
BROKERAGE_PER_TRANSACTION_PERCENT = 0.2

while(1):
    for combination in wx_combinations_usdt:
        base = combination['base']
        intermediate = combination['intermediate']
        ticker = combination['ticker']
        
        s1 = f'{intermediate}/{base}'    # Eg: BTC/USDT
        s2 = f'{ticker}/{intermediate}'  # Eg: ETH/BTC
        s3 = f'{ticker}/{base}'          # Eg: ETH/USDT 
        
        # 1. Check triangular arbitrage for buy-buy-sell 
        perform_triangular_arbitrage(s1,s2,s3,'BUY_BUY_SELL',INVESTMENT_AMOUNT_DOLLARS,
                                  BROKERAGE_PER_TRANSACTION_PERCENT, MIN_PROFIT_DOLLARS)
        
        # Check triangular arbitrage for buy-sell-sell 
        perform_triangular_arbitrage(s3,s2,s1,'BUY_SELL_SELL',INVESTMENT_AMOUNT_DOLLARS,
                                  BROKERAGE_PER_TRANSACTION_PERCENT, MIN_PROFIT_DOLLARS)
        time.sleep(1)    

结果

在对这段代码进行一次迭代运行时,以下是一个样例结果。

考虑了100美元的初始投资。通过63个组合和2种方法,总共检查了126个套利组合,其中26个显示了如下利润。

1次迭代的三角套利样本结果

请注意,上表来自日志,而不是实际执行的交易。尽管这个表格显示了一个美好的数字,但实际情况可能并不总是一帆风顺。

为什么可能会是坎坷的旅程...

  • 由于需要同时执行所有三个订单才能实现利润,存在某些订单由于网络延迟或交易所问题而无法及时执行的可能性。在这种情况下,你可能会被卡住加密货币,需要进行手动干预。
  • 此处考虑的加密货币价格是实时的标记价格。在订单执行之前,价格可能会波动。更好的方法是从订单簿中获取条目,并根据交易量选择标记价格。
  • 从交易所同时需要三个标记价格才能执行三角套利。一些交易所设置速率限制,不允许重复的 API 调用。在这种情况下,API 可能会抛出速率限制异常(HTTP 429 Too Many Requests)。这可以通过在 API 调用之间使用 1 秒的睡眠计时器来处理。但是,如果价格在这几秒钟内发生变化,则订单可能不会执行。
  • 一些交易所不允许以市场价格下单(就像在我的示例中一样)。需要限价。在这种情况下,由于价格波动,订单再次无法执行。

代码仓库

参考此 git 仓库以访问完整代码:TriangularArbitrageCryptos

结论

根据交易所和其提供的 API 支持,可以进一步调整交易算法。通过更改基础货币、使用市价交易或检查其他套利方法来尝试使用代码。

再次强调,本文仅用于教育目的,帮助你了解可用的不同交易选项。请记住,你正在与其他多个交易机器人竞争。如果你想尝试实际交易,请确保已构建了一个强大的交易算法,以避免损失。

此外,如果你有兴趣将此代码包装在交易机器人应用程序中,请使用本文作为参考:用 Python 构建基本的加密货币交易机器人

感谢你的耐心阅读 :-)。祝你愉快地尝试!!

译自:https://medium.com/geekculture/automated-triangular-arbitrage-of-cryptos-in-4-steps-a678f7b01ce7

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
kokila
暂无描述

评论(0)

添加评论