前回の続きです。前回は、複数銘柄の決算情報と財務情報をスクレイピングで取得しました。今回は前回取得した情報を可視化します。
[1] 基本的な指標の可視化
まずは前々回取得した以下の基本的な指標データを可視化してみます。
配当利回り | PER(調整後) | PSR | PBR | 出来高(千株) | 時価総額(兆円) | |
---|---|---|---|---|---|---|
JR東日本 | 2.53 | 12.39 | 0.83 | 0.77 | 1965.8 | 2.458450 |
JR東海 | 1.04 | 7.07 | 1.60 | 0.76 | 701.9 | 2.957130 |
JR西日本 | 3.59 | 10.85 | 0.64 | 0.79 | 1247.9 | 0.970065 |
東急 | 1.67 | 19.61 | 0.73 | 1.05 | 1104.6 | 0.856696 |
近鉄 | 1.05 | 43.77 | 0.75 | 2.22 | 387.7 | 0.902784 |
平均値 | 1.98 | 18.74 | 0.91 | 1.12 | 1081.6 | 1.629025 |
標準偏差 | 1.09 | 14.71 | 0.39 | 0.63 | 599.1 | 1.001244 |
[1-1] matplotlibをインストール
pip3 install matplotlib --user
[1-2] PERの可視化
まずは、PERを棒グラフで可視化します。
import matplotlib.pyplot as plt # '標準偏差'の列を削除 df = df.drop(index='標準偏差') # FigureとAxesを取得 fig = plt.figure() ax = fig.add_subplot(111) # グラフ表示するデータを取得 per = df['PER(調整後)'] # PER xpos = np.arange(len(per)) # X軸上の位置(0, 1, 2, ...) # 棒グラフを作成 ax.bar(xpos, per) # X軸に銘柄名を表示 ax.set(xticks=xpos, xticklabels=df.index) # 補助線を描画 ax.grid(axis='y', color='gray', ls='--') # 凡例を表示 ax.legend(['PER(調整後)']) # グラフを表示 fig.show()
結果、次のようなグラフが得られます。
グラフ内の日本語は文字化けする場合があります。その場合は、日本語フォントのインストールが必要です(Amazon Linuxの場合は拙著参照)。
[1-3] PSRとPBRの可視化
次に、PSRとPBRを可視化します。
# 可視化する列 columns = ['PSR', 'PBR'] # FigureとAxesを取得 fig = plt.figure() ax = fig.add_subplot(111) # データ数を取得 num_data = df.shape[0] # 銘柄の数 num_column = len(columns) # 可視化する列の数 # 棒グラフを横並びで表示するためのパラメータ width = 0.8 / num_column # 棒グラフの幅 xpos = np.arange(num_data) # X軸上の位置 # 指定した列数分ループ for i in range(num_column): col = columns[i] x = xpos + width * i y = df[col] # 棒グラフを表示 ax.bar(x, y, width=width, align='center') # X軸の目盛位置を調整し、銘柄名を表示 labels = df.index.values offset = width / 2 * (num_column - 1) ax.set(xticks=xpos+offset, xticklabels=labels) # 補助線を描画 ax.grid(axis='y', color='gray', ls='--') # 凡例を表示 ax.legend(columns) # グラフを表示 fig.show()
結果、次のグラフが得られました。 棒グラフを横並びにするのには、少々手間がかかります。下記サイトを参考にさせていただきました。
【Python】matplotlibで色んな種類の棒グラフを表示する方法 | 侍エンジニアブログ
近鉄GHDのPBRが高いですね。PBR = 時価総額 / 株主資本ですから、B/S上の価値よりも市場に高く評価されていると言えます。
[2] 決算情報の可視化
続いて、前回得た決算情報・財務情報を可視化します。
ROA | ROE | ||
---|---|---|---|
名称 | 決算期 | ||
JR東日本 | 2020年3月期 | 2.32 | 6.25 |
2019年3月期 | 3.53 | 9.54 | |
JR東海 | 2020年3月期 | 4.14 | 10.28 |
2019年3月期 | 4.72 | 12.51 |
[2-1] ROEの可視化
まずは、ROEを折れ線グラフで可視化します。
# FigureとAxesを取得 fig = plt.figure() ax = fig.add_subplot(1,1,1) # 銘柄の名称リスト brand_names = list(df.index.unique('名称')) # 可視化するデータの名称 data_name = 'ROE' # 全銘柄のデータを折れ線グラフに表示 for brand_name in brand_names: brand_df = df.loc[(brand_name,)] # 指定した銘柄のデータ x = brand_df.index # 決算期 y = brand_df[data_name] # 可視化するデータ # 折れ線グラフ表示 ax.plot(x, y, marker='o') # 補助線を描画 ax.grid(axis='y', color='gray', ls='--') # 軸ラベルをセット plt.xlabel(data_name, size=15) # 凡例を表示 ax.legend(brand_names) # グラフを表示 fig.show()
結果、次のグラフが得られました。
[2-2] ROEとROAの可視化
次に、ROEとROAをセットで可視化して、1つの図に収めます。
# 可視化するデータ data_names = ['ROE', 'ROA'] # Figurを取得 fig = plt.figure(figsize=(10, 4)) # 指定した全データをデータ別に折れ線グラフで表示する for i, data_name in enumerate(data_names): # Axesを取得 ax = fig.add_subplot(1, 2, i+1) # 銘柄の名称リスト brand_names = list(df.index.unique('名称')) # 全銘柄のデータを折れ線グラフに表示 for brand_name in brand_names: brand_df = df.loc[(brand_name,)] # 指定した銘柄のデータ x = brand_df.index # 決算期 y = brand_df[data_name] # 可視化するデータ # 折れ線グラフ表示 ax.plot(x, y, marker='o') # 補助線を描画 ax.grid(axis='y', color='gray', ls='--') # 軸ラベルをセット plt.xlabel(data_name, size=15) # 凡例を表示 ax.legend(brand_names) # 不要な余白を削る plt.tight_layout() # グラフを表示 fig.show()
結果、次のグラフが得られました。
JR東海は利益率が高いことで知られていますが、ROE・ROAが高いことからもそのことが窺えます。
また、2020年3月期はどの鉄道会社もROE・ROAが低下しています。これは、2020年2月頃からコロナウィルスの感染拡大があったことや、2019年10月の増税の影響によるものではないかと推測できます。
[2-3] 1銘柄の決算情報を可視化
詳細は割愛しますが、これまで紹介してきた内容を組み合わせると、次のようなグラフを作ることも可能です。
2018年度末(2019年3月期)までは、売上高・利益ともに伸びていましたが、2020年3月期は落ち込んでいます。
終わりに
今回は、スクレイピングで取得した情報を「matplotlib」で可視化しました。
今回行った可視化は複雑なものではありませんが、それでも可視化することによって得られる情報はあります。
株に関して言えば、個々の銘柄の情報は簡単に調べることが出来ますが、複数銘柄を比較できるサイトが少ないです。比較はできても、自分が比較したい情報は無いという場合もあります。
まずは、自力でExcelなどに手入力してみて、自動化したくなったら今回のようにするとよいのかもしれません。
*1:Lorenzo CafaroによるPixabayからの画像