Matplotlib & Seaborn 入門コース | 03.【実践編】株価のデータで折れ線グラフを可視化

こんにちは。キノコードです。
前回のMatplotlib & Seaborn 入門コース第二回目では、Matplotlibの基本的な使い方を線グラフを使って解説をしていきました。
具体的には、線グラフの色の変え方、線グラフの太さの変更、タイトルをつけたり、凡例、注釈をつける方法などを勉強していきました。
そして、この動画では、日経平均株価のデータを使って前回学んだことを実践していきたいと思います。
Matplotlib & Seaborn 入門コースでは、株価や仕事でよく使いそうな売上データなどを使って、基礎を解説した動画の次に実践の動画をアップしていく予定です。
つまり、基礎の次に実践、基礎、実践といった感じで、すぐに使える方法やイメージをお伝えできればと思っています。

また、この動画からは、Google Colaboratoryを使っていきます。
Google Colaboratoryは、URLにアクセスするだけPythonやPythonでよく使うライブラリを利用することができます。
つまり、インストールが不要で、GoogleDriveにアクセスさえできれば、すぐに使うことができます。
Google Colaboratoryの使い方についてはこの動画をご覧ください。
会社のパソコンにPythonのインストールが難しい方は、Google Colaboratoryの利用も検討してみてください。

それでは、レッスンをはじめていきましょう。

レッスンで使ったファイルはこちら

■保存方法
Mac:右クリック⇒「リンク先を別名で保存」
Windows:右クリック⇒「名前を付けてリンク先を保存」

Jupyter Labのファイルはこちら

ライブラリインポート

それでは、日経平均株価のデータを使って、matplotlibでグラフを作成してみましょう。

import pandas as pd
from pandas_datareader import data
import matplotlib.pyplot as plt
%matplotlib inline

まずは、ライブラリをインポートする記述をします。
ライブラリとは、よく使う機能や関数をまとめて簡単に使えるようにしたものです。
pandasをインポートします。
pandasはデータ解析を支援する機能を提供するライブラリです。
データ集計やデータ加工といった機能が入っています。
import pandas as pdと書きます。
asはライブラリ名好きな名前にすることができます。
従ってpdという名前でpandasを使うことができます。
pandas_datareaderは、日経平均やナスダック、日本の個別銘柄のデータを取得することができるライブラリです。
matplotlibはグラフを描画するためのライブラリです。
Jupyternotebook上で作成したグラフを表示できるように、%matplotlib inlineと記述しましょう。
実行します。
インポートが完了しました。

データ取得

start = '2019-11-01'
end = '2020-11-01'

df = data.DataReader('^N225','yahoo', start, end) 

それでは、日経平均株価のデータを取得してみましょう。
startという変数に、取得したいデータの最初の日を記述します。
今回は2019年11月1日からとします。
合わせて、取得したいデータの最後の日をendという変数に代入します。
今回は2020年11月1日までとします。
次に、取得したデータを格納するためのデータフレームを作成します。
dfという変数を記述しイコール、pandas_datareaderの省略名data、ドット、DataReaderの後に丸括弧、丸括弧の中に引数を記述していきます。
第一引数に取得したい株価のティッカーシンボルをシングルコーテーションでくくります。今回は日経平均株価のデータを使用するので、ハットを書いて大文字のN、225と書きます。
次の引数に、yahooファイナンスからデータを取得するのでデータソース名としてyahooと記述しシングルコーテーションでくくります。
最後に取得するデータの期間であるstartとendを記述します。
実行します。
これで、dfという変数に指定した期間の日経平均株価が格納されました。

df.head(10)

データフレームの中身を確認してみましょう。
上位10件を表示させる記述をします。
df.headの丸括弧の中に10を記述します。
実行します。
上位10件が表示されました。
データの詳細については、python株価コースで詳しく説明しています。
また、基礎からしっかり勉強されたい方はPandas入門コースをご覧ください。
チャンネル登録がまだの方は、登録ボタンをボチッとお願いします。
さてレッスンに戻ります。

終値グラフ描画

x = df.index
y = df['Adj Close'] 

plt.plot(x,y)

次に、xとyにデータを代入していきます。
xはグラフの横軸、つまりx軸のデータです。
日時のデータを代入するため、df.indexと記述します。
このように記述をすると、データフレームのインデックスを取得できます。
また、先ほどデータフレームをみたように、インデックスは日付です。
つまり、日付のデータを取得できます。
yはグラフの縦軸、つまりy軸のデータです。
ここでは、日経平均株価の調整済みの終値を示すCloseのデータをグラフにしていきましょう。
最後に、データをグラフにプロットする記述をします。
plt.plotの丸括弧の中に、第一引数としてx軸のデータのx、第二引数としてy軸のデータのyを記述します。
実行します。
グラフが表示されました。

plt.figure(figsize=(30,10))
plt.plot(x,y)

グラフのサイズを変更してみましょう。
このグラフのサイズ変更については前回のレッスンでは説明しませんでした。
少し難しい考え方ですが、説明をします。
先ほどみたグラフの表示のソースコードでは、
plt.plot(x,y)
と記述してグラフを表示しました。
このソースコードを実行すると、Pythonの内部では、figureオブジェクトというものを生成してから、plt.plotを実行しているのです。
ただし、このfigureオブジェクトの記述は、省略することができます。
figureオブジェクトを明示的に生成してからグラフ化をすると、グラフのサイズや解像度などを指定することができます。
使ってみましょう。
plt.figureと書いて丸括弧、丸括弧の中にfigsizeと記述します。
今回は30と10にします。30は横の長さ、10は縦の長さです。
実行します。
グラフが大きく表示されました。

plt.figure(figsize=(30,10))
plt.plot(x,y)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)

x軸とx軸の目盛りの数字が少し小さいので大きくしてみましょう。
plt.xticksと記述し丸括弧、fontsizeを指定します。
ここでは20とします。
y軸に関しても同様の記述をします。
実行します。
目盛りの数字が見やすくなりました。

plt.figure(figsize=(30,10))
plt.plot(x,y)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.xlabel('Date',fontsize=30)
plt.ylabel('Price',fontsize=30)

x軸の名前とy軸の名前を設定していきましょう。
前回のレッスンでも説明しましたが、軸の名前のことをラベルといいます。
x軸の名前はplt.xlabelで設定できます。
丸括弧の中に好きな名前をシングルコーテーションでくくります。
ここではDateとします。
fontsizeも設定しておきましょう。
ここでは30とします。
y軸も同様にplt.ylabelで設定できます。
実行します。
x軸とy軸の名前が設定できました。

plt.figure(figsize=(30,10))
plt.plot(x,y)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.xlabel('Date', fontsize=30)
plt.ylabel('Price', fontsize=30)
plt.grid()

次に、グラフの中にグリッドを表示させてみましょう。
plt.gridと書いて丸括弧です。
実行します。
グリッドが表示されました。

plt.figure(figsize=(30,10))
plt.plot(x,y)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.xlabel('Date', fontsize=30)
plt.ylabel('Price', fontsize=30)
plt.grid(axis='x')

前回のレッスンでは解説をしませんでしたが、グリッドを縦線のみにすることもできます。
plt.gridの丸括弧の中にaxisと書いてイコール、xをシングルコーテーションでくくります。
横線のみにしたい場合はyをシングルコーテーションでくくります。
実行します。
グリッドが縦線のみになりました。

plt.figure(figsize=(30,10))
plt.plot(x,y, color='red')
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.xlabel('Date', fontsize=30)
plt.ylabel('Price', fontsize=30)
plt.grid()

次に、グラフの色を変更してみましょう。
plt.plotの丸括弧の中にcolorと記述しイコール、好きな色をシングルコーテーションでくくります。
実行します。
グラフの色を変更できました。

plt.figure(figsize=(30,10))
plt.plot(x,y, color='#709B89')
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.xlabel('Date', fontsize=30)
plt.ylabel('Price', fontsize=30)
plt.grid()

カラーコードでもいろを指定できます。
実行します。
グラフの色を変更できました。

plt.figure(figsize=(30,10))
plt.plot(x,y, linewidth=5)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.xlabel('Date', fontsize=30)
plt.ylabel('Price', fontsize=30)
plt.grid()

グラフの線の太さを変更してみましょう。
plt.plotの丸括弧の中にlinewidthと記述し太さを設定できます。
ここでは5とします。
実行します。
線の太さを変更できました。

plt.figure(figsize=(30,10))
plt.plot(x,y,linestyle='dashed')
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.xlabel('Date', fontsize=30)
plt.ylabel('Price', fontsize=30)
plt.grid()

線のスタイルを変更してみましょう。
plt.plotの丸括弧の中にlinestyleと記述します。
今回は、破線を示すdashedを指定してみます。
実行します。
線のスタイルを変更できました。


plt.figure(figsize=(30,10))
plt.plot(x,y,marker='o')
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Price', fontsize=15)
plt.grid()

xとyが交わる点にマーカーを付けてみましょう。
plt.plotの丸括弧の中にmarkerと記述しイコール、指定したいマーカーをシングルコーテーションでくくります。
今回は小文字のoとします。
実行します、
xとyが交わる点にマーカーを付けることができました。

グラフタイトル追加

import japanize_matplotlib

plt.figure(figsize=(30,10))
plt.plot(x,y)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.xlabel('Date', fontsize=30)
plt.ylabel('Price', fontsize=30)
plt.grid()
plt.title('日経平均株価2019-2020', fontsize=35)

次に、グラフタイトルを追加してみましょう。
日本語を表示させるために、import japanize_matplotlibを記述します。
plt.titleの丸括弧の中に好きなタイトル名をシングルコーテーションでくくります。
fontsizeもここでは35と指定しておきます。
グラフタイトルは、「日経平均株価2019-2020」としましょう。
実行します。
グラフにタイトルが追加されました。

アノテーション追加

df['index_num'] = df.reset_index().index
df.head(20)

次に、グラフに注釈を追加してみましょう。
注釈のことを英語でannotationと言います。
アノテーションの説明の前に、行番号がわかりやすいように、行番号を記載したindex_numという列を追加する記述をします。
df角括弧の中にindex_numと記述しシングルコーテーションでくくります。
イコールと書いて、df.reser_index丸括弧.indexと記述します。
上位20件表示させてみましょう。
行番号が記載された列が追加されました。
10番目の2019-11-18に注釈を追加してみましょう。

import matplotlib.dates as mdates 

plt.figure(figsize=(30,10))
plt.plot(x,y)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.xlabel('Date', fontsize=30)
plt.ylabel('Price', fontsize=30)
plt.grid()
plt.title('日経平均株価2019-2020', fontsize=35)
plt.annotate('point',(mdates.date2num(x[10]),y[10]), xytext=(20, 50), fontsize=30, color='red',
      textcoords='offset points',  arrowprops=dict(color='black'))

前回のレッスンでは、x座標が3、y座標が9のところに注釈をつけました。
今回はx座標が時系列データです。
時系列データを指定するには、matplotlibのdatesが必要です。
このライブラリをmdatesとして使用する記述をします。
plt.annotateの丸括弧の中に注釈の設定を記述していきます。
まず、注釈で表示するテキストをシングルコーテーションでくくります。
今回はpointとします。
次に、丸括弧の中に示したい日付の行番号を記述します。
時系列データのx座標を指定するには、少し特殊ですがmdates.date2numと書いて丸括弧、丸括弧の中指定したい日付の行番号を記述します。
x角括弧10を書きます。カンマの後にyも記述します。
続いてxytextで、注釈のテキストの一文字目の位置を指定します。
今回は20と50にします。
fontsizeとcolorで注釈のテキストのサイズと色を設定します。
今回はサイズを30、色をレッドとします。
textcoordsの引数には、「data」や「offset points」を指定できます。
今回は、「offset points」を指定しましょう。
arrowpropsで矢印の色を指定できます。
arrowpropsイコール、dictと書いて丸括弧、丸括弧の中にcolorを記述します。
今回はblackとします。
実行します。
注釈が追加されました。
今回は行番号の10を指定しましたが、期間内の最大値の行番号を指定したり、自分が売買をしたいシグナルにアノテーションをつけると、グラフがよりわかりやすくなるでしょう。

png保存

plt.figure(figsize=(30,10))
plt.plot(x,y)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.xlabel('Date', fontsize=30)
plt.ylabel('Price', fontsize=30)
plt.grid()
plt.title('日経平均株価2019-2020', fontsize=35)
plt.annotate('point',(mdates.date2num(x[84]),y[84]), xytext=(20, 50), fontsize=30, color='red',
      textcoords='offset points',  arrowprops=dict(color='black'))
plt.savefig('N225_1.png')

作成した画像を保存してみましょう。
plt.savefigと書いて丸括弧、丸括弧の中に好きな名前をシングルコーテーションでくくります。
ドットpngと書いて、png形式の画像で保存することができます。
png以外にも。jpgやpdfを指定して保存することもできます。
実行します。
グラフを保存することができました。

移動平均線追加

span05 = 5
span25 = 25

df['sma05'] = y.rolling(window=span05).mean()
df['sma25'] = y.rolling(window=span25).mean()

次に、グラフに複数の線グラフを表示させてみましょう。
今回は、5日と25日の移動平均線を追加していきます。
移動平均線については、python株価シリーズの動画で詳しく紹介しているので、そちらをご覧ください。
まず、span01とspan02の二つの変数を用意します。
それぞれ、5と25を代入します。
これは、過去5日間と過去25日間の移動平均を算出するために使います。
pythonで移動平均を算出するには、pandasのrollingメソッドを使います。
データフレームに、単純移動平均の略称sma05というカラムを追加します。
イコールと書いて、データフレームからAdj Closeというカラムを取り出したyを記述します。
ドットを書いてrolling、丸括弧の中には移動平均の日数を記述します。
間隔を意味するwindowの引数に先ほど設定した変数のspan05を使います。
そして最後に平均を意味するmeanと書いて丸括弧です。
25日移動平均線も同じように記述します。
実行します。

df.head(100)

head関数を使い、上位100件を表示させてみましょう。
sma05とsma25のカラムが追加されました。
この移動平均をグラフにプロットしていきます。

移動平均線プロット

plt.figure(figsize=(30,10))
plt.plot(x,y,label='close')
plt.plot(x,df['sma05'], label='sma05')
plt.plot(x,df['sma25'], label='sma25')
plt.xlabel('Date', fontsize=30)
plt.ylabel('Price', fontsize=30)
plt.grid()
plt.legend()
plt.title('日経平均株価2019-2020', fontsize=35)

sma05とsma25のデータをプロットする記述を追加します。
plt.plotと書いて丸括弧、丸括弧の中に第一引数つまりx軸のx、第二引数にy軸に指定するカラムを記述します。
df角括弧の中に、先ほど作成したsma05をシングルコーテーションでくくります。
ラベルも追加しておきましょう。
sma05としてシングルコーテーションでくくります。
25日間の移動平均線、sma25についても同様の記述をします。
実行します。
移動平均線が追加されました。

グラフ色変更

plt.figure(figsize=(30,10))
plt.plot(x,y,label='close', color='#A29FB4')
plt.plot(x,df['sma05'], label='sma05', color='#BB6541')
plt.plot(x,df['sma25'], label='sma25', color='#B99277')
plt.xlabel('Date', fontsize=30)
plt.ylabel('Price', fontsize=30)
plt.grid()
plt.legend()
plt.title('日経平均株価2019-2020', fontsize=35)
plt.show()

グラフの色をカラーコードで変更してみましょう。
plt.plotの丸括弧の中にcolorを記述し、好きな色をシングルコーテーションでくくります。
実行します。
グラフの色を変更できました。

凡例の大きさ変更

plt.figure(figsize=(30,10))
plt.plot(x,y,label='close', color='#A29FB4')
plt.plot(x,df['sma05'], label='sma05', color='#BB6541')
plt.plot(x,df['sma25'], label='sma25', color='#B99277')
plt.xlabel('Date', fontsize=30)
plt.ylabel('Price', fontsize=30)
plt.grid()
plt.legend(fontsize=20)
plt.title('日経平均株価2019-2020', fontsize=35)
plt.show()

凡例が少し小さいので、大きくしてみましょう。
plt.legendの丸括弧の中にfontsizeと記述します。
今回は20としてみましょう。
実行します。
凡例のサイズが変更できました。

グラフ保存

plt.figure(figsize=(30,10))
plt.plot(x,y,label='close', color='#A29FB4')
plt.plot(x,df['sma05'], label='sma05', color='#BB6541')
plt.plot(x,df['sma25'], label='sma25', color='#B99277')
plt.xlabel('Date', fontsize=30)
plt.ylabel('Price', fontsize=30)
plt.grid()
plt.legend(fontsize=20)
plt.title('日経平均株価2019-2020', fontsize=35)
plt.savefig('N225_2.png')

このグラフも保存させてみましょう。
plt.savefigと記述し丸括弧、好きなファイル名を記述しシングルコーテーションでくくります。
実行します。
グラフを画像として保存できました。

レッスンで使ったファイルはこちら

■保存方法
Mac:右クリック⇒「リンク先を別名で保存」
Windows:右クリック⇒「名前を付けてリンク先を保存」

Jupyter Labのファイルはこちら