2020/5/2

ゼロから始めるBitcoinの自動取引①


この記事は全4回中の第1回です。他の回についてはこちら( #2 / #3 / #4 )。 bitFlyerを利用したBitcoinの自動取引について、Pythonと裁定取引についてはある程度わかるけど他はわからないという人のために概要を簡潔に書いていきます。 全4回を通して簡単なスイングトレードbotとそのバックテストシステムを作ります。 第1回の今回はAPI編です。

APIとは

Application Programming Interfaceの略です。 アプリケーションの一部の情報を外部の第三者も取り扱えるようにしてくれている仕組みだと理解して良いです。 基本的にはHTTP通信をして情報を取ってきたり送ったりします。 HTTP通信にはGETとPOSTの2種類の方法があって、前者はレスポンスとして情報を受け取るだけの通信、後者は情報をこちらからも送る通信です。 HTTP通信については専門外なので、詳細は他サイトで調べてください。

bitFlyer API

大体の暗号通貨取引所がAPIを公開してくれています。 bitFlyerであれば こちらのページに仕様の説明があって、取得できる情報が載っています。 この使い方を学びましょう。

requestsを利用する方法

bitFlyer APIにはPublic APIとPrivate APIが存在し、前者は誰でも同様に受け取れる情報(板情報など)、後者は特定の個人だけが受け取れる情報(自分の口座残高など)です。 Public APIは認証が必要がないため、例えば板情報を得ようと思ったら、https://lightning.bitflyer.com/docs?lang=ja#板情報を参考にしながら、Pythonのrequestsを使って以下のような簡単なコードで取得できます。 (requestsライブラリがパソコンに入っていない人はターミナルで pip install requests などとしてインストールしましょう)

[コードを表示]

Python

import requests
response = requests.get("https://api.bitflyer.jp/v1/getboard/")
print(response.json())

これを実行すれば以下のようなデータが表示されます。これがレスポンスです。

{'mid_price': 998426.0, 
 'bids': [{'price': 998050.0, 'size': 0.44999999}, {'price': 997981.0, 'size': 0.001}, {'price': 997972.0, 'size': 0.44999999},...],
 'asks': [{'price': 999094.0, 'size': 0.04681}, {'price': 999096.0, 'size': 0.4879}, {'price': 999098.0, 'size': 0.55},...]
}

bitFlyer APIのレスポンスは大体jsonというデータ形式になっていて、これもその形です。 Private APIについては自分のAPI keyとAPI secretによる認証が必要で少しコードが複雑になります。 例えば、普通に注文しようと思ったら、https://lightning.bitflyer.com/docs?lang=ja#新規注文を出すを参考にしながら、以下のようにします。 ※このコードを実行すると実際に0.01btcの買い注文がなされます。気をつけてください。

[コードを表示]

Python

import hashlib
import hmac
import requests
import datetime
import json

API_KEY = "***"
API_SECRET = "***"

def sendchildorder(side,size):
    try:
        api_key = API_KEY
        api_secret = API_SECRET
        
        base_url = "https://api.bitflyer.jp"
        path_url = "/v1/me/sendchildorder"
        method = "POST"
        
        timestamp = str(datetime.datetime.today())
        
        param = {
        	"product_code" : "FX_BTC_JPY",
        	"child_order_type" : "MARKET",
        	"side" : side,
        	"size" : size,
        }
        body = json.dumps(param)
        
        message = timestamp + method + path_url + body
        signature = hmac.new(bytearray(api_secret.encode('utf-8')), message.encode('utf-8') , digestmod = hashlib.sha256 ).hexdigest()
        
        headers = {
        	'ACCESS-KEY' : api_key,
        	'ACCESS-TIMESTAMP' : timestamp,
        	'ACCESS-SIGN' : signature,
        	'Content-Type' : 'application/json'
        }
        
        response = requests.post( base_url + path_url , data = body , headers = headers)
        return response.status_code
    except requests.exceptions.RequestException as e:
        print(e)
        return -1

# サイズ0.01の買い注文を行う
print(sendchildorder("BUY",0.01))

変数 API_KEY , API_SECRET には自分のAPI keyとAPI secretの文字列を入れます。API secretの取り扱いには十分に気をつけてください。 (自分の取引アカウントのAPI keyとAPI secretの取得方法がわからない場合は他サイトを参照してください) 自分の専門外のため詳細な説明は控えますが、何をやっているかの気持ちだけ説明しておくと、API keyとAPI secretで認証を行いつつPOSTのHTTP通信をしている感じです。 Bodyパラメータは params の部分に書きます。今回は sidesize を引数にしましたが、他の部分も変数にしても良いです。 例外処理を行なっているのはたまにbitFlyer側が重たいときにエラーを吐いてしまうためです。bitFlyerに関しては自分が取引を行なっていたころはサーバーが重くなって通信がうまくいかないことがしょっちゅうあったのでこのような処理はしていた方が良いです。 基本的には以上の二つです。path_urlmethod , param を変えれば注文のキャンセルやIFDOCO注文など他のAPIも同様に利用できます。

ライブラリを利用する方法

2-1で解説したものが基本ではありますが、それらを簡単に扱えるようにしたライブラリが開発されています。 pybitflyerやccxtなどがその例です。 pybitflyerについては次のサイトで開発者さんが使い方を解説してくれています。 https://wolfin.hatenablog.com/entry/2016/08/29/010112 ccxtも似た感じです。 実装上ではこれらのライブラリを利用するのがコードが簡潔になるのでおすすめです。

Cryptowatch API

CryptowatchというサイトのAPIについても確認しておきます。 これは色々な暗号通貨取引所の約定履歴のOHLCチャートなどが見られるサイトです。 bitFlyerのAPIではOHLCデータそのものを取ってくることができないので(約定履歴から自分で作ることはできます)、簡単のためこのサイトのAPIを利用します。 自分の欲しい時間足のOHLCデータを取得して [[timestamp,open,high,low,close,volume],...] のnumpy.ndarrayにして返す関数を作ります。

[コードを表示]

Python

import numpy as np
import requests

# CryptowatchからOHLCデータ取得
def getohlc(periods):
    response = requests.get("https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc",params = {"periods": periods})
    ohlc = np.array(response.json()['result'][str(periods)])[-100:,:5] # 長すぎると計算時間が増えるので最新100件に整形
    return ohlc

ohlc = getohlc(60)
print(ohlc[:5])

Cryptowatchのresponseを見るとわかりますが、

json

{"result":{
        "60":[[timestamp,open,high,low,close,volume,?],...]
    },
 "allowance":{
        ...
    }
}

のようになっているのでOHLCデータの部分を抜き出します。(?のところの数字の意味はよくわからないので落とします) 引数 periods には取得したいOHLCの時間足を秒換算した値を入れます。例えば、30分足なら1800です。 Cryptowatchでは取得できるOHLCデータの時間足が(覚えている限りだと)1分足、5分足、30分足、1時間足、1日足などに限られています。 すなわちperiodsに入る値としては60,300,1800,3600,86400などで、取得できない値を入れるとエラーとなります。 params には他に afterbefore などを指定でき、unixtimeを入れるとその時刻より後のデータや前のデータを取ってきます。 ただし、現在時刻より6000本以上前のOHLCデータを取得することはできません。つまり、CryptowatchのOHLCデータの最大取得件数は6000件です。 さて、今回はここまでにします。APIの利用ができるようになったところで次回はテクニカル指標の実装について説明します。

今回のまとめ

  • 自動取引にはAPIを利用する

参考

文系でもわかる!BitcoinのBOT自動売買トレードの始め方:https://ryota-trade.com

back