【Python】matplotlibでローソク足を描画してみる
今回は、Python の matplotlib ライブラリを使ってローソク足のグラフを表示したいと思います。
私にとって matplotlib は奥が深すぎるので、単純にローソク足を表示するだけにします。
※python2で書いてます。
ライブラリのインストール
先に必要なライブラリをインストールしておきます。すでにインストール済の場合は必要ないです。
また、matplotlib.finance を使用する予定だったが ver 2.0 から非推奨となって使えなくなっていた。mpl_finance モジュールを使用してくれとのことだったので mpl_finance もインストールします。
matplotlib ライブラリのインストール
~$ sudo pip install matplotlib
mpl_finance モジュールのインストール
~$ sudo pip install mpl_finance
※仮想環境をホームディレクトリ下に配置している場合には'sudo'は不要。
ローソク足でグラフを描画
以下の過去記事同様、元データは 汲めども尽きない 無尽蔵さん の過去データ、2015年度の日経225年間データを使用してます。
#! /usr/bin/env python # coding: utf-8 import codecs import matplotlib.pyplot as plt import mpl_finance as mpf def line_graph(openList, highList, lowList, closeList): '''折れ線グラフの描画処理''' fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.plot(openList, label='open') ax.plot(highList, label='high') ax.plot(lowList, label='low') ax.plot(closeList, label='close') ax.legend() plt.show() def candle_graph(openList, highList, lowList, closeList): '''ローソク足グラフの描画処理''' fig = plt.figure() ax = fig.add_subplot(1, 1, 1) mpf.candlestick2_ohlc(ax, openList, highList, lowList, closeList, width=1) ax.legend() plt.show() def main(): with codecs.open('./nikkei_225.csv', 'r', encoding='utf-8') as f: [next(f).encode('utf-8') for _ in range(2)] text = f.read().encode('utf-8') a = text.replace('\n', ',').split(',') openList = list(map(float, a[1::6])) highList = list(map(float, a[2::6])) lowList = list(map(float, a[3::6])) closeList = list(map(float, a[4::6])) # 折れ線グラフ line_graph(openList, highList, lowList, closeList) # ローソク足グラフ candle_graph(openList, highList, lowList, closeList) if __name__ == '__main__': main()
違いが分かりやすいように、折れ線グラフで表示した後 ローソク足のグラフを表示するようにしました。
以下、実行結果。
折れ線グラフ
ローソク足で表示することができました。折れ線グラフと比較してもちゃんと描画できていますね。それにしてもローソク足すばらしい(分かりやすい)。
ざっくり解説。
import matplotlib.pyplot as plt
import mpl_finance as mpf
matplotlib と mpl_finance のインポート
matplotlib.pyplot は慣例どおり plt としています。
mpl_finance はもともと matplotlib.finance にあったので mpf としています。
def line_graph(openList, highList, lowList, closeList):
'''折れ線グラフの描画処理'''
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(openList, label='open')
ax.plot(highList, label='high')
ax.plot(lowList, label='low')
ax.plot(closeList, label='close')
ax.legend()
plt.show()
折れ線グラフで表示するために作った関数。始値 高値 安値 終値 のリストを受け取る。
def candle_graph(openList, highList, lowList, closeList):
'''ローソク足グラフの描画処理'''
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
mpf.candlestick2_ohlc(ax, openList, highList, lowList, closeList, width=1)
ax.legend()
plt.show()
これがローソク足のグラフを描画するために用意した関数。一行ずつ何をしてるか書いていこうと思う。
def candle_graph(openList, highList, lowList, closeList):
ローソク足で表示するために作った関数。始値 高値 安値 終値 のリストを受け取る。
fig = plt.figure()
変数 fig に Figure インスタンスを代入。いくつかのグラフを描くための用紙を用意したイメージ。
ax = fig.add_subplot(1, 1, 1)
変数 ax に Axes インスタンスを代入。先程の用紙(変数fig)にグラフを描く場所を確保してる感じ。
引数は(行, 列, 場所)を意味している。以下のサイトが分かりやすい。
add_subplot メソッドの引数の数字は何を表しているのか?
mpf.candlestick2_ohlc(ax, openList, highList, lowList, closeList, width=1)
candlestick2_ohlc() がローソク足を描画するためのメソッド。ohlc は引数の順番を意味していて、Open, High, Low, Close の順。
第一引数にはグラフを描く場所(Axesインスタンス)を指定する(今回は変数ax)。その後に ohlc を指定。width=1 を指定しているが、これはローソクの幅を指定している。
その他にも色々あるので 公式ドキュメント を読もう。matplotlib.finance になってるけど matplotlib.finance を mpl_finance で読み替えればいいだけ。
ax.legend()
グラフ(Axesインスタンス)に凡例を表示するようにしている。ちなみにローソク足にラベルはないので結局何も表示されない。
plt.show()
今まで描いた用紙をウィンドウを立ち上げて表示。
def main():
with codecs.open('./nikkei_225.csv', 'r', encoding='utf-8') as f:
[next(f).encode('utf-8') for _ in range(2)]
text = f.read().encode('utf-8')
a = text.replace('\n', ',').split(',')
openList = list(map(float, a[1::6]))
highList = list(map(float, a[2::6]))
lowList = list(map(float, a[3::6]))
closeList = list(map(float, a[4::6]))
# 折れ線グラフ
line_graph(openList, highList, lowList, closeList)
# ローソク足グラフ
candle_graph(openList, highList, lowList, closeList)
解説する必要はないが、一応書いておく。
元データを読み込んで 始値・高値・安値・終値 を各々 list型 で代入している。
その後 line_graph() 関数、candle_graph() 関数を呼び出しているだけ。
おわりに
株価の動きを視覚で確認したいときに使えそうですね。他にも証券会社のソフトで対応していない指標をプロットしたり、自分好みにカスタマイズできる。じっくり株価を分析したい場合捗りそうです。
ちなみにX軸を日付にしたり、メモリの間隔、軸のラベル、グラフのタイトルとかイジりたいところはたくさんあります。このくらいなら先が見えますが、matplotlib は好みのグラフを作ろうとすると結構調べたりしなくちゃいけなくなるので時間が掛かります。なので論文の資料作りでなければ、基本的にスルーしたほうが時間の節約になる(私だけかも)。
何かの参考になれば幸いです。