pythonとmpl_financeを使って株価チャートを表示させる方法

環境

  • ubuntu 18.04(WSLによる構築)
  • python3.7(anacondaによる構築)

はじめに

機械学習用の学習データを集める際に利用したものです。

データがcsv形式で存在すれば実行できると思います。

以下のように出力されます。

f:id:a_shiba:20190430145258p:plain
出力例

※学習データ用なので、人間が見やすいものではありません。

コード

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import csv
import mpl_finance
from pathlib import Path

CSV_PATH = "histday"
CHART_IMG_PATH = "chart"

def num2chart(code, number, opens, highs, lows, closes, judge):
# ======================================
# code: 銘柄コード
# number: 何番目のブロックを取得するか
# opens: 始値(一次元配列)
# highs: 高値(一次元配列)
# lows: 安値(一次元配列)
# closes: 終値(一次元配列)
# judge: 上がったか下がったか
# ======================================
    fig = plt.figure(figsize=(0.5, 0.5), facecolor="k", edgecolor="k")
    ax = fig.add_subplot(1, 1, 1)
    fig.patch.set_facecolor('black') 
    fig.patch.set_alpha(0)
    ax.patch.set_facecolor('black')
    ax.patch.set_alpha(1)
    mpl_finance.candlestick2_ohlc(ax, opens=opens, highs=highs, lows=lows, closes=closes,  width=1, alpha=1, colorup='r', colordown='b')
    plt.tick_params(labelbottom=False,
                    labelleft=False,
                    labelright=False,
                    labeltop=False)
    plt.tick_params(bottom=False,
                    left=False,
                    right=False,
                    top=False)
    ax = plt.gca() 
    ax.spines["right"].set_color("none")
    ax.spines["left"].set_color("none")  
    ax.spines["top"].set_color("none")   
    ax.spines["bottom"].set_color("none") 
    plt.style.context('classic')
    plt.rcParams['axes.xmargin'] = 0
    plt.rcParams['axes.ymargin'] = 0
    plt.savefig("{}/{}/{}_{}.png".format(CHART_IMG_PATH, judge, code, number))
    plt.cla()
    plt.clf()
    plt.close()


def main(block, slide_span, predict_day):

    p = Path(CSV_PATH)
    csv_list = [file for file in list(p.glob("*"))]

    start = 0
    for csv in csv_list:
        print(csv)
        df = pd.read_csv(csv)
        for i in range(start, len(df)-block-predict_day, slide_span):
            code = df['code'][0]
            opens = df['start']
            highs = df['high']
            lows = df['low']
            closes = df['end']

            # ブロックの最後の要素と最後の要素からpredicr_day日後の終値を比較
            # 1.0より上なら上昇、以下なら下降したという仕分け
            if closes[i+block-1+predict_day] / closes[i+block-1] > 1.0:
                judge = "up" 
            else:
                judge = "down"
            num2chart(code, i, opens[i:i+block], highs[i:i+block], lows[i:i+block], closes[i:i+block], judge)

        start = 0

if __name__ == "__main__":
    # 生成するチャートの期間
    block = 20
    # 何日ずらすか
    slide_span = 20
    # 何日後のデータを参照するか
    predict_day = 3
    main(block, slide_span, predict_day)

感想

機械学習で使う場合、軸や目盛線は消したほうが良いのか悪いのか分かりません。

そのあたりいつか検証してみたいところです。

また、最近ではbokehというライブラリも流行っているそうです。

こちらはグラフをweb上で動かしたりするのが簡単にできるそうです。

matplotlibのGitHub。スター数: 9115 github.com

bokehのGitHub。スター数: 9321 github.com