シストレどうですか

  Algorithmic Trading for Dummies

仮想通貨 API 解説編 その3 ー BinanceのAPIを使って情報を取得する

あっという間に新年を迎えてしまいました。
オミクロンもまだどうなっていくか全く見えないので今年も昨年と同じ生活スタイルになりそうです。私自身は3回目の予防接種は済ませていますが、また半年後に四回目とか言われるとキツイですね。

FX用のボットのテストにも少し飽きてきたので仮想通貨取引所APIをまた少し触ってみました。
API用のドキュメントが理解しやすそうだったのでバイナンス社のAPIを使ってみました。
前のCoinGeckoの時と同様にAPIマニュアルの解読といくつかのエンドポイントを試しに使ってみます。

jantzen.hatenablog.com


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"の点数は各エンドポイントの説明のところに表示されています。

f:id:jantzen:20220107080154j:plain:w350:h400

オーダーブック取得用エンドポイントの例ですが、取得する数によって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によるストリーミングのマーケットデータもとれそうですが、自動売買をするわけではないのでパスします。

f:id:jantzen:20220107103733j:plain:w550

例として銘柄の価格の取得になりますが、エンドポイントの説明、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"であれば以下のようになりますので

f:id:jantzen:20220109081733j:plain:w350
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"
  ]
]

戻り値の配列の各要素の内容はマニュアルの右端に説明がありますので、ついでにろうそく足のグラフを書いてみます。

f:id:jantzen:20220109081952j:plain

ろうそく足グラフの描写

グラフ用に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')

実行すると以下のようなグラフが表示されました。

f:id:jantzen:20220108180553j:plain


まとめ


今回はバイナンスのAPIを触ってみました。 マニュアルがきちんとあるので簡単にデータが取得できました。 さらに、アカウントがなくてもデータを取得させてくれるというのは大変ありがたいですね。

また時間があるときに他の取引所のAPIも試してみたいと思います。