目次
はじめに
ここ最近黒点数が減少してきて経済に悪影響が及ぶという話をたまに目にします。原理的には「気温が下がる→作物が取れにくくなる→…→経済悪化」のような風が吹けば桶屋が儲かるレベルの話みたいですが、実際のところどうなのかとりあえず株価と関係があるかどうか比較してみました。
データのダウンロード
黒点数
KaggleにSunspotsというCC0のデータセットがあるためそれを使わせてもらいました。
株価データ
「TOPIXのCSVファイルをダウンロードしてPythonで読み込みする」でTOPIXのCSVをダウンロードしたのでそれを使います。同じ方法で日経平均やダウ平均、S&P500も入手して比較してみました。
Python解析
動作環境
Pythonの動作環境はAnacondaに付属してくるJupyter Notebookを使いました。以下に記述するスクリプトは全てJupyter Notebookに記載してPython3.6で動作させたものです。
黒点数のプロット
PandasのDataFrameを使って黒点数のCSVファイルを読み込みます。
import numpy as np import pandas as pd from pandas import DataFrame import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline # 黒点数の読み込み spots_dframe = pd.read_csv('./Sunspots.csv')
ちなみにデータの末尾をtailを使ってみてみます。
spots_dframe.tail()
2019年末までの月ごとの平均データであるということがわかります。
グラフをプロットしていきます。
spots_dframe.plot(x='Date',y='Monthly Mean Total Sunspot Number',legend=True,figsize=(10,4)) plt.xlabel('date') plt.ylabel('sunspots') plt.legend(title='SunSpots')
グラフ化してみると、相当昔(1700年代!?)からデータが存在しており、周期的に黒点数が増減していることがわかります。
ここ20年程度にクローズアップすると次のようになります。
recent_spots_dframe = spots_dframe[-400:-1] recent_spots_dframe.plot(x='Date',y='Monthly Mean Total Sunspot Number',legend=True,figsize=(10,4)) plt.xlabel('date') plt.ylabel('sunspots') plt.legend(title='SunSpots')
ピークは減少傾向にありますが、やはり周期的に増減しています。
TOPIXチャートとの比較
TOPIXのCSVデータをDataFrameとして読み込んだのちに、黒点数のDataFrameとマージして解析しやすいようにします。
# CSVファイルをDataFrame形式で読み込む topix_dframe = pd.read_csv('./topix_TimeChart.csv') # 列名を英語に変更する topix_dframe = topix_dframe.rename(columns={'日付':'Date', '高値': 'High', '安値': 'Low', '始値': 'Open', '終値': 'Close', '出来高': 'Volume'}) def date_apply(x): x = str(x) return x[0:4]+"-"+x[4:6]+"-"+x[6:8] # 日付のフォーマットを変更する(yyyy-mm-dd) topix_dframe["Date"] = topix_dframe["Date"].apply(date_apply) # 順序を古い順になるよう逆にする topix_dframe = topix_dframe[::-1]
ここまでは「TOPIXのCSVファイルをダウンロードしてPythonで読み込みする」の途中と同じ内容です。そして、2つのDataFrameを日付をキーとしてマージします。
# 黒点数のDataFrameとTOPIXのDataFrameをマージする dframe = pd.merge(recent_spots_dframe, topix_dframe, on='Date') dframe.head()
headで先頭を見るとちゃんとマージできていることがわかります。mergeはデフォルトでは両方でマージするので黒点数、TOPIXの両方のDataFrameの日付が存在する項目が残ることになります。つまり月ごとのデータとなっています。
そして、グラフ化に進みます。
fig, ax1 = plt.subplots() ax2 = ax1.twinx() ax1.plot(dframe['Date'], dframe['Close'], label='TOPIX') ax2.plot(dframe['Date'], dframe['Monthly Mean Total Sunspot Number'], label='Sunspots', color='indianred') handler, label = ax1.get_legend_handles_labels() handler1, label1 = ax2.get_legend_handles_labels() ax1.legend(handler+handler1, label+label1, loc=(0.45,0.8), title='') ax1.set_ylabel('TOPIX') ax2.set_ylabel('SunSpots') plt.xlabel('Date') print( plt.xticks() ) plt.xticks([0,29,59,89,119,149])
(※print(plt.xticks())は横軸の調整(plt.xticks)に使いました)
グラフ化してみると黒点数とTOPIXについては特に相関関係は無さそうに見えます。むしろ逆に黒点数が少ないほどTOPIXが高いようにも見えます。
念のため前月比の相関係数をヒートマップ化して確認してみます。ヒートマップ化にはSeabornのheatmap関数を使います。
# 黒点数の前月比(%)を出す dframe['Sunspots Change'] = dframe['Monthly Mean Total Sunspot Number'].pct_change()*100 # TOPIXの前月比(%)を出す dframe['TOPIX Change'] = dframe['Close'].pct_change()*100 # 相関関係をグラフ化する sns.heatmap(dframe[['TOPIX Change', 'Sunspots Change']].dropna().corr(), annot=True)
-0.11ということはほとんど相関は無いということになります。
TOPIX、日経平均、S&P500、ダウ平均との比較
TOPIXだけ見て相関無しと結論付けるのも早計な気がするので他の指標も確認してみました。グラフの出し方は同じのためスクリプトは省略します。
いずれも相関は無さそうなグラフですが、先ほどと同様に念のため相関係数も出してみます。S&P500は2006年以降のデータしかないようなのですべてそれに揃えて計算しました。また、データは2006~2019までの約100個の前月比データで、多少欠損があり正確では無いですが、傾向の把握はできると思います。
やはりいずれについても黒点数と株価には相関は無さそうでした。しかし、日本の指標(TOPIX、日経)とアメリカの指標(S&P500、ダウ平均)についてはセオリー通り正の相関がありました。
まとめ
PythonのPandasを用いて黒点数と株価の関係を調べてみました。結果としては黒点数の変動と株価の変動に相関はありませんでした。