仮想通貨 API 解説編 その3 ー BinanceのAPIを使って情報を取得する
あっという間に新年を迎えてしまいました。
オミクロンもまだどうなっていくか全く見えないので今年も昨年と同じ生活スタイルになりそうです。私自身は3回目の予防接種は済ませていますが、また半年後に四回目とか言われるとキツイですね。
FX用のボットのテストにも少し飽きてきたので仮想通貨取引所のAPIをまた少し触ってみました。
API用のドキュメントが理解しやすそうだったのでバイナンス社のAPIを使ってみました。
前のCoinGeckoの時と同様にAPIマニュアルの解読といくつかのエンドポイントを試しに使ってみます。
APIドキュメント
マニュアルを解読
APIの解説ページに行ってみます。(日本語のホームページから行くにはちょっと複雑みたいです。)
APIの解説についての日本語版は見当たりませんでした。
英語版: https://binance-docs.github.io/apidocs/spot/en
中国語版: https://binance-docs.github.io/apidocs/spot/cn
大雑把ですが内容を見ていきます。
Introduction(はじめに)
https://binance-docs.github.io/apidocs/spot/en/#introduction
まずIntorductionの項には、APIキーの取得方法とか制限とかが書かれていますが、今回は必要ないので読み飛ばしていきます。
ラッパーのようなものもあるようですし、Postman Coolectionの説明の部分には、Postmanと呼ばれるAPIの開発をするときに便利なツールにも対応しているとの事です。
General Info(一般事項)
https://binance-docs.github.io/apidocs/spot/en/#general-api-information
General API Info(APIの一般事項)
URLの説明(ミラーサイト的なものも用意されている)、戻り値のソート順の説明(古いものが先)やタイムスタンプの単位の説明(ミリ秒)などがあります。
エンドポイント用のURLはhttps://api.binance.comとなっています。US在住の人はbinance.usの方がメインのようですので、その場合はhttps://api.binance.usになるようです。
LIMITS(制限事項)
アクセスの制限ですが、CoinGeckoと違い単純な間隔制限ではなく"weight"と呼ばれるポイント制での制限を行っています。
接続するエンドポイントの処理の重さや戻り値の大きさによって点数が変わってきます。
制限を超えてアクセスするとエラーコード”429”が返ってくるようですが、何度も制限違反をすると接続禁止(2分から3日間)になるそうなので気を付けてください。
"weight"の点数は各エンドポイントの説明のところに表示されています。
オーダーブック取得用エンドポイントの例ですが、取得する数によって1,5,10,50点とポイントが違っているのがわかると思います。
また、FAQによれば一分間に1200ポイントが上限のようですので価格情報を取得する程度では、余程の事でない限り大丈夫でしょう。(日本語の説明は以下参照。) www.binance.com
その他 (SIGNED, Public API Definition)
https://binance-docs.github.io/apidocs/spot/en/#signed-trade-user_data-and-margin-endpoint-security
https://binance-docs.github.io/apidocs/spot/en/#public-api-definitions
エンドポイントの引数の構文や指定できる値についての説明があります。
検索条件に使える値がよくわからない時はこのあたりを探すとなんとかなります。
Market Dataエンドポイントの説明
https://binance-docs.github.io/apidocs/spot/en/#market-data-endpoints
APIキーなしにアクセスできるエンドポイントはMarket Data Endpointになります。
WebSocketによるストリーミングのマーケットデータもとれそうですが、自動売買をするわけではないのでパスします。
例として銘柄の価格の取得になりますが、エンドポイントの説明、Weightのポイント、引数の説明があり右端には戻り値の例が表示されています。
サンプルプログラム
だいだいマニュアルの内容が理解できたところで実際に試してみます。
私はアメリカに住んでいますのでエンドポイントのURLは今回は"https://api.binance.us"を使用してみます。今回試したエンドポイントの範囲では.comでも.usでもどちらでも同じように動きますが、取引できる通貨の種類は違うようです。
またサンプルをコーディングするにあたり情報の取得(GET)を行うだけですのでエンドポイントを呼び出した際に発生するエラーの例外処理は特に行いません。
テスト接続 (GET /api/v3/ping)
まずサーバーが動いているか確認してみます。
サーバーからの応答があった場合は空のリスト"{}"が戻るようです。
import requests URL = "https://api.binance.us" #/ping (サーバーからの応答) endpoint = "/api/v3/ping" url = URL + endpoint response = requests.request("GET", url) r = response.json() print(r) if not r: print("Open") else: print("Close")
戻り値
{} Open
問題なく動きました。 動いていない時は何が戻るかは不明。
銘柄情報の取得 (GET /api/v3/exchangeInfo)
次は取引できる銘柄情報の取得をしてみます。
引数を指定しないとすべての銘柄とその付随情報がすべて出力されちょっと長すぎるので、今回は銘柄名(symbol)に絞って出力してみます。
import requests URL = "https://api.binance.us" endpoint = "/api/v3/exchangeInfo" url = URL + endpoint response = requests.request("GET", url) r = response.json() for i in r['symbols']: print(i['symbol'])
戻り値
BTCUSD ETHUSD XRPUSD BCHUSD LTCUSD USDTUSD BTCUSDT ETHUSDT XRPUSDT BCHUSDT LTCUSDT BNBUSD BNBUSDT ETHBTC XRPBTC BNBBTC LTCBTC BCHBTC ADAUSD BATUSD ETCUSD XLMUSD ZRXUSD ADAUSDT BATUSDT ETCUSDT XLMUSDT ZRXUSDT LINKUSD RVNUSD DASHUSD ZECUSD ALGOUSD IOTAUSD BUSDUSD BTCBUSD DOGEUSDT WAVESUSD ATOMUSDT ATOMUSD NEOUSDT NEOUSD VETUSDT QTUMUSDT QTUMUSD NANOUSD ICXUSD ENJUSD ONTUSD ONTUSDT ZILUSD ZILBUSD VETUSD BNBBUSD XRPBUSD ETHBUSD ALGOBUSD XTZUSD XTZBUSD HBARUSD HBARBUSD OMGUSD OMGBUSD MATICUSD MATICBUSD XTZBTC ADABTC REPBUSD REPUSD EOSBUSD EOSUSD DOGEUSD KNCUSD KNCUSDT VTHOUSDT VTHOUSD USDCUSD COMPUSDT COMPUSD MANAUSD HNTUSD HNTUSDT MKRUSD MKRUSDT DAIUSD ONEUSDT ONEUSD BANDUSDT BANDUSD STORJUSDT STORJUSD BUSDUSDT UNIUSD UNIUSDT SOLUSD SOLUSDT LINKBTC VETBTC UNIBTC EGLDUSDT EGLDUSD PAXGUSDT PAXGUSD OXTUSDT OXTUSD ZENUSDT ZENUSD BTCUSDC ONEBUSD FILUSDT FILUSD AAVEUSDT AAVEUSD GRTUSD SUSHIUSD ANKRUSD AMPUSD SHIBUSDT SHIBBUSD CRVUSDT CRVUSD AXSUSDT AXSUSD SOLBTC AVAXUSDT AVAXUSD CTSIUSDT CTSIUSD DOTUSDT DOTUSD YFIUSDT YFIUSD 1INCHUSDT 1INCHUSD FTMUSDT FTMUSD USDCUSDT ETHUSDC USDCBUSD MATICUSDT MANAUSDT MANABUSD ALGOUSDT
ちょっと長いですが全部貼り付けてみました。全部で143種類あります。 ちなみに"https://api.binance.com"で同じものを動かすと、なんと1885種類出てきました。
ろうそく足の取得 (GET /api/v3/klines)
どんな銘柄が指定できるか分かりましたので、ドージコイン(DOGE)の1時間足のろうそく足データ5本分取得してみます。
引数の構文は、"?"の後に条件を加えていきます。複数の場合は"&"でつなぎます。また、引数に使える値は"interval"であれば以下のようになりますので
https://binance-docs.github.io/apidocs/spot/en/#public-api-definitions
今回1時間足ですので"1h"となります。
import requests import json import pandas as pd import mplfinance as mpf URL = "https://api.binance.us" endpoint = "/api/v3/klines" params = "?symbol=DOGEUSD&interval=1h&limit=5" url = URL + endpoint + params response = requests.request("GET", url) r = response.json() print(json.dumps(r, indent=2))
戻り値
[ [ 1641614400000, "0.1565", "0.1572", "0.1558", "0.1570", "1812139.00000000", 1641617999999, "283917.0058", 246, "1114950.00000000", "174780.7051", "0" ], [ 1641618000000, "0.1567", "0.1569", "0.1562", "0.1568", "822400.00000000", 1641621599999, "128820.8862", 125, "434769.00000000", "68140.3604", "0" ], [ 1641621600000, "0.1569", "0.1575", "0.1564", "0.1575", "402360.00000000", 1641625199999, "63124.9410", 107, "205005.00000000", "32175.7235", "0" ], [ 1641625200000, "0.1574", "0.1578", "0.1567", "0.1570", "489498.00000000", 1641628799999, "76999.9052", 113, "419390.00000000", "65978.2293", "0" ], [ 1641628800000, "0.1572", "0.1579", "0.1570", "0.1572", "911025.00000000", 1641632399999, "143202.0120", 97, "529548.00000000", "83236.3075", "0" ] ]
戻り値の配列の各要素の内容はマニュアルの右端に説明がありますので、ついでにろうそく足のグラフを書いてみます。
ろうそく足グラフの描写
グラフ用にpandasとmplfinanceをインポートします。
先程はエンドポイントの引数をURL内の"?"で指定していましたが、CoinGeckoの時と同じように引数を"params"で渡してあげても使えるのでその方法で試してみます。
また足が5本だけだと短いので50本に増やしてみます。
import requests import json import pandas as pd import mplfinance as mpf URL = "https://api.binance.us" endpoint = "/api/v3/klines" url = URL + endpoint params = { "symbol" : "DOGEUSD", "interval" : "1h", "limit" : 50 } r = requests.request("GET", url, params=params) #データフレームの作成と必要なコラムの抽出 df = pd.DataFrame(r.json()).iloc[:, 0:5] #コラム名を追加 df.columns = ['Time', 'Open', 'High', 'Low', 'Close'] df = df.astype(float) #UNIX時間をUTC時間に変換 df['Time'] =df['Time'].astype('datetime64[ms]') #DataFrameの時刻用の列をDateTimeインデックスに変換 df.set_index('Time', inplace=True) #チャートの表示 mpf.plot(df,type='candle')
実行すると以下のようなグラフが表示されました。
まとめ
今回はバイナンスのAPIを触ってみました。 マニュアルがきちんとあるので簡単にデータが取得できました。 さらに、アカウントがなくてもデータを取得させてくれるというのは大変ありがたいですね。
また時間があるときに他の取引所のAPIも試してみたいと思います。