こんにちは。TATです。
今回はPythonのコード解説記事です。
テーマは「Pythonで株価データのローソク足チャートを描く」です。
特にここではファイナンス用のライブラリーであるmpl_financeに焦点を絞ります。
ちなみにmpl_financeは新しくなって今ではmplfinanceになっています。
さらにこの他にもPlotlyなどといったライブラリーがあるのですが、それは別記事でご紹介できればと思います。
ここではmpl_financeに焦点を絞って解説していきます。
また、Pythonで株価データを扱う記事については記事が散在しているのでこちらにまとめました!
株価データの取得方法やテクニカル分析の計算方法やその他の可視化方法についてはこちらからどうぞ。
-
【まとめ】Pythonで株価データを扱う
続きを見る
本記事では、mpl_financeを使いますが、mplfinanceやPlotlyの解説記事もあります。
-
【コード解説】Pythonで株価チャートを描く【mplfinance編】
続きを見る
-
【コード解説】Pythonで株価チャートを描く【plotly編】
続きを見る
目次
【コード解説】Pythonで株価チャートを描く【mpl_finance編】
(おさらい)株価データを取得する
まずはおさらいとして、計算に必要な株価データを取得します。
ここは過去に記事でも解説しているので詳細は割愛します。
今回はpandas_datareaderを使ってトヨタ(7203)の株価データを取得します。
1 2 3 4 5 6 7 8 9 | from pandas_datareader import data import pandas as pd import numpy as np # 株価データを取得 df = data.DataReader('7203.JP', 'stooq') # 日付の古い順に並び替え df.sort_index(inplace=True) |
このコードで取得した株価データはこんな感じです。
このままだとデータ数が多いので、直近50日のデータに絞ります。
このデータを使っていくつかのテクニカル分析を計算していきます。
コードの内容を詳しく知りたい方は、こちらの記事で解説しているので参考にしてください。
-
【コード解説】Pythonで株価データを取得する!【3つの方法を解説】
-
【Pythonコード解説】yahoo_finance_api2で日本株の株価データを取得する
株価データをチャートでプロットする
まずは株価データを単純にプロットしてみます。
これにはDataFrameのplot関数で対応可能です。
こんな感じで一瞬です。
Volume列を避けるために、iloc関数で最初の4列だけを指定しています。
これでも大体の株価の動きを捉えることはできますが、やはりローソク足の方が細かい分析ができます。
ということで、次から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列を挿入します。
これで下準備は完了です。
グラフを描く
早速ローソク足を描いてみます。
まずはコードを公開します。こちらです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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は下落時の色でここでは緑を指定しています。
ここら辺も自由にカスタマイズすることができます。
そして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軸がさっき変換した数値データのまま表示されています。
これはいただけません。
ってことでフォーマットを調整するためにコードに追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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関数も不要になるのでやりやすいかと思います。
これで下準備は完了です。
まずはコードを公開
次に営業日のみを表示するグラフを描くコードをまとめて公開します。
コメントをなるべく多くつけるように心がけました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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日移動平均線を描いてみます。
コード公開
とりあえず最初にコード公開します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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で判例を表示することができます。
グラフ確認
先ほどのコードで描かれたグラフがこちらです。
きちんと移動平均線が描かれていることが確認できます。
ここまでできたらPythonを使ってそこそこの分析ができるようになります。
出来高を加える
さらにこれだけだと寂しいので出来高を加えてみます。
ここまでくると、Yahooファイナンスで見られるグラフと同じくらいのものになりますね。
コード公開
まずはコードをどうぞ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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】
コード公開
まずはコードを見てみましょう。
ちょっと長くなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | 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ライブラリーを使えば、割と簡単にきれいなチャートを描くことができます。
コード自体は少し長いですが、一回書いてしまえば使う回すことができるのがプログラミングの素晴らしい点です。
一方で、可視化を行うには、株価データの取得やテクニカル分析の計算が必要になります。
Pythonで株価データを扱う記事については記事が散在しているのでこちらにまとめています。
株価データの取得方法やテクニカル分析の計算方法やその他の可視化方法についてはこちらからどうぞ。
-
【まとめ】Pythonで株価データを扱う
続きを見る
ここまで読んでくださってありがとうございました。
-
【コード解説】Pythonで株価チャートを描く【mplfinance編】
続きを見る
-
【コード解説】Pythonで株価チャートを描く【plotly編】
続きを見る