| tags:logging categories:server

ビットコイン価格をGrafanaでグラフ化

チェンライ二日連続晴天。

ビットコイン、どっかーーっと景気良く価格急上昇で年金確保!と行きたいところですが、、 あと10倍ぐらいに、早いことたのんませう。

ビットコインの価格を所得して、Grafanaでグラフ化します。

Grafana

さて、日々トレードなどをしているわけではないので、 とりあえず上記のような裏で流れを確認するくらいの感覚のものを、と考えてます。

価格の推移とか、他の為替との関連性など、をチラッと見れればよいなと、、

まぁ、改めて見ると、値動きがすごいですねぇ。。

事前準備

まずはinfluxDBにて、新しいデーターベスfinanceを作ります。(お好きな名前に変更してください)

pi@tacos:~ $ influx
Connected to http://localhost:8086 version 1.7.7
InfluxDB shell version: 1.7.7
> create database finance
> show databases
name: databases
name
----
_internal
telegraf
finance
> exit

外部との接触のないサーバーですので、セキュリティーは考慮してません。 ザルですので、外部に開いている環境の方はくれぐれも対策を施してください。

API

ビットコインの取引価格の所得をします。 取引所各所からAPIが提供されているようですが、面倒もなく有名どころのBitflyerさんを利用させていただきます。 パイソンのライブラリーも提供されています。

インストールは、pipで一発、

pi@raspberry:~ $ pip install pybitflyer
-bash: pip: command not found

と、色々入れているからすでに入ってるだろうと思いまいしたが、 インストールされていなくて嫌われる。

でも、gemみたいで、あんまり好きでないんですよね。。 さて、パイソンのバージョンを確かめたところ、

pi@raspberry:~ $ python --version
Python 2.7.16
pi@raspberry:~ $ python3 --version
Python 3.7.3

いつの間にか2つのバージョンがインストールされている。 3.5より上のバージョンでは、python3-pipというパッケージがあるようなので、 新しい方をインストールする。

pi@raspberry:~ $ sudo apt install python3-pip
pi@raspberry:~ $ pip3 install pybitflyer
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting pybitflyer
  Downloading https://www.piwheels.org/simple/pybitflyer/pybitflyer-0.1.9-py3-none-any.whl
Requirement already satisfied: requests in /usr/lib/python3/dist-packages (from pybitflyer) (2.21.0)
Installing collected packages: pybitflyer
Successfully installed pybitflyer-0.1.9
pi@raspberry:~ $

これにて、事前の準備完了。次はデーターの取り込み等を行います。

データの取込・登録

pythonでデーターを落とし、そのままinfluxDBへ登録も一発で出来ます。 (influxDB用のパイソン・モジュールがあります。) でもなぜか、以前書いたスクリプトが、 JASON -- jq --> sh でinfluxDBへ登録という形を取っていたので、 そのまま踏襲しました。(なんでこうやった??自問。でも不問。) 適当なシェル・スクリプトですので参考まで、、

まず、JSON形式のデータをbashで扱うためにjqというライブラリーが必要ですので、 インストールします。

pi@raspberry:~ $ sudo apt install jq

値の所得は、パイソン・スクリプトでJSON形式で落とします。 get_btc_jpy.py を作り編集し、実行権を与えておきます。

pi@raspberry:~ $ sudo vi /usr/local/bin/get_btc_jpy.py

import pybitflyer
import json

api = pybitflyer.API()
print(json.dumps(api.ticker(product_code = "BTC_JPY"),sort_keys=True, indent=4))


pi@raspberry:~ $ sudo chmod +x /usr/local/bin/get_btc_jpy.py

単なる書き出しスクリプトなのでファイルbtc_jpy.jsonに落とすには、以下のようにして保管します。

python3 /usr/local/bin/get_btc_jpy.py > /<<書き出し先>>/btc_jpy.json

次にそのファイルをシェルで整形してデーターベースへ登録します。 update_btc_jpy.shというファイルを作ります

ltpは最終取引価格(Last Time Price)。お好みのようにご変更のほど、

InfluxDBへの登録はcurlを使って放り込みます。

curl -XPOST "http://$INFLUXDB_HOST:$INFLUXDB_PORT/write?db=$INFLUXDB_DATABASE" -d "currency,code=BTC_JPY exchage_rate=$ltp,ask=$best_ask,bid=$best_bid,volume=$volume $timestamp"

最初の部分は登録するデーターベース設定、後半は登録する内容になります。

ちょっと分解して、前半は以下のようにホスト・ポート・データーベース名。

http://$INFLUXDB_HOST:$INFLUXDB_PORT/write?db=$INFLUXDB_DATABASE

で後半部 "currency,code=BTC_JPY price=$ltp,ask=$best_ask,bid=$best_bid,volume=$volume $timestamp" を少し細かく見ると、

  • currency:テーブルのヘッダーの様な感じ
  • code=BTC_JPY:タグ
  • price=$ltp:残り部分は数値(小数点の位置などは後々変更可能)
  • $timestamp:最後に時間(ちょっとフォーマットが独特)

になります。

データーベースに関しての理解はあまりないのですが、
finance(DB) > currency (他:銀行口座 [savings]など) > code: BTC_JP (例:JPY_USD、貯金額など)
という感じでよいのかな。。と思ってます。。 減っていくばかりの銀行口座の残高もトラッキングしようかなと思ってます。(地獄の可視化)

#!/bin/bash
#
# update_btc_jpy.sh
#
# OUTPUT
# {
#     "best_ask": 583895.0,
#     "best_ask_size": 0.50000013,
#     "best_bid": 582811.0,
#     "best_bid_size": 0.385,
#     "ltp": 583651.0,
#     "product_code": "BTC_JPY",
#     "tick_id": 21304010,
#     "timestamp": "2019-04-08T00:44:56.163",
#     "total_ask_depth": 1247.87214404,
#     "total_bid_depth": 1694.48375804,
#     "volume": 690365.02082555,
#     "volume_by_product": 5587.33741726
# }
#

python3 /usr/local/bin/get_btc_jpy.py > /home/pi/.finance/btc_jpy.json

INFLUXDB_HOST=127.0.0.1
INFLUXDB_PORT=8086
INFLUXDB_DATABASE=finace

JSON=`cat /home/pi/.finance/btc_jpy.json`

# parse json 
timestamp=$(date +%s%N)
product_code=$(echo ${JSON} | jq ".product_code")
ltp=$(echo ${JSON} | jq ".ltp")
best_ask=$(echo ${JSON} | jq ".best_ask")
best_bid=$(echo ${JSON} | jq ".best_bid")
volume=$(echo ${JSON} | jq ".volume_by_product")

## Write to InfluxDB
curl -XPOST "http://$INFLUXDB_HOST:$INFLUXDB_PORT/write?db=$INFLUXDB_DATABASE" -d "currency,code=BTC_JPY price=$ltp,ask=$best_ask,bid=$best_bid,volume=$volume $timestamp"

そして、このスクリプトをバックグラウンドで自動的に走らせます。毎分更新での設定になってます。

pi@raspberry:~ $ crontab -e

# Edit this file to introduce tasks to be run by cron.
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

* * * * * /home/pi/scripts/update_btc_jpy.sh

5分おきに更新したいのでであれば、

*/5 * * * * /home/pi/scripts/update_btc_jpy.sh

私は売り買いが激しい人でないので、15分おきにしました。 (値動きが激しいので、少しこまめにチェック。)

*/15 * * * * /home/pi/scripts/update_btc_jpy.sh

これで、取り込みと、データーベースへの登録が完了。

※ pyhthonで書き換え中ですが、日付の扱いでちょっと戸惑ってます。。あとはすごくスッキリするんですけどね。のちの追記します。

Grafana

取り込んだデーターをGrafanaを使って表示します。 データーソースの登録とグラフの作成が必要になります。 sqlの知識のある人は複雑なグラフを作り出すことも可能です。 (あたしゃにはちょっと、、ぼらりてぃーとかも必要ないし、、)

さて、

データーソースの登録

デーダーベースを登録します。 パスワードの設定などもしていないので、基本デフォルトの設定で問題ないです。 割とすっきりアクセスできます。

まずは、左の歯車のアイコンより、データーソースへ、

Grafana Datasource Settings

ちょっと、既に幾つかありますが、右上部の追加を押します。そして、influxdbを選択します。

Grafana Datasource Settings

登録名、接続ポート(デフォルト)を設定、データーベース名を記入して、

Grafana Datasource Settings

保存・確認ボタンを押し、エラーがなければ接続完了です。

グラフの作成。

色々できます。ヒゲのついた奴とかも出来るんか?はちょっと分かりませんが、、 とりあえず簡単な状況情報、折れ線グラフの2種類を作成します。

状況情報:シングル・スタッツ

まずは、所有額の表示。どかっと、保持コインの総額を表示します。(とりあえず、パイ・サーバーちゅうことで、3.141592653589793 で計算します。)

一喜一憂しないようにしてくださいね。目標額との差額表など、お好みのように変更してください。

グラフアイコンのパネルアイコンをクリックします。ビジュアルを最初に選択します。

Grafana Single stats

シングルスタットをえらびます。

Grafana Single stats

表示するデーターを設定していきます。

Grafana Single stats

クエリーの欄では、先ほど設定したデーターソースを選択。

Grafana Single stats

表示データーは、データーソースのcurrency: code:BTC_JPYになります。

Grafana Single stats Grafana Single stats

そして、総額表示のため、価格の後に計算を追加します。この場合、3.1415..をかけてます。

Grafana Single stats

総額が表示されます。グラフの設定は左の大きなグラフのアイコンで行います。 単位を円通貨にします。円マーク付きで総額表示されます。微妙。。

Grafana Single stats

パネルのタイトルは左の大きめのアイコンの一番下より変更します。

Grafana Single stats

グラフ

パネル追加より、Add Queryでグラフ表示になります。

Grafana Single stats

グラフを選択してスタートすることもできます。

Grafana Graf Settings Grafana Graf Settings

表示するデーターの設定を行います。基本上記のシングル・スタッツと同じです。 データーソースの内のcurrencycode:BTC_JPYselect: priceを選びます。

Grafana Graf Settings

更新タイミングと、グラフのインターバルの設定があっていないと、 ドット表示になってしまうことがあります。

5分更新であればインターバルを5分に設定します。 クリックして任意の間隔に設定することもできます。

Grafana Graf Settings Grafana Graf Settings

タイトルを設定します。

Grafana Graf Settings

簡単に流れを書きましたが、 色々とできるので自分の環境に合わせて追加変更してください。


Grafana BTC FX

GrafanaとInfluxDBのインストールは以下、ご参考のほど、

と、現在は外国為替情報も追加したりしてます。 表示方法は基本この作業と同じ感じ流れになると思います。 各所戻ってくるデーターの扱いが異なったりしてちょっと厄介。。、 そちらも後々ポストします。

おまけ

簡単なシステムです。現在パイ・3A+で運用してますが、 パイ・ゼロでも、一つ二つだけのアプリケーションならば、スムーズに動きます(ゼロ:パイホールとグラファナで実証済み)ので、 専属サーバーとして動かしても面白いかも。

See Also

comments powered by Disqus