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を公開しました。こちらが正しいかと思われます。
ここから先は
¥ 100
この記事が気に入ったらチップで応援してみませんか?