準備編

はじめに

APIの使用には以下の注意事項を守るように注意しましょう。最悪、今後のAPIによるアクセスが禁止される可能性があります。

API制限
HTTP API は、以下のとおり呼出回数を制限いたします。

  • Private API は 1 分間に約 200 回を上限とします。
  • IP アドレスごとに 1 分間に約 500 回を上限とします。

注文数量が 0.01 以下の注文を大量に発注するユーザーは、一時的に、発注できる注文数が 1 分間に約 10 回までに制限されることがあります。
システムに負荷をかける目的での発注を繰り返していると当社が判断した場合は、API の使用が制限されることがあります。ご了承ください。

詳しい内容はAPI Documentationを確認してください。

APIキーの取得

BitFlyer Lightningにアクセスして左のハンバーガーメニューからAPIを選択します。

新しいAPIキーを追加を選択します。

次に権限を選択します。今回はBotの制作の為に資産権限とトレード権限を追加します。
※セキュリティの為、必ずAPIキーは自己で責任を持って保管すると共に、出入金などの使わない権限は切っておくことを強くオススメします。

ライブラリ(pybitflyer)のインストール

パッケージはPyPIに登録しているので、pipでインストールすることができます。以下のコマンドをターミナルで実行してください。(初回のみ)

$ pip install pybitflyer

マーケット情報を取得

マーケット情報はpublicAPIとして提供されていて、以下のURLにアクセスすることでブラウザ上でも簡易的に流れをつかむことができます。

https://api.bitflyer.jp/v1/ticker/
https://api.bitflyer.jp/v1/getboard/
https://api.bitflyer.jp/v1/getexecutions/

一番上では、現在価格などのマーケット情報を、
真ん中は、未約定の注文一覧を、
そして一番下は、全約定履歴をデータとして取得することができます。
これらをプログラム上から取得できるようにしていきましょう。

板情報の取得

サンプルコードの15行目、

api.board(product_code=PRODUCT_CODE)

の部分でデータの取得を行なっています。
今回はFXの板情報を取得する為に、product_codeを引数として設定しています。

以下サンプルコードです。

import pybitflyer

ACCESS_KEY=''# 自身のAPIキーを入力
SECLET_KEY=''# 自身のシークレットキーを入力

#よく使うパラメータはここで予め宣言しておくと便利です
PRODUCT_CODE = 'FX_BTC_JPY'

#インスタンスを生成します
# ここでキーのセットを行います
api = pybitflyer.API(api_key=ACCESS_KEY, api_secret=SECLET_KEY)

#板情報をprintで確認します
print(api.board(product_code=PRODUCT_CODE))

###############
#  実行結果
###############
{
  "mid_price": 33320,
  "bids": [
    {
      "price": 30000,
      "size": 0.1
    },
    {
      "price": 25570,
      "size": 3
    }
  ],
  "asks": [
    {
      "price": 36640,
      "size": 5
    },
    {
      "price": 36700,
      "size": 1.2
    }
  ]
}

マーケット情報の取得(ticker)

同じく、サンプルコードの15行目、

api.ticker(product_code=PRODUCT_CODE)

の部分でデータの取得を行なっています。

以下サンプルコードです。

import pybitflyer
import json

ACCESS_KEY=''# 自身のAPIキーを入力
SECLET_KEY=''# 自身のシークレットキーを入力

#よく使うパラメータはここで予め宣言しておくと便利です
PRODUCT_CODE = 'FX_BTC_JPY'

#インスタンスを生成します
# ここでキーのセットを行います
api = pybitflyer.API(api_key=ACCESS_KEY, api_secret=SECLET_KEY)

#マーケット情報をprintで確認します
print(json.dumps(api.ticker(product_code=PRODUCT_CODE), ensure_ascii=False, indent=2))

###############
#  実行結果
###############
{
    "product_code": "BTC_JPY",#取引ペア
    "timestamp": "2015-07-08T02:50:59.97",#時刻(世界協定時:UTC)
    "tick_id": 3579,#識別ID
    "best_bid": 30000,#買値の最高値
    "best_ask": 36640,#売値の最安値
    "best_bid_size": 0.1,#買値の最高値の数量
    "best_ask_size": 5,#売値の最安値の数量
    "total_bid_depth": 15.13,#買い注文の総量
    "total_ask_depth": 20,#売り注文の総量
    "ltp": 31690,#最終取引価格
    "volume": 16819.26,#24 時間の取引量
    "volume_by_product": 6819.26#24 時間の取引量(通過ペアのみ)
}

コラム json形式のレスポンスを見やすく表示

import json
json_data = {'product_code': 'FX_BTC_JPY', 'timestamp': '2018-05-12T01:34:07.097', 'tick_id': 16269258, 'best_bid': 958663.0, 'best_ask': 958713.0, 'best_bid_size': 0.29, 'best_ask_size': 0.2, 'total_bid_depth': 6831.4483185, 'total_ask_depth': 8594.92780409, 'ltp': 958663.0, 'volume': 203673.55581409, 'volume_by_product': 183037.37941476}

print(json.dumps(json_data, ensure_ascii=False, indent=2))

###############
#  実行結果
###############
{
  "product_code": "FX_BTC_JPY",
  "timestamp": "2018-05-12T01:34:07.473",
  "tick_id": 16269276,
  "best_bid": 958657.0,
  "best_ask": 958663.0,
  "best_bid_size": 0.084,
  "best_ask_size": 0.174,
  "total_bid_depth": 6832.03831863,
  "total_ask_depth": 8599.57980448,
  "ltp": 958663.0,
  "volume": 203673.84581409,
  "volume_by_product": 183037.66941476
}

このように、コーディング途中でjson形式、辞書配列形式などのデータが見にくいと感じた時は、print時にjson.dumpsを使うと見やすくなってミスが減ると思います。

全取引履歴を取得

こちらも、サンプルコードの15行目、

api.getexecutions(product_code=PRODUCT_CODE)

の部分でデータの取得を行なっています。

以下サンプルコードです。

import pybitflyer
import json

ACCESS_KEY=''# 自身のAPIキーを入力
SECLET_KEY=''# 自身のシークレットキーを入力

#よく使うパラメータはここで予め宣言しておくと便利です
PRODUCT_CODE = 'FX_BTC_JPY'

#インスタンスを生成します
# ここでキーのセットを行います
api = pybitflyer.API(api_key=ACCESS_KEY, api_secret=SECLET_KEY)

#マーケット情報をprintで確認します
print(json.dumps(api.getexecutions(product_code=PRODUCT_CODE), ensure_ascii=False, indent=2))

###############
#  実行結果
###############
[
 {
 "id": 39287,#約定ID
 "side": "BUY",#テイカー側となる注文(板寄せ時には空欄)
 "price": 31690,#約定価格
 "size": 27.04,#約定数量
 "exec_date": "2015-07-08T02:43:34.823",#約定時刻
 "buy_child_order_acceptance_id": "JRF20150707-200203-452209",#買い方の注文ID
 "sell_child_order_acceptance_id": "JRF20150708-024334-060234"#売り方の注文ID
 },
 {
 "id": 39286,
 "side": "SELL",
 "price": 33170,
 "size": 0.36,
 "exec_date": "2015-07-08T02:43:34.72",
 "buy_child_order_acceptance_id": "JRF20150708-010230-400876",
 "sell_child_order_acceptance_id": "JRF20150708-024334-197755"
 }
]

板の状態を取得

同様に、板の状態(サーバーの重さ)を取得するには、

api.getboardstate(product_code=PRODUCT_CODE)

を使うことで可能です。

取得可能なデータは以下の通りです。

health: 取引所の稼動状態です。以下のいずれかの値をとります。

  • NORMAL: 取引所は稼動しています。
  • BUSY: 取引所に負荷がかかっている状態です。
  • VERY BUSY: 取引所の負荷が大きい状態です。
  • SUPER BUSY: 負荷が非常に大きい状態です。発注は失敗するか、遅れて処理される可能性があります。
  • NO ORDER: 発注が受付できない状態です。
  • STOP: 取引所は停止しています。発注は受付されません。

state: 板の状態です。以下の値をとります。

  • RUNNING: 通常稼働中
  • CLOSED: 取引停止中
  • STARTING: 再起動中
  • PREOPEN: 板寄せ中
  • CIRCUIT BREAK: サーキットブレイク発動中
  • AWAITING SQ: Lightning Futures の取引終了後 SQ(清算値)の確定前
  • MATURED: Lightning Futures の満期に到達

data: 板の状態について、付加情報を提供します。

  • special_quotation: Lightning Futures の SQ(清算値)

まとめ

いかがでしたか?
今回は、pythonでpybitflyerを用いてbitFlyerのAPIにアクセスする方法を説明しました。
質問等があればコメントにお願いします。

次回は実際にAPIを経由して注文を行いたいと思います。