シストレどうですか

  Algorithmic Trading for Dummies

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

前回 からの続きで、仮想通貨の取引所系のサーバーからも価格などの情報がAPIキーなしで取得できますので、将来仮想通貨で自動売買する日に備え、日本でも取引できる取引所の中からbitFlyer社のAPIを使ってみました。

bitflyer.com


bitFlyer APIの使い方

前提はbitFlyerにアカウント登録をしているわけではありませんので、APIキーなしでアクセスできるエンドポイントについて確認してみました。

マニュアルを解読

CoinGeckoの時と同様にAPIの解説ページに行ってみます。

bitFlyer Lightning API bitFlyer Lightning API

残念ながらマニュアル自体は英語のみになります。
bitFlyer Lightning Palygroudへ行くと、どんな戻り値が返ってくるか確認できるようになっていますので、非常に便利です。

bitFlyer Lightning API Playground bitFlyer Lightning API Playground

API KeyとAPI Secretを入力するフィールドがありますがPublic APIの場合は何も入力しなくてもレスポンスが表示されます。

HTTP API

URL、制限事項、認証方法などについての説明がされていますが、 エンドポイントのURLは"https://api.bitflyer.com/v1/"で、呼び出し回数制限は同じIPアドレスから5分で500回(平均で0.6秒に一回)までです。
制限を超えると一時的にリミットがさらに厳しくなります。(1時間の間1分間に10回までに制限)

HTTP Public API

APIキーなしにアクセスできるエンドポイントを大きく分けると、

  • Market List (マーケット情報の取得)
  • Order Book (オーダーブックの取得)
  • Ticker (ティッカー情報の取得)
  • Execution History (取引履歴の取得)
  • Orderbook Status (オーダーブックの状態)
  • Exchange Status (サーバーの状態)
  • Chat(チャットの取得)
になりますが、それぞれについてさらにいくつかのエンドポイントが用意されています。
"/usa"や”/eu"は地域に依存しているエンドポイントですが、"get…"がつくのとつかないのでどう違うかよくわかりませんので、確認しながら試していきたいと思います。

サンプルプログラム

今回も情報を取得するだけなので、例外処理は気にせずに作成してみます。

Market List - GET /v1/getmarkets, GET /v1/markets

商品の種類を取得。

import requests
import json
  
URL = "https://api.bitflyer.com/v1/"
  
#Markets
endpoint = "getmarkets"
url = URL + endpoint
response = requests.request("GET", url)
r = response.json()
print("getあり :")
print(json.dumps(r, indent=2))
  
endpoint = "markets"
url = URL + endpoint
response = requests.request("GET", url)
r = response.json()
print("getなし :")
print(json.dumps(r, indent=2))

戻り値

getあり :
[
  {
    "product_code": "BTC_JPY",
    "market_type": "Spot"
  },
  {
    "product_code": "XRP_JPY",
    "market_type": "Spot"
  },
  {
    "product_code": "ETH_JPY",
    "market_type": "Spot"
  },
  {
    "product_code": "XLM_JPY",
    "market_type": "Spot"
  },
  {
    "product_code": "MONA_JPY",
    "market_type": "Spot"
  },
  {
    "product_code": "ETH_BTC",
    "market_type": "Spot"
  },
  {
    "product_code": "BCH_BTC",
    "market_type": "Spot"
  },
  {
    "product_code": "FX_BTC_JPY",
    "market_type": "FX"
  },
  {
    "product_code": "BTCJPY02APR2021",
    "alias": "BTCJPY_MAT1WK",
    "market_type": "Futures"
  },
  {
    "product_code": "BTCJPY09APR2021",
    "alias": "BTCJPY_MAT2WK",
    "market_type": "Futures"
  },
  {
    "product_code": "BTCJPY25JUN2021",
    "alias": "BTCJPY_MAT3M",
    "market_type": "Futures"
  }
]
getなし :
[
  {
    "product_code": "BTC_JPY",
    "market_type": "Spot"
  },
  {
    "product_code": "XRP_JPY",
    "market_type": "Spot"
  },
  {
    "product_code": "ETH_JPY",
    "market_type": "Spot"
  },
  {
    "product_code": "XLM_JPY",
    "market_type": "Spot"
  },
  {
    "product_code": "MONA_JPY",
    "market_type": "Spot"
  },
  {
    "product_code": "ETH_BTC",
    "market_type": "Spot"
  },
  {
    "product_code": "BCH_BTC",
    "market_type": "Spot"
  },
  {
    "product_code": "FX_BTC_JPY",
    "market_type": "FX"
  },
  {
    "product_code": "BTCJPY02APR2021",
    "alias": "BTCJPY_MAT1WK",
    "market_type": "Futures"
  },
  {
    "product_code": "BTCJPY09APR2021",
    "alias": "BTCJPY_MAT2WK",
    "market_type": "Futures"
  },
  {
    "product_code": "BTCJPY25JUN2021",
    "alias": "BTCJPY_MAT3M",
    "market_type": "Futures"
  }
]

"getmarkets"も"markets"も同じ内容でした。APIで使える商品種類は少なそうです。

Ticker - GET /v1/getticker, GET /v1/ticker

価格情報の取得。

import requests
import json
  
URL = "https://api.bitflyer.com/v1/"
  
#Ticker
endpoint = "getticker"
url = URL + endpoint
params = {"product_code" : "BTC_JPY"}
response = requests.request("GET", url, params=params)
r = response.json()
print("getあり :")
print(json.dumps(r, indent=2))
  
endpoint = "ticker"
url = URL + endpoint
response = requests.request("GET", url, params=params)
r = response.json()
print("getなし :")
print(json.dumps(r, indent=2))

戻り値

getあり :
{
  "product_code": "BTC_JPY",
  "state": "RUNNING",
  "timestamp": "2021-04-01T14:00:59.94",
  "tick_id": 440187,
  "best_bid": 6514541.0,
  "best_ask": 6516896.0,
  "best_bid_size": 0.001,
  "best_ask_size": 0.04992769,
  "total_bid_depth": 729.40490557,
  "total_ask_depth": 665.21456183,
  "market_bid_size": 0.0,
  "market_ask_size": 0.0,
  "ltp": 6516896.0,
  "volume": 7517.65030598,
  "volume_by_product": 4531.72444335
}
getなし :
{
  "product_code": "BTC_JPY",
  "state": "RUNNING",
  "timestamp": "2021-04-01T14:00:59.973",
  "tick_id": 440190,
  "best_bid": 6514541.0,
  "best_ask": 6516896.0,
  "best_bid_size": 0.001,
  "best_ask_size": 0.04992769,
  "total_bid_depth": 729.47490557,
  "total_ask_depth": 665.26456183,
  "market_bid_size": 0.0,
  "market_ask_size": 0.0,
  "ltp": 6516896.0,
  "volume": 7517.68030598,
  "volume_by_product": 4531.72444335
}

Market Listエンドポイントと同様"getticker"も"ticker"も同じ内容でした。

Order Book - GET /v1/getboard, GET /v1/board

オーダーブック情報の取得。

import requests
  
URL = "https://api.bitflyer.com/v1/"
  
#Order Book
endpoint = "getboard"
url = URL + endpoint
params = {"product_code" : "BTC_JPY"}
response = requests.request("GET", url, params=params)
r = response.json()

print("mid_price: %s" %r['mid_price'])
print("bids: %s" %r['bids'][0])
print("asks: %s" %r['asks'][0])

戻り値

mid_price: 6513768.0
bids: {'price': 6513305.0, 'size': 0.05094774}
asks: {'price': 6514231.0, 'size': 0.035}

すべて出力すると多すぎましたので、"getboard"のみでかつ最初のデータだけ表示するようにしてあります。

他にもチャットの取得も出来るようですが、利用方法がよくわからないのでここまでにしておきます。


まとめ

公開されているAPIから情報を取得するだけであればとても簡単ですね。
指定できる引数は少ないですが、その分シンプルでわかりやすいです。
Realtime APIという事でレート情報などをストリーミングで取得する事も可能です。

他の取引所でもPublic APIという事でAPIキーなしのエンドポイントが提供されていますので、興味のある方はいろいろ試してみてください。
例えばコインチェックやLiquidのAPIのマニュアルはすべて日本語で書かれていますので、英語を読むのが面倒くさい人向けです。 coincheck.com document.liquid.com