ここでは「Python」をコマンドプロンプト環境下使用し、株価情報をmatplotlibを使って取得&表示していこうと思います。
この記事を読むことで
matplotlibを使い株価情報をグラフで表示する方法
リスト内包表記の使い方
pyplotを使ったグラフの複数分け表示・カラー&ラベル付け
などを学ぶことができます。
株価情報をサイト内で見るときに、グラフで客観視したいときってありますよね。
今回は表から株価情報(四本値など)を取得し、下記のようなグラフを表示する方法を紹介していきます。
このようなグラフをPythonで取得&表示してみたい方は是非最後までご覧ください。
また今回の記事は前回の続きとなっているので、宜しければこちらから先にご覧ください。
それでは始めていきましょう。
Python の動作環境と使用するパッケージのDL
最初に今回Pythonを使用する上での動作環境と使用するパッケージのインストールについて記載します。
Pythonをコマンドプロンプトで動作
※毎度この説明をさせて頂いているので、一度ご覧の方は下へスクロールして飛ばしてください。
この記事ではPython をコマンドプロンプト(cmd)にて動作させています。
Windowsの方なら、画面左下の検索窓に「コマンドプロンプト」または「cmd」を入力することでコマンドプロンプトアプリが起動できます。
Pythonのインストールおよびコマンドプロンプトの細かな使い方については、割愛します。
※当サイトでは「C:¥code」と「Cドライブ直下」に「code」というファイルにPython ファイルを入れて、実行させています。
したがって、パッケージ等はすべて「pip install」を使用します。
また、Python ファイルの実行ですがコマンドプロンプト内で
とコマンド入力して実行させます。
コマンドプロンプトで結果を表示させるため、print文を多用している点もご理解いただけると幸いです。
グラフ表示等に必要なPython パッケージをDL
続いて、今回グラフ表示などでPython に必要なパッケージである
の2つをpipでインストールします。
datetimeモジュールは株価情報から取得した文字列から日付・時間へ変換するときに使用します。
このモジュールの中には、
日付・時間→文字列変換:strftime()
文字列→日付・時間変換:strptime()
と変換できるオブジェクトがあるので、これを使用します。
matplotlibモジュールはグラフのプロット・作成で使用します。
今回は
複数のグラフを縦×横で表示する:subplot(縦, 横, 場所)
グラフに各値をプロットする:plot(title= , gird= , color= , label= )
ラベルの表示箇所を指定する:legend(loc= )
を使用するために必要になります。
matplotlibモジュールの各引数の説明は下記にて行うので、ここでは割愛します。
Pythonの内包表記・インデックス指定
コマンドプロンプトなどの動作環境と、pip installで必要なパッケージがインストールできたら実際にプログラムを書いていきます。
リスト内包表記を使い日時を取得する
前回までで一通り株価情報を取得しましたが、取得した日付のデータは文字列であるためグラフを作成するときにエラーが発生します。
例えば
そのため、取得した日付データを数値へ変換する必要があります。
ここで役立つのが先ほど挙げた「strptime()」とリスト内包表記です。
strptime()オブジェクトは文字列を日付・時間に変換するので、株価情報の「”Date”」という列情報すべてを日付・時間に変換すればグラフ化できるようになります。
ですが、一つ一つstrptime()オブジェクトを使って日付・時間に変換していたら大変ですよね?!
そこで「リスト内包表記」を使用するわけです。
リスト内包表記はリストの中にfor文が入っており
で表すことができます。
これを使って株価情報に与えられている日付の文字列を日付・時間に変換するPythonの記述は
となり、たった1行で新しく用意したYearへ日付・時間に変換したデータを書くのすることができます。
「Year」はグラフを表示したときの行名になるので、読みやすい名前をつけておきましょう。
dt.strptime()は[“Date”]の列を一括で指定したフォーマットの文字列・日付・時間に変換できるので、覚えておくと便利です。
この記述を追加して、head()、tail()オブジェクトを使い5つずつ要素を表示すると
となり、Yearに文字列から日付・時間になった値が表示されていることが分かります。
ちなみに[0]は読み込んだWEBページのテーブル数を表し、今回はWEBページに一つのテーブルしかないので[0]となります。2つ、3つテーブルがある場合はその数に応じて[]内の数値を増やします。
また、[“Date”]はそのテーブル内の「Date列」をすべて選択した状態になっており、これをfor文で回すことで「Year列」すべてに型変換した値を格納できるというわけです。
このテーブル表記の表し方はWEBスクレイピングならではの特殊な形だと思います。
インデックス指定と型変換を行う
続いて、インデックスの指定と型変換を行っていきます。
インデックスの指定
まずはグラフの行を日付で固定するために「set_index()」オブジェクトを使います。
とすることで、「行の値」を「Yearの列の値」で固定できます。
ダブルクォーテーション内を適切な列名に変えれば「固定する行の値」も変えることができますが、株価情報をグラフ化するのに、行の値は他に変える候補がないので変えません。
インデックスに指定した状態で、プログラムを実行すると
となり、行の値にYearの値が指定されていることがわかります。
float型への型変換
また取得した株価情報の数値が本当にfloat型どうか分からないので(調べればfloat型と分かるが)、プログラム内で強制的にfloat型にしてしまいます。
今回は四本値などすべての項目をグラフ化するのでfor文と「astype()」オブジェクトを使ってfloat型へ変換します。
list_h = ["Open", "High", "Low", "Close*", "Adj Close**", "Volume"] # 四本値をfloat型へ型変換 i=0 for i in range(len(list_h)): df[0][list_h[i]] = df[0][list_h[i]].astype(float) i = i + 1
このPython の書き方のポイントは
という点です。
list_hに初めから列の名前を格納しておき、この配列の長さを「len(list_h)」で取得します。
この書き方でfor文を回せば、list_hの要素が増えてもfor文を変える必要がなくなるので非常に便利ですよ。
matplotlibで株価情報をグラフ化する
型変換などの準備ができたら、さっそくPythonのmatplotlibを使って株価情報をグラフ化していきましょう。
pyplotを使い複数のグラフを分けて表示
まずはpyplot()オブジェクトを使って一つ一つグラフを別々に表示していきます。
このpyplot()をPythonコード内に記述しないと
と見にくくなってしまいます。
そのため、プログラム内に下記の記述を追加して
import matplotlib.pyplot as plt n, m = 3, 2 j = 0 for j in range(len(list_h)): plt.subplot(n,m,j+1)
グラフを複数表示へします。
matplotlibからpyplotを呼び出し、pltと名前を定義します。
変数nとmはグラフの表示方をあとから変えやすいように変数で定義しています。
j+1はグラフの順番を決めています。
matplotlibを使いグラフのカラーを指定
続いて、matplotlibのplot()オブジェクトを使ってグラフへのプロットとカラー、グリッド線、ラベルの表示を指定していきます。
先ほどのjを引数としたfor文内に
# 各銘柄をプロット
df[0][list_h[j]].plot(grid=True, color = plot_c[j], label = Brand + list_h[j])
を追加します。
グリッド線
グリッド線の有無は
grid=True:グリッド線表示grid=False:グリッド線非表示
となります。
グラフのカラー
また、グラフのカラー表示は
と初めに定義しておき、これらをcolorへ代入します。
とj番目と指定しておけば、for文が回ると勝手にグラフの色も変わってくれますよね。
ラベル名
ラベル名は列名を先ほど「list_h」で配列に格納してあるのでこれを利用します。
と初めに定義しておけば、他の銘柄でも対応できますよね。
ハイフンは四本値と文字が引っ付いてしまわないようにするためです。
この辺の見やすさは個人の感性なのでお任せです。
matplotlibを使いラベルを表示
最後にjを引数としたfor文に
と記述すればラベルを左上へ表示することができます。
locの値は
locの値一覧
best
right
center
center left
center right
upper right
upper left
upper center
lower right
lower left
lower center
の11種類あり、ラベルの表示位置を変えることもできます。
さいごにfor文の外に
とプロットしたデータをグラフとして表示させればOKです。
このPython プログラムを実行すれば
と各四本値と年のグラフが自動で作成されます。
参考にしたサイト
AI-interのPython3入門:Pandasで超簡単!WEBスクレイピング
note.nkmk.me:Pythonのdatetimeで日付や時間と文字列を変換(strftime、strptime)
note.nkmk.me:pandas.DataFrameの列をインデックス(行名)に割り当てるset_index
note.nkmk.me:Pandasで文字列と数値を相互変換、書式変換
it-swarm.dev:PythonでAxesSubplotを表示する方法は?
Qiita:[matplotlib基礎]複数のグラフを並べて表示する
ITを使っていこう:matplotlibでlabelが表示されない時にチェックすること
また当サイトでは、IBM Watsonを使ったPythonによる「画像分析」なども紹介しているので興味がある方は挑戦してみてください。
お疲れ様でした。