日次データでもpythonで米国10年債長期金利とS&P500の相関係数を計算してグラフ化してみた
前回、月次データを使ってS&P500と米国10年債金利の相関係数を計算してみた。(60か月間の相関係数)
ここで今回は日次データでも計算してみた。
対象期間は2000日間。
そんなに長くて大丈夫か、という感も否めないが、60日間とかで計算すると、グラフがとんでもないことになってしまった。
そんなわけで2000日間。
結論、月次データのときとさほど変わらない結果が得られた。
使用データはこちら。相変わらずyahoo finance様には感謝します。
結果はこちら
それにしても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")
もしよろしければサポートをよろしくお願いいたします!皆様にとって有意義な情報をこれからも発信して参ります。