Python

【コード解説】Pythonで株価チャートを描く【mpl_finance編】

2020年12月30日

こんにちは。TATです。

今回はPythonのコード解説記事です。

テーマは「Pythonで株価データのローソク足チャートを描く」です。

 

特にここではファイナンス用のライブラリーであるmpl_financeに焦点を絞ります。

ちなみにmpl_financeは新しくなって今ではmplfinanceになっています。

さらにこの他にもPlotlyなどといったライブラリーがあるのですが、それは別記事でご紹介できればと思います。

ここではmpl_financeに焦点を絞って解説していきます。

 

また、Pythonで株価データを扱う記事については記事が散在しているのでこちらにまとめました!

株価データの取得方法やテクニカル分析の計算方法やその他の可視化方法についてはこちらからどうぞ。

関連記事
【まとめ】Pythonで株価データを扱う
【まとめ】Pythonで株価データを扱う

続きを見る

【コード解説】Pythonで株価チャートを描く【mpl_finance編】

(おさらい)株価データを取得する

まずはおさらいとして、計算に必要な株価データを取得します。

ここは過去に記事でも解説しているので詳細は割愛します。

 

今回はpandas_datareaderを使ってトヨタ(7203)の株価データを取得します。

 

このコードで取得した株価データはこんな感じです。

このままだとデータ数が多いので、直近50日のデータに絞ります。

このデータを使っていくつかのテクニカル分析を計算していきます。

 

コードの内容を詳しく知りたい方は、こちらの記事で解説しているので参考にしてください。

関連記事
【コード解説】Pythonで株価データを取得する!【3つの方法を解説】
関連記事
【Pythonコード解説】yahoo_finance_api2で日本株の株価データを取得する
【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列を挿入します。

これで下準備は完了です。

 

グラフを描く

早速ローソク足を描いてみます。

まずはコードを公開します。こちらです。

 

こちらのコードで描いたチャートがこちらです。

きれいにローソク足チャートが描けていることが確認できます。

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軸がさっき変換した数値データのまま表示されています。

これはいただけません。

ってことでフォーマットを調整するためにコードに追加します。

 

matplotlib.dates.DateFormatterを使って日付フォーマットを調整しています。

これで表示されたグラフがこちらです。

いい感じですね。

 

週末に隙間があるw

ただここで問題が発生します。

グラフを見てみると、妙にローソク足間の隙間が大きい箇所がありますよね。

これ、土日祝日ですw

時系列データでグラフを表示すると、データが抜けている土日祝日も表示されてしまうため、このように空白になってしまうんですね。

ここはなんとかしたいところです。

ということで次にここをきれいにできるように工夫してみます。

ここがクリアできたらグラフは完成です!

 

ローソク足チャートで営業日だけを表示する

最後に営業日だけを表示できるように少しまたコードをいじくります。

これができたらクリアですね。

営業日だけを表示するには少し工夫が必要で、ここでは当初の0から順番に続く数字をindexとして、それらの表示を日付データに置き換えるという方法で行きます。

こうすると、土日祝日に隙間が開くことなく表示できます。

 

必要な列を追加

まずは下準備です。

今回の作戦を実行するには、0から続く数字をindex列に追加します。

最初のやり方と同じです。

このやり方だとdate2num関数も不要になるのでやりやすいかと思います。

これで下準備は完了です。

 

まずはコードを公開

次に営業日のみを表示するグラフを描くコードをまとめて公開します。

コメントをなるべく多くつけるように心がけました。

 

グラフを確認

このコードで描けたグラフがこちらです。

いや〜素晴らしいですね!

土日祝日の不自然な隙間が開くこともなく、きれいにチャートを描くことができました。

 

コード解説

ここで増えたのは2行だけ(13行目と14行目)です。

13行目のxticksでは、引数として2つのリストを渡しています。

1つ目のリストにある各要素が2つ目のリストの値に対応して、グラフに表示されるようになります。

リスト内表記を使うとコードがスッキリしますね。

そしてこのままだとx軸に日付データが横並びで書かれてしまうのでカオスになります。

そこで14行目のautofmt_xdate関数の登場です。

名前の通り、いい感じに表示データを調整してくれます。

一応これがない場合のチャートも載せておきます。

ご覧の通り、x軸の表示データが重なりまくってカオス化しています。

autofmt_xdateはここをいい感じに調整してくれるわけです。

以上で、ローソク足チャートをPythonできれいに描くことができました。

 

移動平均線を加える

ここからは応用編です。ゆえにサクサク進みます。

ローソク足チャートをきれいに描くことができたので、ここにテクニカル分析データを合わせて表示してみましょう。

各テクニカル分析の計算のためのコードはこちらの記事で解説しています。

関連記事
【コード解説】Pythonで株式投資に必要なテクニカル分析を計算する

 

まずは移動平均線です。

例として5日・25日移動平均線を描いてみます。

コード公開

とりあえず最初にコード公開します。

 

ここではax.plot関数を使ってSMA5とSMA25を表示しています。

この際、labelを指定しておくことで、plt.legendで判例を表示することができます。

 

グラフ確認

先ほどのコードで描かれたグラフがこちらです。

きちんと移動平均線が描かれていることが確認できます。

ここまでできたらPythonを使ってそこそこの分析ができるようになります。

 

出来高を加える

さらにこれだけだと寂しいので出来高を加えてみます。

ここまでくると、Yahooファイナンスで見られるグラフと同じくらいのものになりますね。

 

コード公開

まずはコードをどうぞ。

 

この場合はグラフが2つ必要になってくるので、subplots関数の引数に2を渡しています。

1以上の場合は、figとaxはリストになるのでindexを指定してチャートをプロットすることになります。

さらにheight_ratiosでグラフをサイズの比を指定しています。

何も指定しなければ同じサイズになります。

Volumeはbar関数で表示するといい感じになります。

 

グラフを確認

このコードで描かれたグラフがこちらです。

先ほどの移動平均線も一緒に表示しています。

移動平均線も出来高も表示できてかなりいい感じですね。

 

複数のテクニカル分析を組み合わせる

最後の仕上げとして、複数のテクニカル分析を合わせたグラフを紹介しておきます。

こちらの記事で紹介している移動平均線MACDRSI、さらに出来高もまとめて一気に表示してみましょう。

計算方法についてはこちらの記事で解説しています。

関連記事
【コード解説】Pythonで株式投資に必要なテクニカル分析を計算する

 

コード公開

まずはコードを見てみましょう。

ちょっと長くなります。

 

グラフを確認

それではこのコードで描いたグラフを確認しましょう。

素晴らしくいい感じですね。

ここまでのグラフが描けると、本格的に株の分析に使えそうな感じがします。

 

データの可視化にはPythonが最適です。

以上でPythonで株価チャートを描く方法の解説はおしまいです。

 

Pythonを使うと、データの可視化などの複雑な処理も短いコードで実装することができます。

Pythonは、データ分析やデータの可視化などを得意とするプログラミング言語で、さらにAI関連のライブラリーが豊富なので、昨今のAIブームで需要が爆発しています。

おすすめ
【いますぐ始められます】データ分析をするならPythonが最適です。【学習方法もご紹介します!】
おすすめ
【人気上昇中】今人気のプログラミング言語「Python」は何ができるのか?できることまとめます【転職でも有利です】

 

また、Pythonは、僕自身も独学で習得できたくらい初心者でも学びやすい言語です。

僕の場合は社会人になってから独学でPythonを習得して転職にも成功しました。Pythonをきっかけに人生が大きく変わりました。

おすすめ
【実体験】ゼロからのPython独学を決意してから転職を掴み取るまでのお話。
【実体験】ゼロからのPython独学を決意してから転職を掴み取るまでのお話。

続きを見る

 

僕自身の独学の経験をベースに、Python独学ロードマップをまとめたので、もしご興味があればご覧ください。

おすすめ
【決定版】Python独学ロードマップ【完全初心者からでもOKです】
【決定版】Python独学ロードマップ【完全初心者からでもOKです】

続きを見る

 

僕自身はUdemyでPythonを独学しました。

おすすめ
プログラミングの独学にUdemyをおすすめする理由!【僕はUdemyでPythonを独学しました!】
おすすめ
【目的別】Pythonが学べるUdemyのおすすめコースを紹介します【随時更新】

 

まとめ

いかがでしたでしょうか。

今回は「Pythonで株価チャートを描く」というテーマで解説してきました。

mpl_financeライブラリーを使えば、割と簡単にきれいなチャートを描くことができます。

コード自体は少し長いですが、一回書いてしまえば使う回すことができるのがプログラミングの素晴らしい点です。

 

一方で、可視化を行うには、株価データの取得やテクニカル分析の計算が必要になります。

Pythonで株価データを扱う記事については記事が散在しているのでこちらにまとめています。

株価データの取得方法やテクニカル分析の計算方法やその他の可視化方法についてはこちらからどうぞ。

関連記事
【まとめ】Pythonで株価データを扱う
【まとめ】Pythonで株価データを扱う

続きを見る

 

ここまで読んでくださってありがとうございました。

おすすめ
【決定版】Python独学ロードマップ【完全初心者からでもOKです】
【決定版】Python独学ロードマップ【完全初心者からでもOKです】

続きを見る

おすすめ
プログラミングの独学にUdemyをおすすめする理由!【僕はUdemyでPythonを独学しました!】
おすすめ
【目的別】Pythonが学べるUdemyのおすすめコースを紹介します【随時更新】

note始めました


noteでは、株式投資やプログラミングにのノウハウなどについて発信しています。

特にオニールやミネルヴィニの投資手法に基づいてスクリーニングした銘柄を発表しています。

投資でニート生活で管理している監視銘柄をさらに細かくスクリーニングした銘柄を発表していきます。

TATのnoteを見る


Pythonは世界中で人気上昇中の言語です!


需要が上昇しています


Pythonの需要はここ最近で急拡大しています。

特にAIやデータ分析を得意とする言語なので、データサイエンス分野で需要が爆発しています。

おすすめ
【人気上昇中】今人気のプログラミング言語「Python」は何ができるのか?できることまとめます【転職でも有利です】



初心者も学びやすい


Pythonは初心者にも学びやすい言語です。

僕自身も社会人になってからPythonを独学して習得しました。

おすすめ
【決定版】Python独学ロードマップ【完全初心者からでもOKです】
【決定版】Python独学ロードマップ【完全初心者からでもOKです】

おすすめ
【Python独学法】初心者におすすめのPython勉強法まとめ
【Python独学法】初心者におすすめのPython勉強法まとめ


転職の武器になる!


Pythonは転職する際の武器にもなります。

僕はPythonを独学して転職に成功しました。

おかげさまで年収も大きく上がりました。

おすすめ
【実体験】ゼロからのPython独学を決意してから転職を掴み取るまでのお話。
【実体験】ゼロからのPython独学を決意してから転職を掴み取るまでのお話。

おすすめ
【副業は神です】2度の転職において副業が内定の決め手になったお話。



おすすめのプログラミング学習方法


Udemy


圧倒的な安さ(セール時)で上質な動画学習素材が手に入る!







Udemyを詳しく見る!



 

TECH::CAMP


いつでも講師に質問できるチャットシステムが最強です!







TECH::CAMPを詳しく見る!



 

CodeCamp


講師とのマンツーマンレッスンで挫折しない!







CodeCampを詳しく見る!



 

-Python
-, , , , ,

© 2021 気ままなブログ