見出し画像

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

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

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

今回の取引の手法としては以下になります。
①BNBでBTCを購入 -> ②BTCでETHを購入 -> ③ETHでBNBを購入

前回(https://note.mu/enjoycc/n/n313a1d6b976b)は以下でした。
パターン1: ①USDTでBTCを購入 -> ②BTCでETHを購入 -> ③ETHでUSDTを購入
パターン2: ①USDTでEHTを購入 -> ②ETHでBTCを購入 -> ③BTCでUSDTを購入

取引にはask,bidのスプレッドや手数料(0.75%)がかかります。
出力結果は手数料を含めて計算したもの、手数料を含めないで計算したもの、それぞれを表示しています。
(計算が間違っていたら教えてくださいw)

また前回は表示していなかった取引できる最良の板のVolも表示しています。
一見してわかりやすいようBTC換算で表示しています。

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

# coding: utf-8

import datetime
import time
import logging
import ccxt
import requests

commission = 0.075  #手数料 0.075%
binance = ccxt.binance()

est_prof_per = 0.001 #想定利益

#-----------------------------------------
arb_flag = 0
vol_list = [0, 0, 0]
eth_btc_rate = 0
bnb_eth_rate = 0
# -------------------------------------------
# ログ設定
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)
# -------------------------------------------

# -------------------------------------------
def spred_chk():
    global arb_flag
    global vol_list
    global eth_btc_rate
    global bnb_eth_rate

    orderbook_bn_ethbtc = binance.fetch_order_book('ETH/BTC')
    orderbook_bn_bnbbtc = binance.fetch_order_book('BNB/BTC')
    orderbook_bn_bnbeth = binance.fetch_order_book('BNB/ETH')

    # ----ask取得
    ask_bn_ethbtc = orderbook_bn_ethbtc['asks'][0][0]
    ask_vol_bn_ethbtc = orderbook_bn_ethbtc['asks'][0][1]

    ask_bn_bnbbtc = orderbook_bn_bnbbtc['asks'][0][0]
    ask_vol_bn_bnbbtc = orderbook_bn_bnbbtc['asks'][0][1]

    ask_bn_bnbeth = orderbook_bn_bnbeth['asks'][0][0]
    ask_vol_bn_bnbeth = orderbook_bn_bnbeth['asks'][0][1]

    # ----bid取得
    bid_bn_ethbtc = orderbook_bn_ethbtc['bids'][0][0]
    bid_vol_bn_ethbtc = orderbook_bn_ethbtc['bids'][0][1]

    bid_bn_bnbbtc = orderbook_bn_bnbbtc['bids'][0][0]
    bid_vol_bn_bnbbtc = orderbook_bn_bnbbtc['bids'][0][1]

    bid_bn_bnbeth = orderbook_bn_bnbeth['bids'][0][0]
    bid_vol_bn_bnbeth = orderbook_bn_bnbeth['bids'][0][1]

    eth_btc_rate = bid_bn_ethbtc
    bnb_eth_rate = bid_bn_bnbeth

    # ----表示
    logger.info('----------------------------------------------------------')
    logger.info('BNB/BTC : ' + str(bid_bn_bnbbtc) + '\tVOL: ' + str(bid_vol_bn_bnbbtc) + '\tVOL(BTC): ' + str(bid_vol_bn_bnbbtc * bid_bn_bnbbtc))
    logger.info('ETH/BTC  : ' + str(ask_bn_ethbtc) + '\tVOL: ' + str(ask_vol_bn_ethbtc)+'\tVOL(BTC): ' + str(bid_vol_bn_ethbtc * bid_bn_ethbtc))
    logger.info('BNB/ETH : ' + str(ask_bn_bnbeth) + '\tVOL: ' + str(ask_vol_bn_bnbeth) + '\tVOL(BTC): ' + str(ask_vol_bn_bnbeth * ask_bn_bnbbtc))
    logger.info('BNB->BTC->ETH->BNB\tEST_PROFIT(%)\t' + str('{0:.3f}'.format((-1*(bid_bn_bnbbtc - ask_bn_ethbtc * ask_bn_bnbeth)/bid_bn_bnbbtc*100)-commission*3)) + '%')
    logger.info('BNB->BTC->ETH->BNB\tET_PRF_WOC(%)\t' + str('{0:.3f}'.format((-1*(bid_bn_bnbbtc - ask_bn_ethbtc * ask_bn_bnbeth)/bid_bn_bnbbtc*100))) + '%')

    if ((-1*(bid_bn_bnbbtc - ask_bn_ethbtc * ask_bn_bnbeth)/bid_bn_bnbbtc*100)-commission*3) > est_prof_per: 
        print('Find Arb opotunity...')
        arb_flag = 1
        vol_list = [(bid_vol_bn_bnbbtc * bid_bn_bnbbtc), (bid_vol_bn_ethbtc * bid_bn_ethbtc), (ask_vol_bn_bnbeth * ask_bn_bnbbtc)]

    else:
        print('No opotunity...')
        arb_flag = 0
        vol_list = [0, 0, 0]

# -------------------------------------------
# ★--------------★メイン
while True:
    spred_chk()

    logger.info ('----------------------------------------------------------')
    
    time.sleep(5)
# -------------------------------------------

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

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

この時は0.023%ほどの裁定機会があったようです。(手数料無しで計算した場合は、0.248%)

またコードのest_prof_perの値をいじることで、想定した裁定機会(%)があればFind Arb Oppotunity と表示するようにしています。

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

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

ここから先は

16字

¥ 100

期間限定 PayPay支払いすると抽選でお得に!

この記事が気に入ったらサポートをしてみませんか?