板情報を取得して成行注文の約定金額計算しました(GMOコイン)

こちらの記事で紹介したゼロ送金時間アービトラージを引き続き実践していますが、いまのところ順調です。本日累計損益が7万円に到達しました。

GMOコインとbitbankを使っているのですが、どちらもメイカー&テイカー方式の手数料を採用しています。テイカー手数料がかかるとほとんど利益が出ないので購入・売却どちらもメイカーになるよう指値注文しているのですが、その場合片方だけ約定してもう片方が約定せずに損失が出る方向に価格が動いてしまうこともしばしばあります。手動でやっているうちは値動きを見ながらいろいろ調整が可能なのですが、自動売買となると結構複雑なロジックが必要になりそうです。なので片方が指値でメイカー約定したらもう片方は成行でテイカー約定するロジックでも始めはありかな、と思うようになりました。このロジックをフローチャートに表すと下記のようになります。

画像

ただ、成行の場合、板に注文が出ている価格と数量で約定価格が決まってしまうため想定よりも高く買ったり安く売ってしまうことになります。ですので前置きが長くなりましたが今回は板情報を取得してそれを元に成り行き注文の約定価格を計算するプログラムをPythonで実装しました。早速ですがソースコードは下記の通りです。今回はGMOコインのAPIで、買い注文をする想定(売りに出されている価格を取得)で実装しました。

import requests
import json
endPoint = 'https://api.coin.z.com/public'
path     = '/v1/orderbooks?symbol=BTC'
response = requests.get(endPoint + path)
json_data = response.json()
order_amount = 1	#注文予定数量
i = 0
size_sum = 0
price_sum = 0
taker_price = 0
while size_sum < order_amount:
	print('i=',i)
	print('price=',float(json_data["data"]["asks"][i]["price"]))
	print('size=',float(json_data["data"]["asks"][i]["size"]))
	size_sum = size_sum + float(json_data["data"]["asks"][i]["size"])
	price_sum = price_sum + float(json_data["data"]["asks"][i]["price"])
	print('size_sum=',size_sum)
	print('price_sum=',price_sum)
	taker_price = taker_price + float(json_data["data"]["asks"][i]["price"]) * (float(json_data["data"]["asks"][i]["size"]))
	print('taker_price=',taker_price)
	i = i + 1
delta = size_sum - order_amount
print('delta=',delta)
taker_price = taker_price - float(json_data["data"]["asks"][i-1]["price"]) * delta
print('taker_price=',taker_price)

こちらの部分で板情報を取得しています。

そしてこちらの部分で発注予定数量(order_amount)(今回は1BTC)を超えるまで安値で売り出されている順に板の注文情報を取得して注文毎の数量(size)を足し算していきます。それと合わせて取引金額も足し算しています(価格x数量)。

そして最後に発注予定数量を超えて足し算された部分を足切りして、1BTCの成行注文価格が計算できます。

実際にプログラムを実行してみた結果がこちらです。

この時の板情報を表に表してみるとこのようになります。

数量価格
0.28741124950
0.04281124960
0.12461124970
1.851124980

なので成行注文価格は、
0.2874*1124950 + 0.0428*1124960 + 0.1246*1124970 + (1.85-1.3048)*1124980
=1124969円となります。

このプログラムによって成行での約定価格が計算でき、利益が出せるかどうか注文前に判断できるようになりました。