参考
ちなみにmpl_financeは新しくなって今ではmplfinanceになっています。
mpl_financeはもうすでに廃止されており、mplfinanceの使用が推奨されています。
こんにちは。TATです。
今日のテーマは「Pythonのmpl_financeで株価のローソク足チャートを描く方法」です。
Pythonで株価のローソク足チャートを描くためのライブラリはいくつかありますが、mpl_financeに焦点を絞ります。
すでにmpl_financeを使用している方には、こちらの記事が参考になれば嬉しいです。
これからはじめて使うという方は、mplfinanceを使った方がいいと思います。
目次
(おさらい)株価のローソク足データを取得する
まずはおさらいとして、計算に必要な株価のローソク足データを取得します。
こちらについては過去に記事でも解説しているので詳細は割愛します。
次のコードでは、pandas_datareaderを使ってトヨタ(7203)のローソク足データを取得します。
from pandas_datareader import data import pandas as pd import numpy as np # 株価データを取得 df = data.DataReader('7203.JP', 'stooq') # 日付の古い順に並び替え df.sort_index(inplace=True)
このコードで取得した株価データはこんな感じです。
このままだとデータ数が多いので、直近5日のデータに絞ります。
このデータを使っていくつかのテクニカル分析を計算していきます。
コードの内容を詳しく知りたい方は、こちらの記事で解説しているので参考にしてください。
【日本株対応】Pythonで株価のローソク足データを取得する方法まとめ【CSV、ライブラリ、スクレイピング】
続きを見る
株価データをチャートでプロットする
まずは株価データを単純にプロットしてみます。
これにはDataFrameのplot関数で対応可能です。
こんな感じで一瞬です。
Volume列を避けるために、iloc関数で最初の4列だけを指定しています。
これでも大体の株価の動きを捉えることはできますが、やはりローソク足の方が細かい分析ができます。
ということで、次からmpl_financeライブラリーを使ってローソク足を描いていきます!
mpl_financeでローソク足チャートを描く
ローソク足を描くために、今回はmpl_financeというライブラリーを使います。
これはmatplotlibというチャート描画用ライブラリーの拡張ライブラリーみたいなもので、matplotlibの使い勝手を継承しながらfinance系のチャートをいい感じに描くことができるライブラリーです。
mplはmatplotlibの略だと思われます(たぶん・・・)
candlestick_ohlc関数でローソク足チャートが描ける
mpl_financeにはcandlestick_ohlcという名前の通りの関数があります。
ohlcはOpen, High, Low, Closeの略で、データを指定する際にはこの順番で引き渡す必要があります。
さらにindexも必要になるので、引き渡すデータは5列(index, Open, High, Low, Close)になります。
さらにローソク足の幅や上昇時の色や下落時の色を指定することもできます。
わりとカスタマイズ性高いです。
(下準備)index列を追加する
candlestick_ohlc関数を使うために、まずはindex列を追加します。
すでにこのDataFrameのindexがdatetimeになっているのでreset_indexを使えばいいのではないかと思われる方もいるかもしれません。
しかし、後述しますがcandlestick_ohlc関数で日付データを扱うには少し工夫が必要なために、ここでは一番簡単な0から数字を順番に並べたものをindex列に指定します。
ここではinsert関数を使って最初の行にindex列を挿入します。
これで下準備は完了です。
ローソク足チャートを描く
準備ができたところで、早速ローソク足チャートを描いてみます。
まずは必要なコードを全て公開してしまいます。こちらです。
import mpl_finance import matplotlib.pyplot as plt %matplotlib inline # チャート定義 fig, ax = plt.subplots(figsize=(20, 10)) # ローソク足チャートをプロット mpl_finance.candlestick_ohlc(ax, df.values, width=0.5, colorup='r', colordown='b') # グリッド表示 plt.grid() # ローソク足チャートを表示 plt.show()
こちらのコードで描いたチャートがこちらです。
きれいにローソク足チャートが描けていることが確認できます。
x軸は先ほど定義したindex列に対応していることがわかります。
次のステップとしては、ここをきちんと日付データで表示したいですね。
簡単にコードを解説します
ここで紹介したコードを簡単に解説しておきます。
ここではmatplotlibとmpl_finance2つのライブラリーを使っています。
%matplotlib inlineというのはjupyter notebook上にチャートを表示するためのコマンドです。
基本的にはコメントに書いている通りのことを実行しています。
ここでは1つだけ、df.valuesについて触れておこうかと思います。
valuesを使うとDataFrameをnumpyのarray型に変換することができます。
これはcandlestick_ohlcの仕様で、この形式で引き渡さないとローソク足チャートを描くことができません。
df.valuesがどんなことをしているのかはこちらの例をみていただくとイメージがわくと思います。
配列の中に複数の配列が含まれ、それぞれがDataFrameの1行を示します。
このarray型に変換してcandlestick_ohlc関数に引き渡すと、ローソク足が描けるようになります。
ちなみにその他の引数であるwidthはローソク足の幅、colorupは上昇時の色でここでは赤、colordownは下落時の色でここでは緑を指定しています。
メモ
- width: ローソク足の幅
- colorup: 上昇時の色
- colordown: 下落時の色
ここら辺もわりと自由にカスタマイズすることができます。
そしてcandlestick_ohlcでは引き渡されたデータを1列目から順番に、index, open, high, low, closeとして読み取るので、ここの順番さえ合っていれば、それ以降にVolumeとかの関係ない列があっても問題ありません。
チャートのx軸を日付データにする
さて、次に少しレベルアップしてx軸に日付データを表示してみましょう。
ここが少しめんどくさいところです。
datetimeはそのまま表示するとエラーになる
先ほどは0から数字を並べた値をindexとしましたが、次にもともとあるindexを使ってみます。
このデータはすでにdatetime型になっているので、このまま使えばいけそうな気もしますが、事故りますw
一応お見せします。
まずはindex列をdatetime型で定義します。
candlestick_ohlcで見られるのは配列の順番だけなので、列名はDateでもなんでもOKです。
こちらのデータをcandlestick_ohlcに引き渡してみます。
上記の通り、「データのタイプがサポートされてない」というエラーメッセージが表示されます。
ここを頑張って突破します。
date2numによる変換が必要
この問題を突破するにはmatplotlibにあるdate2num関数を使います。
candlestick_ohlcで日付データを扱うにはちょっと工夫が必要になります。
date2num関数は、西暦0001年1月1日午前0時0分0秒を0として、ここから経過日数を数値データとして表現します。
これで変換した数値を与えてあげるときちんとDateを表示できるようになります。
こんな感じで数値データに変換します。
ローソク足チャートを描く
このデータを使ってローソク足チャートを描いてみます。
さっきとコードは全く同じです。
出来上がったチャートがこちらです。
うまくいけてると思いきや、ここではx軸がさっき変換した数値データのまま表示されています。
これはいただけません。
ってことでフォーマットを調整するためにコードに追加します。
import mpl_finance import matplotlib.pyplot as plt import matplotlib #追加 %matplotlib inline # チャート定義 fig, ax = plt.subplots(figsize=(20, 10)) # ローソク足チャートをプロット mpl_finance.candlestick_ohlc(ax, df.values, width=0.5, colorup='r', colordown='b') # グリッド表示 plt.grid() # x軸のフォーマットを修正 ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%Y-%m-%d')) # ローソク足チャートを表示 plt.show()
matplotlib.dates.DateFormatterを使って日付フォーマットを調整しています。
これで表示されたチャートがこちらです。
いい感じですね。
週末に隙間があるw
ただここで問題が発生します。
チャートを見てみると、妙にローソク足間の隙間が大きい箇所がありますよね。
これ、土日祝日ですw
時系列データでチャートを表示すると、データが抜けている土日祝日も表示されてしまうため、このように空白になってしまうんですね。
ここはなんとかしたいところです。
ということで次にここをきれいにできるように工夫してみます。
ここがクリアできたらローソク足チャートは完成します!
ローソク足チャートで営業日だけを表示する
最後に営業日だけを表示できるように少しコードをいじくります。
営業日だけを表示するには少し工夫が必要で、ここでは当初の0から順番に続く数字をindexとして、表示する値を日付データに置き換えるという方法で行きます。
こうすると、土日祝日に隙間が開くことなく表示できます。
必要な列を追加
まずは下準備です。
今回の作戦を実行するには、0から続く数字をindex列に追加します。
最初のやり方と同じです。
このやり方だとdate2num関数も不要になるのでやりやすいかと思います。
これで下準備は完了です。
まずはコードを公開
次に営業日のみを表示するローソク足チャートを描くコードをまとめて公開します。
コメントをなるべく多くつけるように心がけました。
import mpl_finance import matplotlib.pyplot as plt %matplotlib inline # チャート定義 fig, ax = plt.subplots(figsize=(20, 10)) # ローソク足チャートをプロット mpl_finance.candlestick_ohlc(ax, df.values, width=0.5, colorup='r', colordown='b') # X軸を日付データで表示させる plt.xticks([x for x in range(len(df))], [x.strftime('%Y-%m-%d') for x in df.index]) fig.autofmt_xdate() # グリッド表示 plt.grid() # ローソク足チャートを表示 plt.show()
ローソク足チャートを確認
このコードで描けたローソク足チャートがこちらです。
素晴らしいですね!
土日祝日の不自然な隙間が開くこともなく、きれいにチャートを描くことができました。
コード解説
ここで増えたのは2行だけ(13行目と14行目)です。
13行目のxticksでは、引数として2つのリストを渡しています。
1つ目のリストにある各要素が2つ目のリストの値に対応して、ローソク足チャートに表示されるようになります。
リスト内表記を使うとコードがスッキリしますね。
そしてこのままだとx軸に日付データが横並びで書かれてしまうのでカオスになります。
そこで14行目のautofmt_xdate関数の登場です。
名前の通り、いい感じに表示データを調整してくれます。
一応これがない場合のチャートも載せておきます。
ご覧の通り、x軸の表示データが重なりまくってカオス化します。
autofmt_xdateはここをいい感じに調整してくれるわけです。
以上で、ローソク足チャートをPythonできれいに描くことができました。
ローソク足チャートにテクニカル指標を加える
ここからは応用編です。ゆえにサクサク進みます。
ローソク足チャートをきれいに描くことができたので、ここにテクニカル指標を合わせて表示してみましょう。
各テクニカル指標を計算するためのコードはこちらの記事で解説しています。
【コード解説】Pythonで株価データから主要なテクニカル分析を計算して可視化する【移動平均線、MACD、RSI】
移動平均線を加える
まずは移動平均線です。
例として5日・25日移動平均線を描いてみます。
コード公開
とりあえず最初にコード公開します。
import mpl_finance import matplotlib.pyplot as plt %matplotlib inline # チャート定義 fig, ax = plt.subplots(figsize=(20, 10)) # ローソク足チャートをプロット mpl_finance.candlestick_ohlc(ax, df.values, width=0.5, colorup='r', colordown='b') # 移動平均線をプロット ax.plot(df["index"], df["SMA5"], label="SMA5") ax.plot(df["index"], df["SMA25"], label="SMA25") # X軸を調整 plt.xticks([x for x in range(len(df))], [x.strftime('%Y-%m-%d') for x in df.index]) fig.autofmt_xdate() # 凡例表示 plt.legend() # グリッド表示 plt.grid() # ローソク足チャートを表示 plt.show()
ここではax.plot関数を使ってSMA5とSMA25を表示しています。
この際、labelを指定しておくことで、plt.legendで判例を表示することができます。
ローソク足チャートを確認
先ほどのコードで描かれたローソク足チャートがこちらです。
きちんと移動平均線が描かれていることが確認できます。
出来高を加える
さらにこれだけだと寂しいので出来高を加えてみます。
ここまでくると、Yahooファイナンスで見られるチャートと同じくらいのものになりますね。
コード公開
まずはコードをどうぞ。
import mpl_finance import matplotlib.pyplot as plt %matplotlib inline # チャート定義 fig, ax = plt.subplots(2, figsize=(20, 10), sharex=True, gridspec_kw={'height_ratios': [3, 1]}) # ローソク足チャートをプロット mpl_finance.candlestick_ohlc(ax[0], df.values, width=0.5, colorup='r', colordown='b') # 移動平均線をプロット ax[0].plot(df["index"], df["SMA5"], label="SMA5") ax[0].plot(df["index"], df["SMA25"], label="SMA25") # 出来高をプロット ax[1].bar(df["index"], df["Volume"], label="Volume") # X軸を調整 plt.xticks([x for x in range(len(df))], [x.strftime('%Y-%m-%d') for x in df.index]) fig.autofmt_xdate() # 凡例表示, グリッド表示 for a in ax: a.legend() a.grid() # ローソク足チャートを表示 plt.show()
この場合はチャートが2つ必要になってくるので、subplots関数の引数に2を渡しています。
1以上の場合は、figとaxはリストになるのでindexを指定してチャートをプロットすることになります。
さらにheight_ratiosでチャートをサイズの比を指定しています。
何も指定しなければ同じサイズになります。
Volumeはbar関数で表示するといい感じになります。
ローソク足チャートを確認
このコードで描かれたローソク足チャートがこちらです。
先ほどの移動平均線も一緒に表示しています。
移動平均線も出来高も表示できてかなりいい感じですね。
複数のテクニカル分析を組み合わせる
最後の仕上げとして、複数のテクニカル分析を合わせたローソク足チャートを紹介しておきます。
こちらの記事で紹介している移動平均線、MACD、RSI、さらに出来高もまとめて一気に表示してみましょう。
計算方法についてはこちらの記事で解説しています。
【コード解説】Pythonで株価データから主要なテクニカル分析を計算して可視化する【移動平均線、MACD、RSI】
コード公開
まずはコードを見てみましょう。
ちょっと長くなります。
import mpl_finance import matplotlib.pyplot as plt %matplotlib inline # チャート定義 fig, ax = plt.subplots(4, figsize=(20, 10), sharex=True, gridspec_kw={'height_ratios': [3, 1, 1, 1]}) # ローソク足チャートをプロット mpl_finance.candlestick_ohlc(ax[0], df.values, width=0.5, colorup='r', colordown='b') # 移動平均線をプロット ax[0].plot(df["index"], df["SMA5"], label="SMA5") ax[0].plot(df["index"], df["SMA25"], label="SMA25") # 出来高をプロット ax[1].bar(df["index"], df["Volume"], label="Volume") # MACDをプロット ax[2].plot(df["index"], df["MACD"], label="MACD") ax[2].plot(df["index"], df["Signal"], label="Signal") # RSIをプロット ax[3].plot(df["index"], df["RSI"], label="RSI") # X軸を調整 plt.xticks([x for x in range(len(df))], [x.strftime('%Y-%m-%d') for x in df.index]) fig.autofmt_xdate() # 凡例表示, グリッド表示 for a in ax: a.legend() a.grid() # ローソク足チャートを表示 plt.show()
ローソク足チャートを確認
それではこのコードで描いたローソク足チャートを確認しましょう。
素晴らしくいい感じですね。
ここまでのチャートが描けると、本格的に分析に活用できそうな感じがします。
データの分析・可視化にはPythonが最適!
本記事で紹介したコードは、全てPythonを使って書いています。
Pythonはデータの分析や可視化を得意とするプログラミング言語で、さらにAI関連のライブラリーも豊富で昨今のAIブームで需要が急拡大しています。
→ 【いますぐ始められます】データ分析をするならPythonが最適です。
また、Pythonは比較的学びやすい言語でもあります。
実際、僕は社会人になってからPythonを独学で習得して転職にも成功し、Python独学をきっかけに人生が大きく変わりました。
→ 【実体験】ゼロからのPython独学を決意してから転職を掴み取るまでのお話。
Pythonの学習方法についてはいろいろな方法があります。
僕はUdemyを選びましたが、書籍やプログラミングスクールも選択肢になります。
→ 【決定版】Python独学ロードマップ【完全初心者からでもOKです】
→ 【まとめ】Pythonが学べるおすすめプログラミングスクール
→ プログラミングの独学にUdemyをおすすめする理由!【僕はUdemyでPythonを独学しました!】
まとめ
いかがでしたでしょうか。
今回は「Pythonのmpl_financeで株価のローソク足チャートを描く方法」というテーマで解説してきました。
mpl_financeライブラリーを使えば、きれいなローソク足チャートを描くことができます。
コード自体は少し長いですが、一回書いてしまえば使い回すことができるのがプログラミングの素晴らしい点です。
本記事で紹介したコードを使いまわしていただければ、必要なデータさえ揃えたら簡単にローソク足チャートできれいに可視化することが可能です。
是非ともご活用ください。
また、可視化を行う際には、ローソク足チャートのみではなく出来高やテクニカル指標も加えると分析が捗ります。
気ままなブログでは、ローソク足データの取得方法やテクニカル指標の計算方法など、Pythonで株価データを扱う記事を色々紹介しています。
そして色々描いてるうちにどこに何があるのかわからなくなってきたので、こちらの記事でまとめました。
Pythonで株価データを扱う方法まとめ【データの取得・分析・可視化等、なんでもできます】
続きを見る
あるいは最新記事も合わせて探す場合には「Pythonで株式投資」というタグをチェックしてみてください。
ここまで読んでくださり、ありがとうございました。
参考
ちなみにmpl_financeは新しくなって、今ではmplfinanceになっています。
mpl_financeはもうすでに廃止されており、mplfinanceの使用が推奨されています。