おおかみ山

yet another rocket scientist

bitFlyer LightningのAPIをPythonから使えるパッケージ「pybitflyer」を作りました

最近ようやく重い腰をあげてBitcoinに入門しました。最初はBlockchainの仕組みなどを"Mastering Bitcoin"で学んでいたのですが、実際に取引してみないとピンと来ないということで、bitFlyerという取引所に口座を開設し、日本円をBitcoinに換金して遊ぶことに。

素人が売り買いをして価値がだんだん下がっていく数字を見ながら悲しんでいたのですが、そうなるとエンジニアとしてはシステムトレードがしたくなるのが世の常です(?)。幸いにもbitFlyerには、HTTP APIというURLを叩くことで情報を得たり取引をしたりできるシステムがあるではありませんか。しかしながらその仕組みは複雑で、セキュリティのための暗号化が必要だったり、HTTP APIで返ってくるものを処理したりと、そのまま扱うには何かと大変です。

そこで、bitFlyerのREST APIPythonから気軽に利用することができるラッパーを作成しました。

まだまだ作りかけでテストすらきちんとできていない状態ですが、一通り動くことが確認できたので公開してみました。

インストール

パッケージはPyPIに登録しているので、pipでインストールすることができます。現在のバージョンは0.1.0です。

$ pip install pybitflyer

使い方

使いはじめる前に

PythonのようなプログラムからbitFlyer Lightningを操作する際には、ログイン時に使用するようなメールアドレスとパスワードでははく、専用のAPI KeyとAPI Secretという2つの情報が必要です。これらは、bitFlyer Lightningの設定ページから作成することができるので、利用する前に作っておきましょう。

詳しくはAPI Documentationを参照ください。

f:id:yag_ays:20160828215226p:plain

f:id:yag_ays:20160828214806p:plain

これで準備は万全です!

基本的な使い方

まずはpybitflyerをインポートして、HTTP APIインスタンスを作成します。この際に上で取得したAPI KyeとAPI Secretを指定します(以下のコード例では...で埋めているので適宜置き換えて下さい)。

import pybitflyer

api = pybitflyer.API(api_key="...", api_secret="...")


なお、板情報や取引所の状態などはAPI KEYを必要としないため、pybitflyer.API()だけで取得することができます。

板情報を取得する

まずは下記のように、BTC_JPYを指定して情報を取得します。

board = api.board(product_code="BTC_JPY")

すると、以下のように辞書形式でasks(買値), bids(売値), mid_price(中間価格)という3つの情報を取得することができます(asksとbidsの途中を省略しています)。こういった取得できる情報はすべてAPI Documentationの「レスポンス」という箇所に記載されているので、利用する際はそちらと照らしあわせてみてください。

{'asks': [{'price': 58372.0, 'size': 1.0},
  {'price': 58373.0, 'size': 0.5},
  {'price': 58382.0, 'size': 2.0},
...
  {'price': 717600.0, 'size': 0.001}],
 'bids': [{'price': 58357.0, 'size': 6.3},
  {'price': 58356.0, 'size': 6.475},
...  
   {'price': 5754.0, 'size': 0.001}],
 'mid_price': 58364.0}

試しに少しデータをいじってみましょう。例えば買値の最小値と最大値を出したいときには、以下のようにasksの中のすべてのpriceを取り出してminとmaxで値を取り出せばよいというわけですね。

In [13]: min([p["price"] for p in board["asks"]])
Out[13]: 58372.0

In [14]: max([p["price"] for p in board["asks"]])
Out[14]: 717600.0

他にも幾つか機能を見てみましょう。

Tickerを取得する

次に、Tickerの情報も取得してみましょう。先ほどの板情報と同じように、今度は.ticker()というメソッドを使用します。

ticker = api.ticker(product_code="BTC_JPY")

すると、以下のようなデータがレスポンスとして返ってきます。

{'best_ask': 58372.0,
 'best_ask_size': 1.0,
 'best_bid': 58357.0,
 'best_bid_size': 5.0,
 'ltp': 58357.0,
 'product_code': 'BTC_JPY',
 'tick_id': 1215580,
 'timestamp': '2016-08-28T12:01:32.367',
 'total_ask_depth': 2238.88215243,
 'total_bid_depth': 2414.34489585,
 'volume': 42780.14047168,
 'volume_by_product': 17621.67437353}

新規注文を出す

それでは肝心の売買の注文を出してみましょう。なお、このHTTP APIはPrivateと呼ばれ、API KeyとAPI Secretを取得してインスタンス時に作成しておくことが必要ですのでご注意ください。

buy_btc = api.sendchildorder(product_code="BTC_JPY",
                             child_order_type="MARKET",
                             side="BUY",
                             size=0.001,
                             minute_to_expire=10000,
                             time_in_force="GTC"
                             )

product_codeは注文するプロダクトを指定します。BTC_JPYやFX_BTC_JPY、またはETH_BTCを選択します。

child_order_typeは注文のタイプで、指値注文なら"LIMIT"、成行注文なら"MARKET"を指定します。

sideには売り買いを"SELL"か"BUY"で、sizeに取引額を指定します。

なお、minute_to_expireやtime_in_forceは必須ではありません。

新規注文の確認

さて、先ほどの注文は無事に完了したでしょうか?buy_btcに以下のような情報が入って入れば取引成功です。

{'child_order_acceptance_id': 'JRF20160828-121631-076088'}

実際にbitFlyer Lightningでも以下のように確かめることができます。

f:id:yag_ays:20160828214929p:plain

他にできること

このpybitflyerパッケージはbitFlyerが提供しているHTTP APIを使いやすくしたWrapperですので、できることはすべてHTTP APIに準拠します。bitFlyerでは以下のHTTP APIの機能が提供されています。

  • 基本情報
    • 板情報
    • Ticker
    • 約定履歴
    • 取引所の状態
    • チャット
  • API
    • API キーの権限を取得
  • 資産
    • 資産残高を取得
    • 証拠金の状態を取得
  • 入出金
  • トレード
    • 新規注文を出す
    • 注文をキャンセルする
    • 新規の親注文を出す(特殊注文)
    • 親注文をキャンセルする
    • すべての注文をキャンセルする
    • 注文の一覧を取得
    • 親注文の一覧を取得
    • 親注文の詳細を取得
    • 約定の一覧を取得
    • 建玉の一覧を取得

(https://lightning.bitflyer.jp/docsより)

ウェブページからできることは大抵できるようになっているのではないでしょうか?中には「銀行口座一覧取得」なんてものもあります。このpybitflyerを作っている最中に試してみたのですが、本当に私が登録している銀行の名前や口座番号がレスポンスで返ってきて、少しびっくりしました……。

この記事でご紹介できた機能はほんの一部ですので、ぜひともbitFlyer Lightningの色々な機能を使ってみてください。

これから

これから以下のような方針で機能追加していくつもりです。気長にお待ちいただくか、もしくはPull Requestなどで一緒に開発しましょう!

  • TODO
    • [ ] Realtime APIに対応
    • [ ] 引数などのバリデーション対応
    • [ ] エラー処理をちゃんとする

他には、bitFlyer以外の取引所でもHTTP APIを提供しているところが数多くあるので、そこのWebAPI Wrapperも作成してみたいですね。

参考