Cryptowatch Chart Matplotlib Slider Test
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