grr

Cryptowatch Chart Matplotlib Slider Test

f:id:testbot:20210314152303p:plain

Cryptowatch APIから取得したBTCJPYチャートに、スライダーで調整可能な指標をMatplotlibで表示する。

import numpy as np
import pandas as pd
import json
import requests
from datetime import datetime
from pprint import pprint
import time

import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
from matplotlib.widgets import Slider

#------------------------------------------
def sma(df, n):
    df = df.rolling(window=int(n)).mean()
    return df

def ewm(df, n):
    df = df.ewm(span=int(n)).mean()
    return df

#設定   ------------------------
GET_PERIODS = 60 * 5 # 時間足(秒)
GET_AFTER = 50 # 足本数


#Cryptowatch API History Data   ------------------------
now = datetime.now()
now = int(now.timestamp()) #現在時刻のUnixtime(秒単位)
market = "bitflyer/btcjpy"
get_periods = GET_PERIODS
get_after = now - get_periods * GET_AFTER
#HTTPライブラリ Requestsによる価格履歴取得
r = requests.get("https://api.cryptowat.ch/markets/" + market + "/ohlc?periods="+ str(get_periods) +"&after="+ str(get_after)).json()
print("[ now :", now,"]", "[ periods :", get_periods, "]", "[ after :", get_after,"]")
# Pandas OHLCデータ   ------------------------
ohlcv = r["result"][str(get_periods)]
df = pd.DataFrame(ohlcv, columns = ["datetime","open","high","low","close","volume",''])
df = df.set_index("datetime")



# Indicator   ------------------------
slider1_min, slider1_max, slider1_init, slider1_step = 1, 100, 15, 1
slider2_min, slider2_max, slider2_init, slider2_step = 1, 100, 5, 1
df_1 = sma(df["close"], slider1_init)
df_2 = ewm(df["close"], slider1_init)

print(df.head(5))
print(df.iloc[len(df_1) - 1])

# matplotlib -------------------
plt.style.use("ggplot") # matplotlib ggplot style読込

fig = plt.figure(figsize=(12,8)) # figsize=ウィンドウサイズ
fig.patch.set_facecolor("#fafafa") # 全体背景色

gs = GridSpec(4, 1, height_ratios=[3, 0.8, 1.2, 1]) #縦4個、横1個のグリッドとその表示比率
gs.update(left=0.07,bottom=0.05, right=0.95, top=0.95, hspace=0) #全体の余白

ax0 = plt.subplot(gs[0])
ax0.plot(df["close"], marker="o", markersize=1.5, linewidth=2, color="orange")
ax0.plot(df["high"], linewidth=0.7, color="orange")
ax0.plot(df["low"], linewidth=0.7, color="orange")

l1, = ax0.plot(df_1, linewidth=2, color="red")
l2, = ax0.plot(df_2, linewidth=2, color="green")

ax0.tick_params(axis="x", bottom=False, labelbottom=False) #x軸目盛とラベルの非表示
#ax0.axhline(0, color="orange")

ax1 = plt.subplot(gs[1], sharex=ax0)
ax1.spines["top"].set_color("slategray") #ax0とax1の境界線
ax1.bar(df.index,df["volume"], color="orange", width=get_periods*0.94)

ax2 = plt.subplot(gs[2])
ax2.axis("off") #ax2のxy軸の非表示

ax3 = plt.subplot(gs[3], sharex=ax0)
ax3.grid(False)

#Slider
slider_ax1 = fig.add_axes([0.6,0.26,0.3,0.032])
slider1 = Slider(slider_ax1, 'value1', slider1_min, slider1_max, valinit=slider1_init, valstep=slider1_step)

slider_ax2 = fig.add_axes([0.6,0.22,0.3,0.032])
slider2 = Slider(slider_ax2, 'value2', slider2_min, slider2_max, valinit=slider2_init, valstep=slider2_step)

def update1(value):
    df_1 = sma(df["close"], value)
    l1.set_ydata(df_1)
    fig.canvas.draw_idle()

def update2(value):
    df_2 = ewm(df["close"], value)
    l2.set_ydata(df_2)
    fig.canvas.draw_idle()

slider1.on_changed(update1)
slider2.on_changed(update2)

plt.show()

コードライセンスは CC0 もしくは Unlicense
Creative Commons — CC0 1.0 Universal
Unlicense.org » Unlicense Yourself: Set Your Code Free