見出し画像

pythonで米国10年債長期金利とS&P500の相関係数を計算してグラフ化したのだが…

pythonの勉強がてら、米国10年債長期金利とS&P500の相関係数を計算してグラフ化してみた。

計算は月次ヒストリカルデータを対象時から遡ること60か月分。

np.corrcoefを用いて、計算した。

しかし、相関係数がこんなにも-1や1に近づくものなのだろうか。

何か間違っているような気もする。

Excelも使ってみたが、やはり同じグラフが描けた。

こんなものなのだろうか。

画像1

S&P500、米国債10年金利のデータも、標準化したうえで重ねてプロットしてみた。

画像2

まあ、相関係数とグラフの向きは概ね合っているような気はする。

使用データはこちら。yahoo finance様に感謝。
それぞれ、Adj Closeのデータを使用。

pythonのコードはこちら。

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

#treasuryデータ読み込み
with open("Treasury_10y_monthly.csv", "r", encoding="utf-8") as f:
   reader1 = csv.reader(f)
   treasury = [r for r in reader1]

#sp500データ読み込み
with open("sp500_monthly.csv", "r", encoding="utf-8") as g:
   reader2 = csv.reader(g)
   sp500 = [r for r in reader2]

coefs = []  #相関係数 days = [] #日付

#日付データの格納
for h in range(60, len(treasury)-1):
   days.append(treasury[h][0])
   
#相関係数データの格納
for i in range(1, len(treasury)-60):

   x = []
   y = []

   for j in range(i, i+60):
       x.append(float(treasury[j][5])) #floatに変換して、Adj Closeを読み込み
       y.append(float(sp500[j][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(60, 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]

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[::20]) #x軸のtick間隔を20に設定
plt.setp(ax1.get_xticklabels(), rotation=90) #x軸tickを回転

plt.show()

fig.savefig("corr_sp500_treasury10y_60months_add.png", bbox_inches="tight")

詳しい方いたら、アドバイスください!


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