コロナ感染者数と株価を比較しよう!

f:id:IsThisAPen:20210912110509p:plain
以前の記事で,コロナ感染者数と相関がある銘柄を紹介しました.
コロナ感染者数と相関がある銘柄(日本株) - 株メモ

この記事では,このグラフを簡単に描く方法を紹介します.Googleアカウントさえあればコピペして実行できます.詳しくは次の記事を参照してください.

コード

Google Driveをマウント

今回は,Google Driveのファイルを読み込むため,いくつか操作が必要です.

まずは,次のコードを実行します.

# Google Driveをマウント (ファイルを参照できるようにする)
from google.colab import drive
drive.mount('/content/drive')

▶ボタンをクリックすると実行され,リンクが表示されます.リンク先のコードを□枠内に入力してください.

リンクをクリックしてコードを入力する.
リンクをクリックしてコードを入力する.

コードを入力し,以下が表示されると,Google Driveのファイルを読み込める状態になっています.

Google Driveのマウントが完了し,ファイルが読み込める状態に.
Google Driveのマウントが完了し,ファイルが読み込める状態に.

図の赤枠部分「My Drive」がGoogle Driveです.

赤枠の「My Drive」がGoogle Drive
赤枠の「My Drive」がGoogle Drive

データの取得

今回,コロナ感染者のデータは,NHKのWebページから取得します.
新型コロナウイルス 日本国内の感染者数・死者数・重症者数データ|NHK特設サイト

ひとまず,ダウンロードして,好きなフォルダに置いてください.

感染者数のデータ
感染者数のデータ

ファイルのアップロード

Google Driveにコロナ感染者のデータをアップロードします.

「My Drive」の右側にある︙をクリックし,「アップロード」を選択してください.さきほど保存した感染者数のファイルを選択すると,ファイルが「My Drive」に保存されます.

アップロード
アップロード

グラフの描画

mplfinanceのインストール.

pip install mplfinance

必要なライブラリの読み込み.

import pandas as pd
import mplfinance as mpf
import matplotlib.pyplot as plt
import pandas_datareader.data as web
import datetime as dt

アップロードしたファイルの読み込み.

df_covid = pd.read_csv('/content/drive/MyDrive/nhk_news_covid19_domestic_daily_data.csv',
                       index_col='日付', parse_dates=True)
df_covid.rename(columns={'日付': 'Date'}, inplace=True)
df_covid['covid_MA_7d'] = df_covid['国内の感染者数_1日ごとの発表数'].rolling(7).mean()
display(df_covid)

ここで,'/content/drive/MyDrive/nhk_news_covid19_domestic_daily_data.csv'の部分は,ファイル名・保存した場所によって変える必要があります.アップロードしたファイルの右にある︙をクリック→「パスをコピー」として取得したものを貼り付けてください.

パスのコピー
パスのコピー


ウォッチリストの作成

watchlist = ['9416',  '9020', '9024']
start = dt.date(2020,1,1)
end = dt.date.today()

グラフの描画.

def my_plt(code):
    df = web.DataReader(code + '.JP', 'stooq', start, end)
    mpf.plot(df, title = code, type='candle', mav=(5, 25, 200), volume=True)

    df = df.sort_index()
    df['Close_pct_change'] = df['Close'].pct_change()
    
    df_all = pd.merge(df, df_covid, left_index=True, right_index=True, how='outer')
    df_all = df_all.dropna()

    fig = plt.figure()
    ax1 = fig.add_subplot(1,1,1)
    ax2 = ax1.twinx()

    df_covid['covid_MA_7d'].plot(ax = ax2, color='g', lw = 1, zorder = 2)
    ax2.bar(df_covid.index, df_covid['国内の感染者数_1日ごとの発表数'], 
            color='r', alpha=0.5, label = 'covid',  zorder = 1)
    df_all['Close'].dropna().plot(ax = ax1, color='b', 
                                  rot=90, grid=True, label = code, zorder = 3)
    ax2.grid(False)
    
    h1, l1 = ax1.get_legend_handles_labels()
    h2, l2 = ax2.get_legend_handles_labels()
    ax1.legend(h1+h2, l1+l2, loc='best')
    
    print(code,
         pd.to_datetime(df.index.values[-1]).strftime('%Y-%m-%d'),
         '終値:', df['Close'][-1])
    plt.show()
    
for code in watchlist:
    my_plt(code)

以上のコードを貼り付けた状態が以下です.

全体
全体

実行結果

ランタイム「すべてのセルを実行」を選択すると,グラフが描画されます.
  • 青線:株価
  • 赤棒:新規感染者数
  • 緑の線:感染者数の7日移動平均線

実行結果
実行結果