おおかみ山

yet another rocket scientist

bitFlyerのticker情報をInfluxDBに入れてGrafanaで可視化する

概要

前回ビットコインのデータをバルクで配布しているサイトから直接ダウンロードして可視化しましたが、今回は自分でデータを取ってきて蓄積し、可視化までの流れをやってみたいと思います。

色々と方法はあると思いますが、せっかくなので自身の勉強のためにも、今回は時系列DBとして有名なInfluxDBをデータベースとして、可視化には相性の良いGrafanaを選択しました。取得するデータはbitFlyerのtickerの情報です。API経由でask/bidの価格や量などの情報を取得することができます(link)。

方法

環境

  • macOS El capitan 10.11.6
  • InfluxDB v1.0.0
  • Grafana Version 3.1.1

InfluxDBを導入する

ここではインストールの具体的な手順は詳細は割愛します。MacならHomeBrewで入りますし、Linuxも公式ウェブサイトからパッケージをダウンロードして展開するだけでインストール自体は完了します。

さて、InfluxDBが使えるようになったところで、データを投入する前に一通り設定をしておきましょう。ウェブのQuery実行画面(http://localhost:8083/)で以下のSQLを実行し、root/rootのユーザと、bitcoinという名前のデータベースを作成しておきます。CLIから実行しても問題ありません。

CREATE USER "root" WITH PASSWORD 'root'
CREATE DATABASE "bitcoin"

pythonからInfluxDBへデータを投入する

さて、データベースの準備が一通り整ったので、InfluxDBへデータを投入していきます。InfluxDBにはPythonのクライアントがあるので、今回はそれを利用します。

また、bitFlyerからのデータ取得は、拙作のpybitflyerを利用しています。本来ならばInfluxdbはRESTful APIによるデータ投入ができるので、bitFlyerのWebAPIから直接流すという選択肢もあるのですが、データの加工やカラム追加が容易という理由で、一度Pythonで処理するという形を取っています。

from influxdb import InfluxDBClient
import pybitflyer

api = pybitflyer.API(api_key="XXX...",
                     api_secret="YYY...")
ticker = api.ticker(product_code="BTC_JPY")

user = 'root'
password = 'root'
dbname = 'bitcoin'
json_body = [
    {
        "measurement": "bf_ticker",
        "fields":ticker
    }
]

client = InfluxDBClient("localhost", "8086", user, password, dbname)
client.write_points(json_body)

bitFlyer Lightning APIから取得したデータをticker変数に入れています。それをデータ投入用のjson_bodyに含め、client.write_points()にてデータベースへ書き込んでいます。measurementMySQLなどで言うところのテーブルに相当するもので、bitcoinというデータベース内に作成されます。他にも書き込む内容としてtagsやtimeなどの情報を加えることができますが、ここでは指定していません。

きちんとデータが格納されているか確認してみましょう。InfluxDBのウェブページでデータベースをbitcoinに設定したうえでselect * from bf_tickerで問い合わせて、何かしらデータが表示されていれば問題ありません。レスポンスが{"results":[{}]}でなかったらとりあえずは大丈夫でしょう。なお、この確認作業は以下のようにHTTP APIからでも実行可能です。

$ curl "http://localhost:8086/query?q=select+*+from+bf_ticker&db=bitcoin" | jq 
{
  "results": [
    {
      "series": [
        {
          "name": "bf_ticker",
          "columns": [
            "time",
            "best_ask",
            "best_ask_size",
            "best_bid",
            "best_bid_size",
            "ltp",
            "pair",
            "product_code",
            "tick_id",
            "timestamp",
            "total_ask_depth",
            "total_bid_depth",
            "volume",
            "volume_by_product"
          ],
[...]

これで上記スクリプトを実行したタイミングでのデータ投入が完了しました。あとは、このコードを定期的に動かすことで、ask/bidの価格を時系列で眺めたり、値を可視化することができます。

定期実行の方法としては、定番のcrontabや、最近出てきたジョブ管理ツールであるJenkinsLuigiAzkabanなどがあります。試しに動かすだけならwhile True:の中で上記スクリプトを動かしつつtime.sleep(30)などで定期実行するのもアリですね。

Grafanaで可視化

それでは最後に、Grafanaを使ってInfluxDBからデータを取り出し可視化します。なお、InfluxDBと同じようにインストールの方法はここでは割愛します。

まずはDataSourcesでInfluxDBの接続設定をします。画面に表示されているTypeからInfluxDBを選択して、Http SettingsのURL、InfluxDB DetailsのDatabaseとUser、Passwordをそれぞれ入力します。これで、ダッシュボードからInfluxDBの対象データベースを選択して情報を取得することができます。

あとはDashboardで新規作成し、可視化したいパネルを作成していきます。今回はbitFlyerのtickerに含まれるbest_ask、best_bid、ltpの3種類の情報をグラフで表示させます。ADD ROWののちに左端に少し出ている緑色のハンバーガーメニューからAdd panel→Graphを選択し、Metricsを以下のように設定します。

  • Metrics:SQL:SELECT best_bid,ltp,best_ask FROM bf_ticker
  • Metrics:Panel Data Source: InfluxDB(上記で接続設定をしたものです)

f:id:yag_ays:20160926151557p:plain

これでbitFlyerのask/bidなどの価格情報を可視化することができました!他にも生のデータを表示するTableを表示させて、一旦は以下のような形になりました。

f:id:yag_ays:20160926151424p:plain

まとめ

簡単にではありますが、InfluxDB/Grafanaを使ったデータ取得/蓄積/可視化を一通りやってみました。InfluxDB/GrafanaはSQLによる集計機能も充実しているので、あとは移動平均線を書いたり、取引量を一緒に可視化してみたり、まだまだ出来ることがいっぱいあります。単体の情報量であったり情報スピードなどは本家のトレード画面に劣るものの、複数のデータソースを一度に可視化できたりとカスタマイズできるのはかなり強力です。自分もこれから色々と試してみようと思います。

参考

補足ですが、InfluxDBは最近メジャーバージョンアップにより1.0.0となったことで、テーブル作成等のRESTful API部分の仕様がガラッと変わっています。qiitaや各種ブログ等の記事は0.9未満のものが多く、そのままでは動かないコード/クエリがありますので、実行する前にはバージョンの確認をしたほうが良いでしょう。