東証REIT指数との相関関係
東証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と株との相関関係は、債券利回りのそれとほぼ似たものになるはずである。
ところが、2020/2/19までは同じようなプロットになっているものの、
コロナショックを反映したそれ以降の期間はほとんどTOPIXに順相関するようになった。
REITはボンドではなくエクイティ
・ボラティリティが小さい
・各銘柄が同じ動き方をする
・債券の動きと相関性が高い
ことからも準債券のようなポジションとして扱われていた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'})
雇用統計ショックの真相
雇用統計ショック
債券市場ではこの2020/6/5発表の米国雇用統計が「雇用統計ショック」と言われるほど、インパクトのあるサプライズであった。
米国雇用統計が発表される2日前にADP雇用報告という民間企業による雇用統計を予想する数値の発表がある。個人的にはADPはあまりあてにならないと思っているのだけど、一部ではこれもマーケットの材料になっていて実際に本物の雇用統計が発表される前にADPでマーケットがインパクトを受けることもしばしばある。
そこで、ADPの予測値と本物の統計局の発表にどの程度の乖離があるのか、公式Webサイトから簡単にデータが手に入る範囲で2002年4月からプロットしてみたところこのようになった。比較しているのはFOMCが金融政策決定の材料にする大きな要因の一つ、非農業者部門雇用者数のうち、実数だ。
今回の雇用統計で、いかに想像を超えるポジティブな数字(債券市場にとっては価格の下落、金利の上昇を招く)が出たかが一目でわかるだろう。
実際に米国債10年利回りはサプライズ直後に0.9%を越える水準まで上昇したが、どうも今回のポジティブサプライズは特殊要因によるもののようだ、ということを確認して現在は発表前の水準以下に戻っている。
雇用統計サプライズの特殊要因
経済ジャーナリスト伊藤洋一氏によれば、
1. アメリカ政府が雇用維持を条件に 6600 億ドル(約 72 兆円)という巨額の枠を設けて従業員への給与支払いを企業から肩代わりする異例の資金供給を行った。この枠の中では企業は従業員の再雇用でも資金を受け取れるため、企業は一時解雇していた従業員を大規模にリコール(呼び戻した)した
2. 休業を余儀なくされていたレストランやバーが各州での経済活動再開の動きに合わせて従業員を大規模に戻した。5 月に増えた雇用 250 万のうちの約半分(137 万人)はこの分野で生じた雇用だ
3. 建設、サービスなどは広い業種で再雇用の動きが出たが、特に歯科医師業界がスタッフを大規模に再雇用し、その数は全体 250 万人の約 10%に達した
ということらしい。
なので過度に楽観視出来ない、というのが今回の雇用統計ショックの実情なのでしょう。
コードスニペット
データは自分で収集してcsvなり何なりに収める必要がありますが、グラフを描くコードスニペットだけ掲載しておきます。
import pandas as pd import numpy as np import datetime import matplotlib.pyplot as plt sheet = pd.read_csv('us_employ - abs_data.csv') df = pd.DataFrame(sheet) x = [] for d in df[df.columns[0]].values: x.append(datetime.datetime.strptime(d, '%Y/%m')) y1 = list(df[df.columns[3]].values) y2 = [0] * len(x) plt.figure(dpi=120) plt.fill_between(x, y1, label="NFP gap between ADP and LSB") plt.plot(x, y2) plt.legend() plt.show()