Markets & Python & ...

機関投資家の卵がPythonのコードと共に金融マーケットについて浅くつぶやきます

東証REIT指数との相関関係

東証REIT指数と米国10年国債利回りの相関

昨年終わりまでは、この二つに逆相関の関係があると言われていた。

f:id:hiroshimaeasy:20200612221033p:plainf:id:hiroshimaeasy:20200612221054p:plainf:id:hiroshimaeasy:20200612221110p:plain
東証REIT指数米国債10年利回りの相関関係
(左)2019/7/12〜2019/10/31
(中)2019/10/31〜2020/2/19
(右)2020/2/20〜2020/6/11
をプロットした。 1年間の営業日を均等に3分割する為日付が中途半端になっているが、真ん中の時期が特にきれいに逆相関しているのが見てとれる。
理屈としては、米債金利が下がる→日本の金利も下がる→不動産業にとって金利低下は調達コスト削減の意味で追い風なのでREITが上昇する、というものだ。 しかしコロナショックを受け、その相関関係は崩れた。

東証REIT指数TOPIXの相関

教科書的に言えば、国債金利が上がると株価が上がり、金利が下がると株価が下がる。 その為REITと株との相関関係は、債券利回りのそれとほぼ似たものになるはずである。

f:id:hiroshimaeasy:20200612223227p:plainf:id:hiroshimaeasy:20200612223135p:plainf:id:hiroshimaeasy:20200612223236p:plain
東証REIT指数TOPIXの相関関係

ところが、2020/2/19までは同じようなプロットになっているものの、
コロナショックを反映したそれ以降の期間はほとんどTOPIXに順相関するようになった。

REITはボンドではなくエクイティ

f:id:hiroshimaeasy:20200612223256p:plain
1年間の推移

ボラティリティが小さい
・各銘柄が同じ動き方をする
・債券の動きと相関性が高い
ことからも準債券のようなポジションとして扱われていたJ-REITだが、コロナショックが我々に目を覚まさせることになった。
そう、これはエクイティなのだ。

事実として、ショックのあとは
ボラティリティが大きい
・銘柄ごとにパフォーマンスが異なる
・債券との相関が薄れ、株との相関が高まった
ことからそれまでと全く特性が異なる商品になってしまった。
果たして今後REITは準債券ではなく株の亜種になっていくのだろうか。

コードスニペット

株価などの時系列データは investing.comなどで取得してください。
時系列データの相関関係は特殊です。
今回は10日トレンドラインから原型データがどの位解離しているかを率で表し、アセットごとの標準偏差で割った数字で相関を出しています。

import pandas as pd
import numpy as np
import datetime
import statistics
import math
import matplotlib.pyplot as plt


# データの取得
reit_sheet = pd.read_csv('jreit_corr - JREIT.csv')
ust10_sheet = pd.read_csv('jreit_corr - UST10.csv')
topix_sheet = pd.read_csv('jreit_corr - TOPIX.csv')

# データのマージ
ru_merge_df = pd.merge(reit_sheet, ust10_sheet, on='date')
all_df = pd.merge(ru_merge_df, topix_sheet, on='date')

# 日付をdatetime型に変換
row_x = []
for d in all_df.date.values:
    row_x.append(datetime.datetime.strptime(d, '%Y/%m/%d'))

# プロット
row_y1 = all_df.JREIT.values
row_y2 = all_df.UST10.values
row_y3 = all_df.TOPIX.values

plt.figure(dpi=100)

fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax1.plot(row_x, row_y1, label="J-REIT Index", color="green")
ax1.plot(row_x, row_y3, label="TOPIX", color="red")
ax2.plot(row_x, row_y2, label="US 10 years bond rate")

ax1.legend()
ax2.legend(loc="lower left")
plt.show()

# 時系列データの相関係数を算出する為、原型データ÷トレンドラインのcolumnsを作る
all_df['J_rol'] = all_df['JREIT'].rolling(10).mean()
all_df['U_rol'] = all_df['UST10'].rolling(10).mean()
all_df['T_rol'] = all_df['TOPIX'].rolling(10).mean()

all_df['J_tpct'] = all_df['JREIT'] / all_df['J_rol']
all_df['U_tpct'] = all_df['UST10'] / all_df['U_rol']
all_df['T_tpct'] = all_df['TOPIX'] / all_df['T_rol']

# 母集団(ここでは*_tpct、つまりtrend_line/row_dataの列)の標準偏差を求める
jstdev = statistics.pstdev(all_df.J_tpct)
ustdev = statistics.pstdev(all_df.U_tpct)
tstdev = statistics.pstdev(all_df.T_tpct)
print("J-REITの標準偏差:" + str(jstdev))
print("US10年国債利回りの標準偏差:" + str(ustdev))
print("TOPIXの標準偏差:" + str(tstdev))

all_df['J_sd'] = all_df['J_tpct'] / jstdev
all_df['U_sd'] = all_df['U_tpct'] / ustdev
all_df['T_sd'] = all_df['T_tpct'] / tstdev

# 回帰分析のプロット(期間と用いるデータは自身で変えて見てみましょう)
import seaborn as sns


sns.lmplot(x="J_sd", y="T_sd", data=all_df[len(all_df)//3*2:],
           scatter_kws={'color':'indianred'},
           line_kws={'color':'indianred'})