XRP × アビトラbot
このプログラムでは理論上は100%儲けがでる裁定取引(アビトラ)機会の抽出を行います。裁定取引は、同一商品が、異なる取引所間において、異なる価格で取引されている場合、その価格差を利用して、利益を上げる手法です。(要するにさやどりです。)
仮想通貨現物を保有している場合、通常のアビトラでは行わなくてはならない、送金のプロセスが省略できるため、アビトラのリスクである、送金時の価格変動を抑えることができ、利益につながりやすくなります。
簡単ですがアビトラの仕組み
A取引所 XRP:20円
B取引所 XRP:25円
とするとA取引所で買って送金してB取引所で売れば5円儲けられるという仕組みです。
しかし実際には問題が2つ発生します。
①価格差がそこまでないので、一見して利益が出るかわからない
->プログラム化して解決しましょう
②送金している間に価格が変動する
->保有しているXRP利用することで価格変動リスクを抑えましょう
保有しているXRPをあらかじめB取引所に置いておいてB取引所で売ってからA取引所で買いなおしを行えば、送金する必要がないため、価格変動リスクをなくすことが出来ます。(実際にはA,Bどちらの取引所が高くなるかわからないため、半々で置いておくことが推奨されます)
使う取引所について
使う取引所はBitbankとLiquidです。それぞれの取引所にXRP、日本円をあらかじめ入金しておいてください。
今回は価格差が出ているか確認するためのプログラムを作成しました。
実際の取引を見越してAPIKEY Secretを入れるようになっており、XRPとJPYのそれぞれの残高が表示されるようになっています。
My Position bitbank,LiquidそれぞれのXRP、JPYの残高が確認できます。
Market situation bitbank,Liquidそれぞれの買い板、売り板が見れます。
Arb_checker 売り板 - 買い板が表示されます。これがもうけになります。かっこ内は利益率です。ただしbitbankで取引すると手数料が発生するため最終項目のかっこ内に手数料込の想定取引結果を表示しています。
必須環境はPyhthonの動く環境、CCXTです。
【2019年9月7日の検証】
検証では実際にさやが発生しており、0.01%程度のさやは頻繁に出ているようです。またそのさやもLiquid、Bitbankタイミングによって高い、安いが入れ替わるようです。
以下コードです。noteの購入もしくはXRPでの支援よろしくお願いします。
アドレス: r9FnQZ8WLJ5oMpFZUh5L9ap1ihFAWYstKF
送金先タグ: 1034666
以下コードです。
# coding: utf-8
from pprint import pprint
import time
import logging
import requests
from datetime import datetime
import ccxt
#-------------------------------
Max_net_exposure = 10
profit_percent = 0.0
max_lot = 2
#-------------------------------
bitbank = ccxt.bitbank()
bitbank.apiKey ='Your_API_Key'
bitbank.secret ='Your_secret'
liquid = ccxt.liquid()
liquid.apiKey ='Your_API_Key'
liquid.secret ='Your_secret'
#-------------------------------------------
#-------------------------------------------
#ログの設定
logger = logging.getLogger('LoggingTest')
logger.setLevel(10)
fh = logging.FileHandler('xrp_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 ticker_liquid():
try:
lq_order = liquid.fetch_order_book('XRP/JPY')
return(lq_order["asks"][0],lq_order["bids"][0])
except Exception as e:
logger.info(e)
time.sleep(2)
#-------------------------------------------
#-------------------------------------------
def ticker_bitbank():
try:
bb_order = bitbank.fetch_order_book('XRP/JPY')
return(bb_order["asks"][0],bb_order["bids"][0])
except Exception as e:
logger.info(e)
time.sleep(2)
#-------------------------------------------
#-------------------------------------------
#成行注文
def bb_market(side, size):
while True:
try:
bitbank.create_order('XRP/JPY','market',side,size,10)
break
except Exception as e:
logger.info(e)
time.sleep(2)
time.sleep(0.5)
#-------------------------------------------
#-------------------------------------------
#成行注文
def lq_market(side, size):
while True:
try:
#liquid.create_order('XRP/JPY','market','sell',size,params={'leverage_level': 2})
liquid.create_order('XRP/JPY','market',side,size)
break
except Exception as e:
logger.info(e)
time.sleep(2)
time.sleep(0.5)
#-------------------------------------------
#-------------------------------------------
#ポジションチェック
def posi_check():
try:
value_bb = bitbank.fetch_balance()
bb_asset_jpy = value_bb['free']['JPY']
bb_asset_xrp = value_bb['free']['XRP']
value_lq = liquid.fetch_balance()
lq_asset_jpy = value_lq['total']['JPY']
lq_asset_xrp = value_lq['total']['XRP']
return bb_asset_xrp,lq_asset_xrp,bb_asset_jpy,lq_asset_jpy
except Exception as e:
logger.info(e)
time.sleep(2)
#-------------------------------------------
lot = 0
best_buy_vol = 0
best_sell_vol = 0
low_buy_lot_xrpjpy = 1000 #円計算
high_sell_lot_xrp = 0
#-------------------------------------------
while True:
print('◆-----------MY Position-------------')
for _ in range(3): # 最大3回実行
try:
posi = posi_check()
bb_posi_xrp = posi[0]
lq_posi_xrp = posi[1]
bb_posi_jpy = posi[2]
lq_posi_jpy = posi[3]
except Exception as e:
logger.info(e)
time.sleep(2)
else:
break # 失敗しなかった時はループを抜ける
else:
pass
net_xrp = bb_posi_xrp + lq_posi_xrp
net_jpy = bb_posi_jpy + lq_posi_jpy
print(f'bitbank = {bb_posi_xrp:,.5f}XRP {bb_posi_jpy:,.5f}JPY') #BitbankのXRP.JPY保有量
print(f'liquid = {lq_posi_xrp:,.5f}XRP {lq_posi_jpy:,.5f}JPY') #LiquidのXRP.JPY保有量
print(f'Net = {net_xrp:,.5f}XRP {net_jpy:,.5f}JPY')
print('----------Market situation--------------')
lq_buy = ticker_liquid()[0]
lq_sell = ticker_liquid()[1]
bb_buy = ticker_bitbank()[0]
bb_sell = ticker_bitbank()[1]
print(f'Liquid Buy {lq_buy[0]:,.3f}円 Vol:{lq_buy[1]:,.3f}XRP')
print(f'Bitbank Buy {bb_buy[0]:,.3f}円 Vol:{bb_buy[1]:,.3f}XRP')
print(f'Liquid Sell {lq_sell[0]:,.3f}円 Vol:{lq_sell[1]:,.3f}XRP')
print(f'Bitbank Sell {bb_sell[0]:,.3f}円 Vol:{bb_sell[1]:,.3f}XRP')
print('----------Arb_checker--------------')
low_buy = min(lq_buy[0],bb_buy[0])
low_buy_index = [lq_buy[0],bb_buy[0]].index(min([lq_buy[0],bb_buy[0]]))
if low_buy_index == 0:
logger.warning(f'low buy= {low_buy:,.3f} @Liquid')
best_buy_vol = lq_buy[1] #買える枚数on板
elif low_buy_index ==1:
logger.warning(f'low buy= {low_buy:,.3f} @Bitbank')
best_buy_vol = bb_buy[1] #買える枚数on板
else :
logger.warning('not checked low buy')
high_sell = max(lq_sell[0],bb_sell[0])
high_sell_index = [lq_sell[0],bb_sell[0]].index(max([lq_sell[0],bb_sell[0]]))
if high_sell_index == 0:
logger.warning(f'high sell= {high_sell:,.3f} @Liquid')
best_sell_vol = lq_sell[1] #売れる枚数on板
high_sell_lot_xrp = lq_posi_xrp #売れる枚数onポジ
elif high_sell_index ==1:
logger.warning(f'high sell= {high_sell:,.3f} @Bitbank')
best_sell_vol = bb_sell[1] #売れる枚数on板
high_sell_lot_xrp = bb_posi_xrp #売れる枚数onポジ
else :
logger.warning('not checked high sell')
diff = high_sell - low_buy
diff_in_percent = ((high_sell - low_buy)/high_sell)*100
diff_in_percent_w_fee = ((high_sell - low_buy)/high_sell*100) - 0.12 #パーセントの計算 (手数料0.12%計算)
logger.warning(f' high_sell - low_buy = {diff:,.3f}JPY ({diff_in_percent:,.5f}%) ({diff_in_percent_w_fee:,.5f}%)')
if diff_in_percent_w_fee <= profit_percent:
print('spread not over profit percent...')
print('--------------------------------------------------------------------------')
time.sleep(15)
else:
logger.warning('Executing Arb!')
time.sleep(15)
コンテンツは以上です。開発継続のためご支援ください。
ここから先は
¥ 300
この記事が気に入ったらチップで応援してみませんか?