タイトル画像

Binanceでの取引所内アービトラージ(三角裁定取引)

このプログラムでは理論上は100%儲けがでる裁定取引機会の抽出を行います。
裁定取引は通常、同一商品が、異なる取引所間において、異なる価格で取引されている場合、その価格差を利用して、利益を上げる手法です。(要するにさやどりです。)

ただし今回紹介するのは、Binance内での裁定取引です。
通常の裁定取引と比較して、取引所を跨がなくてよいため
1.送金手数料が不要
2.送金にかかる時間がないため、さやが逆転して損をする心配がない
3.送金にかかる時間がないため、連続で取引できる
といったメリットが挙げられます。

取引の手法としては以下2パターンになります
パターン1: ①USDTでBTCを購入 -> ②BTCでETHを購入 -> ③ETHでUSDTを購入
パターン2: ①USDTでEHTを購入 -> ②ETHでBTCを購入 -> ③BTCでUSDTを購入

取引にはask,bidのスプレッドや手数料(0.5%)がかかるため、それを織り込んで計算しています。(計算が間違っていたら教えてくださいw)

今後はETHの代わりにTUSDペアを入れたものとそれぞれの取引VOLを表示したいと考えています。
(それらは有料にするかもしれません)

コードは以下の通りです。

動作環境はWindows10 pythonは3.7.0です。(python3.xだと動くと思います)
追記(11/27):動作にはccxt(https://github.com/ccxt/ccxt)が必要です。

# coding: utf-8

import datetime
import time
import logging
import ccxt

commission = 0.0005 #0.05%
binance = ccxt.binance()

#-------------------------------------------
def spred_chk():
 
 orderbook_bn = binance.fetch_order_book ('BTC/USDT')
 orderbook_bn_tusdusdt = binance.fetch_order_book ('TUSD/USDT')
 orderbook_bn_tusdbtc = binance.fetch_order_book ('TUSD/BTC')
 
 orderbook_bn_ethusdt = binance.fetch_order_book ('ETH/USDT')
 orderbook_bn_ethbtc = binance.fetch_order_book ('ETH/BTC')
 
 
 #----ask取得
 ask_bn = orderbook_bn['asks'][0][0]
 ask_vol_bn =orderbook_bn['asks'][0][1]
 
 ask_bn_tusdusdt = orderbook_bn_tusdusdt['asks'][0][0]
 ask_vol_bn_tusdusdt =orderbook_bn_tusdusdt['asks'][0][1]
 
 ask_bn_tusdbtc = orderbook_bn_tusdbtc['asks'][0][0]
 ask_vol_bn_tusdbtc =orderbook_bn_tusdbtc['asks'][0][1]

 ask_bn_ethusdt = orderbook_bn_ethusdt['asks'][0][0]
 ask_vol_bn_ethusdt =orderbook_bn_ethusdt['asks'][0][1]
 
 ask_bn_ethbtc = orderbook_bn_ethbtc['asks'][0][0]
 ask_vol_bn_ethbtc =orderbook_bn_ethbtc['asks'][0][1]
 
 
 #----bid取得
 bid_bn = orderbook_bn['bids'][0][0]
 bid_vol_bn =orderbook_bn['bids'][0][1]
 
 bid_bn_tusdusdt = orderbook_bn_tusdusdt['bids'][0][0]
 bid_vol_bn_tusdusdt =orderbook_bn_tusdusdt['bids'][0][1]
 
 bid_bn_tusdbtc = orderbook_bn_tusdbtc['bids'][0][0]
 bid_vol_bn_tusdbtc =orderbook_bn_tusdbtc['bids'][0][1]
 
 bid_bn_ethusdt = orderbook_bn_ethusdt['bids'][0][0]
 bid_vol_bn_ethusdt =orderbook_bn_ethusdt['bids'][0][1]
 
 bid_bn_ethbtc = orderbook_bn_ethbtc['bids'][0][0]
 bid_vol_bn_ethbtc =orderbook_bn_ethbtc['bids'][0][1]
 
 #----表示
 logger.info ('----------------------------------------------------------')
 logger.info ('BTC/USDT : ' + str(ask_bn))
 logger.info ('ETH/BTC  : ' + str(ask_bn_ethbtc))
 logger.info ('ETH/USDT : ' + str(bid_bn_ethusdt))
 logger.info('USDT->BTC->ETH->USDT\tEST_PROFIT(%)\t' + str('{0:.3f}'.format((-1*(ask_bn - 1/ask_bn_ethbtc * bid_bn_ethusdt)/ask_bn*100)-commission*3)) +'%')
 logger.info('-------------------')
 logger.info ('ETH/USDT : ' + str(ask_bn_ethusdt))
 logger.info ('ETH/BTC  : ' + str(bid_bn_ethbtc))
 logger.info ('BTC/USDT : ' + str(bid_bn))
 logger.info('USDT->ETH->BTC->USDT\tEST_PROFIT(%)\t' + str('{0:.3f}'.format((-1*(ask_bn_ethusdt - bid_bn_ethbtc * bid_bn)/ask_bn_ethusdt*100)-commission*3)) +'%')
 logger.info('-------------------')

#-------------------------------------------
#ログの設定
logger = logging.getLogger('LoggingTest')
logger.setLevel(10)
fh = logging.FileHandler('tri_arb.log')
logger.addHandler(fh)
sh = logging.StreamHandler()
logger.addHandler(sh)
formatter = logging.Formatter('%(asctime)s:%(lineno)d:%(levelname)s:%(message)s')
fh.setFormatter(formatter)
sh.setFormatter(formatter)
#-------------------------------------------
#★----------------メインループ-----------
while True:
 spred_chk()
 time.sleep(5)
#-------------------------------------------

5秒に1度binanceのask,bidを見に行き裁定取引機会があるか確認しています。実行結果は以下の通り。

この時はパターン1:「①USDTでBTCを購入->②BTCでETHを購入->③ETHでUSDTを購入」で0.02%ほどの裁定機会があったようです。

Binanceのリファラルリンク使っていただけるとありがたいです。
https://www.binance.com/?ref=11330718

コンテンツはここまでです。ご支援いただける方は購入お願いします。

追記:11/30手数料の計算が間違っている可能性があります。確認中ですので今しばらくお待ちください。新Noteを公開しました。こちらが正しいかと思われます。


ここから先は

15字

¥ 100

この記事が気に入ったらチップで応援してみませんか?