どこにでもいる30代SEの学習ブログ

主にプログラミング関連の学習内容。読んだ本の感想や株式投資についても書いてます。

日本株の情報をスクレイピングで取得しmatplotlibで可視化する

f:id:predora005:20201123102206j:plain
*1

前回の続きです。前回は、複数銘柄の決算情報と財務情報をスクレイピングで取得しました。今回は前回取得した情報を可視化します。

predora005.hatenablog.com

f:id:predora005:20201205184457p:plain

[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()

結果、次のようなグラフが得られます。

f:id:predora005:20201129161020p:plain

グラフ内の日本語は文字化けする場合があります。その場合は、日本語フォントのインストールが必要です(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で色んな種類の棒グラフを表示する方法 | 侍エンジニアブログ

f:id:predora005:20201129161042p:plain

近鉄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()

結果、次のグラフが得られました。

f:id:predora005:20201129161221p:plain

[2-2] ROEROAの可視化

次に、ROEROAをセットで可視化して、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()

結果、次のグラフが得られました。

f:id:predora005:20201129161356p:plain

JR東海は利益率が高いことで知られていますが、ROEROAが高いことからもそのことが窺えます。

また、2020年3月期はどの鉄道会社もROEROAが低下しています。これは、2020年2月頃からコロナウィルスの感染拡大があったことや、2019年10月の増税の影響によるものではないかと推測できます。

[2-3] 1銘柄の決算情報を可視化

詳細は割愛しますが、これまで紹介してきた内容を組み合わせると、次のようなグラフを作ることも可能です。

f:id:predora005:20201205184457p:plain

2018年度末(2019年3月期)までは、売上高・利益ともに伸びていましたが、2020年3月期は落ち込んでいます。

終わりに

今回は、スクレイピングで取得した情報を「matplotlib」で可視化しました。

今回行った可視化は複雑なものではありませんが、それでも可視化することによって得られる情報はあります。

株に関して言えば、個々の銘柄の情報は簡単に調べることが出来ますが、複数銘柄を比較できるサイトが少ないです。比較はできても、自分が比較したい情報は無いという場合もあります。

まずは、自力でExcelなどに手入力してみて、自動化したくなったら今回のようにするとよいのかもしれません。

*1:Lorenzo CafaroによるPixabayからの画像