bitFlyerのEcho APIを使ってBitcoinのリアルタイムレートを可視化(2)


はじめに

bitFlyerのEcho APIを使ってBitcoinのリアルタイムレートを可視化(1)の続きです。

前回からの変更点

  • レートの最大値、最小値を表示
  • 見た目を少しオシャレにしてみる
  • 0.5秒毎にデータを取得
  • 1分間のレートを表示

プログラム

main.py
import requests
import json
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from matplotlib.font_manager import FontProperties
import matplotlib as mpl
from datetime import datetime

# エンドポイント
end_point = 'https://bitflyer.jp/api/echo/price'

# 表示するテキストフォーマット
rate_text = '仲値\nMax : {}\nMin : {}\n\n買取価格\nMax : {}\nMin : {}\n\n販売価格\nMax : {}\nMin : {}'

# APIからデータ取得
response = requests.get(end_point)
rate = json.loads(response.text)

# 日本語を表示するためにフォントを設定
fp = FontProperties(fname='ipaexg.ttf', size=15)

# 各データを初期化
time_axis = [datetime.now() for _ in range(60)]
mid = [rate['mid'] for _ in range(60)]
bid = [rate['bid'] for _ in range(60)]
ask = [rate['ask'] for _ in range(60)]
max_mid = max(mid)
min_mid = min(mid)
max_bid = max(bid)
min_bid = min(bid)
max_ask = max(ask)
min_ask = min(ask)

# ウィンドウを描画
mpl.rcParams['toolbar'] = 'None'
fig = plt.figure(figsize=(18,10), facecolor='#1B2027')
axes = plt.axes(axisbg='black', alpha=0.2)
axes_pos = axes.get_position()
plt.grid(color='#232323')
plt.tick_params(axis='x', colors='#ADADAD')
plt.tick_params(axis='y', colors='#ADADAD')

# コールバック関数
def plot(loop_count):
    global max_mid
    global min_mid
    global max_bid
    global min_bid
    global max_ask
    global min_ask

    # グラフをリフレッシュ
    plt.cla()
    fig.clf()
    axes = plt.axes(axisbg='black', alpha=0.2)
    axes_pos = axes.get_position()
    plt.grid(color='#232323')
    plt.tick_params(axis='x', colors='#ADADAD')
    plt.tick_params(axis='y', colors='#ADADAD')
    plt.grid(color='#232323')

    # APIからデータ取得
    response = requests.get(end_point)
    rate = json.loads(response.text)

    # 配列の先頭を削除
    time_axis.pop(0)
    mid.pop(0)
    bid.pop(0)
    ask.pop(0)

    # 配列の最後にデータを追加
    time_axis.append(datetime.now())
    mid.append(rate['mid'])
    bid.append(rate['bid'])
    ask.append(rate['ask'])

    # 最大値、最小値の更新
    max_mid = max(mid) if max_mid < max(mid) else max_mid
    min_mid = min(mid) if min_mid > min(mid) else min_mid
    max_bid = max(bid) if max_bid < max(bid) else max_bid
    min_bid = min(bid) if min_bid > min(bid) else min_bid
    max_ask = max(ask) if max_ask < max(ask) else max_ask
    min_ask = min(ask) if min_ask > min(ask) else min_ask

    # プロット
    plt.plot(time_axis, mid, label='仲値')
    plt.plot(time_axis, bid, label='買取価格')
    plt.plot(time_axis, ask, label='販売価格')
    fig.text(axes_pos.x1 + 0.05, axes_pos.y1 - 0.5, rate_text.format(max_mid, min_mid, max_bid, min_bid, max_ask, min_ask), fontproperties=fp, color='w', fontsize=15)

    # ラベル配置
    leg = plt.legend(loc='upper left', bbox_to_anchor=(1.05, 1), borderaxespad=0, prop=fp, facecolor='#1B2027', edgecolor='#ED6751')
    [leg_text.set_color('white') for leg_text in leg.get_texts()]
    plt.subplots_adjust(right=0.8)

# 500ms(0.5s)でアニメーションを更新
ani = FuncAnimation(fig, plot, interval=500)

# 描画
plt.show()

実行結果

前回よりだいぶいい感じになりました。