pythonで米国10年債長期金利とS&P500の相関係数を計算してグラフ化したのだが…
pythonの勉強がてら、米国10年債長期金利とS&P500の相関係数を計算してグラフ化してみた。
計算は月次ヒストリカルデータを対象時から遡ること60か月分。
np.corrcoefを用いて、計算した。
しかし、相関係数がこんなにも-1や1に近づくものなのだろうか。
何か間違っているような気もする。
Excelも使ってみたが、やはり同じグラフが描けた。
こんなものなのだろうか。
S&P500、米国債10年金利のデータも、標準化したうえで重ねてプロットしてみた。
まあ、相関係数とグラフの向きは概ね合っているような気はする。
使用データはこちら。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")
詳しい方いたら、アドバイスください!
もしよろしければサポートをよろしくお願いいたします!皆様にとって有意義な情報をこれからも発信して参ります。