見出し画像

日次データでもpythonで米国10年債長期金利とS&P500の相関係数を計算してグラフ化してみた

前回、月次データを使ってS&P500と米国10年債金利の相関係数を計算してみた。(60か月間の相関係数)

ここで今回は日次データでも計算してみた。

対象期間は2000日間。

そんなに長くて大丈夫か、という感も否めないが、60日間とかで計算すると、グラフがとんでもないことになってしまった。

そんなわけで2000日間。

結論、月次データのときとさほど変わらない結果が得られた。

使用データはこちら。相変わらずyahoo finance様には感謝します。

結果はこちら

画像1

それにしても40年間でのS&P500の上げ具合は凄まじいですね……
今度TOPIXか日経平均と重ねて描いてみよう。

コードはこちら。詳しい方アドバイスください……

import numpy as np
import csv
import matplotlib.pyplot as plt

#treasuryデータの取り込み
with open("Treasury_10y_daily.csv", "r", encoding="utf-8") as f:
   reader1 = csv.reader(f)
   treasury = [r for r in reader1 if r[5] != "null"] #nullを削除
   
#sp500データの取り込み
with open("sp500_daily.csv", "r", encoding="utf-8") as g:
   reader2 = csv.reader(g)
   sp500 = [r for r in reader2]
   
d = 2000 #計算期間を設定

coefs = []
days = []

for h in range(d, len(treasury)-1):
   days.append(treasury[h][0])
   
for i in range(1, len(treasury)-d):
   
   x = []
   y = []

   for j in range(i, i+d):
       x.append(float(treasury[j][5])) #floatに変換して、Adj Closeを読み込み
       y.append(float(sp500[j+len(sp500)-len(treasury)][5])) #floatに変換して、Adj Closeを読み込み + データの開始地点調整
       
   x_np = np.array(x)
   y_np = np.array(y)

   coef = np.corrcoef(x, y) #相関係数を計算

   coefs.append(coef[0,1])
   
#対象期間の指数データ抽出
sp500_actual = []
treasury_actual = []

for i in range(d, len(treasury)-1):
   sp500_actual.append(float(sp500[i][5]))
   treasury_actual.append(float(treasury[i][5]))

#対象期間の指数最大値出力
max_sp500 = max(sp500_actual)
max_treasury = max(treasury_actual)   

#100をmaxとして標準化
sp500_standard = [100 * i / max_sp500 for i in sp500_actual]
treasury_standard = [100 * i / max_treasury for i in treasury_actual]

#figureの設定
fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)

ax1.grid(True)
ax1.set_xlabel("Day")
ax1.set_ylabel("Corrcoef")
ax1.set_title("Correlation coefficient between s&p500 and 10-year_treasury_interest_rate")

ax2 = ax1.twinx() #2軸目を設定

ln1 = ax1.plot(days, coefs, "C0", label="corr")
ln2 = ax2.plot(days, sp500_standard, "C1", label="sp500")
ln3 = ax2.plot(days, treasury_standard, "C2", label="treasury")

ax2.set_ylabel("s&p500 , treasury_10y (standard)")

h1, l1 = ax1.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()
ax1.legend(h1+h2, l1+l2, bbox_to_anchor=(1.13, 1), loc="upper left") #legendの位置を設定

plt.xticks(days[::1000]) #x軸のtick間隔を20に設定
plt.setp(ax1.get_xticklabels(), rotation=90) #x軸tickを回転

plt.show()

#figureの保存
fig.savefig("corr_sp500_treasury10y_60days_add.png", bbox_inches="tight")



もしよろしければサポートをよろしくお願いいたします!皆様にとって有意義な情報をこれからも発信して参ります。