主要な経済指標をチェックする
数々の経済指標、断片を見るより過去からのトレンドを確認したいし、個々の指標だけでなく、複数の指標を横断的に見て全体感を把握したい。
ということで、いつくかの指標を一覧で確認できるツールを作りました。
(サムネをTikTok風にしてみました。)
取得できる情報は下図の通り。
このツールでは、FRBの目標とする「雇用の最大化」と「物価の安定」を意識し、中央に「金利」、左に「雇用」、右に「物価」を配置しました
(最終段の左下と右下には補足的に、「FRBのバランスシートとマネーストックの情報」と「ISM PMI」を加えています。)
それぞれのチャートの下には、「最新値と前回の値」を文字で表記し、チャートだけでなく数値でも確認できるようにしました。また、「更新スパンと更新日付」を記載し、いつ更新されたのか?いつ更新されるのか?が把握できるようにしました。
1.ライブラリのインストール
pip install japanize_matplotlib
pip install yfinance
pip install quandl
2.データ取得1(PMI)
import quandl
import datetime
# 開始・終了日の設定
# データ取得期間1000日前まで
start = datetime.date.today() - datetime.timedelta(days=1000)
end = datetime.date.today()
# 前年比を出すデータは1年長く取得
start2 = start - datetime.timedelta(days=(365))
# PMIデータ取得
df_pmi = quandl.get("ISM/MAN_PMI",start_date=start, end_date=end)
df_pmi_bkl = quandl.get("ISM/MAN_BACKLOG",start_date=start, end_date=end)
df_pmi_cus = quandl.get("ISM/MAN_CUSTINV",start_date=start, end_date=end)
2.データ取得2(FRED)
import matplotlib.pyplot as plt
import pandas as pd
import pandas_datareader.data as web
from matplotlib import gridspec
import japanize_matplotlib
%matplotlib inline
# イールドカーブ作成データ取得
df_rate_t = web.DataReader(["DGS1","DGS2","DGS5","DGS10","DGS20","DGS30"], "fred", start, end)
# チャートをきれいにするため空データ削除
df_rate_t=df_rate_t.dropna()
# 失業率
df_unrate = web.DataReader(["UNRATE"], "fred", start, end)
# 新規失業保険申請件数
df_icsa = web.DataReader(["ICSA"], "fred", start, end)
# BEI
df_rate = web.DataReader(["T5YIE","T5YIFR","DGS5","DFII5"], "fred", start, end)
df_rate = df_rate.dropna()
# PCE
df_tmp = web.DataReader(["PCEPILFE","PCEPI"], "fred", start2, end)
df_pce = df_tmp.pct_change(12)*100 #12ヶ月前と比較
# CPI
df_tmp = web.DataReader(["CPILFESL","CPIAUCSL"], "fred", start2, end)
df_cpi = df_tmp.pct_change(12)*100 #12ヶ月前と比較
# FRB バランスシート
df_bs = web.DataReader(["WALCL"], "fred", start, end)
# M2
df_m2 = web.DataReader(["WM2NS"], "fred", start, end)
#カラム名変更
df_rate.rename(columns={'T5YIE':'5Y BEI','T5YIFR':'5Y FIER','DFII5':'実質:5Y','DGS5':'名目:5Y'},inplace=True)
df_pce.rename(columns={'PCEPILFE':'PCEコア','PCEPI':'PCE'},inplace=True)
df_cpi.rename(columns={'CPILFESL':'CPIコア','CPIAUCSL':'CPI'},inplace=True)
df_bs.rename(columns={'WALCL':'FRB Assets'},inplace=True)
3.グラフ描画
###表示領域を9個分割し割合を設定###
fig = plt.figure(facecolor='#FAFAFA',figsize=(12,8),tight_layout=True)#
spec = gridspec.GridSpec(ncols=3, nrows=3,height_ratios=[1,1,1],width_ratios=[1,1,1])
###9個分割した領域を割り当て###
ax1 = fig.add_subplot(spec[0,0])
ax2 = fig.add_subplot(spec[0,1])
ax3 = fig.add_subplot(spec[0,2])
ax4 = fig.add_subplot(spec[1,0])
ax5 = fig.add_subplot(spec[1,1])
ax6 = fig.add_subplot(spec[1,2])
ax7 = fig.add_subplot(spec[2,0])
ax8 = fig.add_subplot(spec[2,1])
ax9 = fig.add_subplot(spec[2,2])
###チャートを作成する処理###
ax1.plot(df_unrate, alpha=0.9)
ax2.plot(df_rate.index, df_rate.iloc[:,2] ,alpha=0.7,label=df_rate.columns[2])
ax2.plot(df_rate.index, df_rate.iloc[:,3] ,alpha=0.7,label=df_rate.columns[3])
# ax2.plot(df_rate.index, df_rate.iloc[:,1] ,alpha=0.7,label=df_rate.columns[1])
# ax2.plot(df_rate.index, df_rate.iloc[:,0] ,alpha=0.7,label=df_rate.columns[0])
ax3.plot(df_pce.index, df_pce.iloc[:,0] ,alpha=0.9,label=df_pce.columns[0])
ax3.plot(df_pce.index, df_pce.iloc[:,1] ,alpha=0.9,label=df_pce.columns[1])
ax4.plot(df_icsa, alpha=0.9)
ax6.plot(df_cpi.index, df_cpi.iloc[:,0] ,alpha=0.9,label=df_cpi.columns[0])
ax7.plot(df_bs ,alpha=0.9, label="FRB Assets")
ax6.plot(df_cpi.index, df_cpi.iloc[:,1] ,alpha=0.9,label=df_cpi.columns[1])
ax8.plot(df_rate.index, df_rate.iloc[:,0] ,alpha=0.7,label=df_rate.columns[0])
ax8.plot(df_rate.index, df_rate.iloc[:,1] ,alpha=0.7,label=df_rate.columns[1])
ax9.plot(df_pmi ,alpha=0.9, label="PMI")
ax9.plot(df_pmi_bkl["Index"] ,alpha=0.5, label="backlog")
ax9.plot(df_pmi_cus["Index"] ,alpha=0.5, label="cust_inv")
##イールドカーブ作成処理####
ax5.plot([10,20,30,50,100,150], df_rate_t.iloc[-1,[0,1,2,3,4,5]], color="red" ,alpha=0.8, label="now")
ax5.plot([10,20,30,50,100,150], df_rate_t.iloc[-20,[0,1,2,3,4,5]], color="gray" ,alpha=0.9,label="-20 days")
ax5.plot([10,20,30,50,100,150], df_rate_t.iloc[-60,[0,1,2,3,4,5]], color="gray" ,alpha=0.4,label="-60 days")
##金利の長さ合わせて幅を調整###
ax5.set_xticks([10,20,30,50,100,150])
##2年のメモリは幅の関係で省略###
ax5.set_xticklabels(["1y","2y","5y","10y","20y","30y"])
ax10 = ax5.twinx()
df_rate_t_h5=df_rate_t.iloc[-1] - df_rate_t.iloc[-20]
ax10.bar([10,20,30,50,100,150], df_rate_t_h5,color="gray",width=5 ,alpha=0.1)
ax11 = ax7.twinx()
ax11.plot(df_m2 ,alpha=0.9, label="M2",color="orange" )
ax1.set_title('失業率', fontsize=18)
ax2.set_title('金利', fontsize=18)
ax3.set_title('PCE', fontsize=18)
ax4.set_title('新規失業保険申請件数', fontsize=18)
ax5.set_title('イールドカーブ', fontsize=18)
ax6.set_title('CPI', fontsize=18)
ax7.set_title('FRB Assets (& M2)', fontsize=18)
ax8.set_title('金利', fontsize=18)
ax9.set_title('PMI', fontsize=18)
# ##不要な軸メモリを削除###
ax1.axes.xaxis.set_visible(False)
ax2.axes.xaxis.set_visible(False)
ax3.axes.xaxis.set_visible(False)
ax4.axes.xaxis.set_visible(False)
ax6.axes.xaxis.set_visible(False)
ax7.axes.xaxis.set_visible(False)
ax9.axes.xaxis.set_visible(False)
##最終行のみ軸メモリを表示###
ax5.tick_params(axis='x', labelrotation=45)
ax8.tick_params(axis='x', labelrotation=45)
fig.patch.set_facecolor('#e9e4d5')
ax1.patch.set_facecolor('#FEFEFE')
ax2.patch.set_facecolor('#FEFEFE')
ax3.patch.set_facecolor('#FEFEFE')
ax4.patch.set_facecolor('#FEFEFE')
ax5.patch.set_facecolor('#FEFEFE')
ax6.patch.set_facecolor('#FEFEFE')
ax7.patch.set_facecolor('#FEFEFE')
ax8.patch.set_facecolor('#FEFEFE')
ax9.patch.set_facecolor('#FEFEFE')
ax2.legend(loc='best', borderaxespad=0.5,fontsize=10)
ax3.legend(loc='best', borderaxespad=0.5,fontsize=10)
ax5.legend(loc='best', borderaxespad=0.5,fontsize=10)
ax6.legend(loc='best', borderaxespad=0.5,fontsize=10)
ax7.legend(loc='best', borderaxespad=0.5,fontsize=10)
ax11.legend(loc=4, borderaxespad=0.5,fontsize=10)
ax8.legend(loc='best', borderaxespad=0.5,fontsize=10)
ax9.legend(loc='best', borderaxespad=0.5,fontsize=10)
ax2.axhline(0 ,color='gray',linewidth=1 ,alpha=0.3)
ax3.axhline(2 ,color='gray',linewidth=1 ,alpha=0.3)
ax6.axhline(2 ,color='gray',linewidth=1 ,alpha=0.3)
ax8.axhline(0 ,color='gray',linewidth=1 ,alpha=0.3)
ax9.axhline(50 ,color='gray',linewidth=1 ,alpha=0.3)
ax1.text(0.05, -0.02,"毎月第1金曜日",
horizontalalignment='left', verticalalignment='top',transform=ax1.transAxes, fontsize=12,color="gray")
ax3.text(0.05, -0.02,"毎月月末",
horizontalalignment='left', verticalalignment='top',transform=ax3.transAxes, fontsize=12,color="gray")
ax4.text(0.05, -0.02,"毎週木曜日",
horizontalalignment='left', verticalalignment='top',transform=ax4.transAxes, fontsize=12,color="gray")
ax6.text(0.05, -0.02,"毎月10〜13日",
horizontalalignment='left', verticalalignment='top',transform=ax6.transAxes, fontsize=12,color="gray")
ax7.text(0.05, -0.02,"毎週木曜日",
horizontalalignment='left', verticalalignment='top',transform=ax7.transAxes, fontsize=12,color="gray")
ax9.text(0.05, -0.02,"毎月月初の営業日",
horizontalalignment='left', verticalalignment='top',transform=ax9.transAxes, fontsize=12,color="gray")
ax1.text(0.55, -0.02,
df_unrate.index[-2].strftime('%m/%d')+' : '+
str(round(df_unrate.iloc[-2,0],2))+" %",
horizontalalignment='left', verticalalignment='top',transform=ax1.transAxes, fontsize=12,color="gray")
ax1.text(0.55, -0.15,
df_unrate.index[-1].strftime('%m/%d')+' : '+
str(round(df_unrate.iloc[-1,0],2))+" %",
horizontalalignment='left', verticalalignment='top',transform=ax1.transAxes, fontsize=12,color="gray")
ax4.text(0.55, -0.02,
df_icsa.index[-2].strftime('%m/%d')+' : '+
str(round(df_icsa.iloc[-2,0],2))+" ",
horizontalalignment='left', verticalalignment='top',transform=ax4.transAxes, fontsize=12,color="gray")
ax4.text(0.55, -0.15,
df_icsa.index[-1].strftime('%m/%d')+' : '+
str(round(df_icsa.iloc[-1,0],2))+" ",
horizontalalignment='left', verticalalignment='top',transform=ax4.transAxes, fontsize=12,color="gray")
ax3.text(0.55, -0.02,
df_pce.index[-2].strftime('%m/%d')+' : '+
str(round(df_pce.iloc[-2,1],2))+" %",
horizontalalignment='left', verticalalignment='top',transform=ax3.transAxes, fontsize=12,color="gray")
ax3.text(0.55, -0.15,
df_pce.index[-1].strftime('%m/%d')+' : '+
str(round(df_pce.iloc[-1,1],2))+" %",
horizontalalignment='left', verticalalignment='top',transform=ax3.transAxes, fontsize=12,color="gray")
ax6.text(0.55, -0.02,
df_cpi.index[-2].strftime('%m/%d')+' : '+
str(round(df_cpi.iloc[-2,1],2))+" %",
horizontalalignment='left', verticalalignment='top',transform=ax6.transAxes, fontsize=12,color="gray")
ax6.text(0.55, -0.15,
df_cpi.index[-1].strftime('%m/%d')+' : '+
str(round(df_cpi.iloc[-1,1],2))+" %",
horizontalalignment='left', verticalalignment='top',transform=ax6.transAxes, fontsize=12,color="gray")
ax7.text(0.55, -0.02,
df_bs.index[-2].strftime('%m/%d')+' : '+
str(round(df_bs.iloc[-2,0],2))+"",
horizontalalignment='left', verticalalignment='top',transform=ax7.transAxes, fontsize=12,color="gray")
ax7.text(0.55, -0.15,
df_bs.index[-1].strftime('%m/%d')+' : '+
str(round(df_bs.iloc[-1,0],2))+"",
horizontalalignment='left', verticalalignment='top',transform=ax7.transAxes, fontsize=12,color="gray")
ax9.text(0.55, -0.02,
df_pmi.index[-2].strftime('%m/%d')+' : '+
str(round(df_pmi.iloc[-2,0],2))+" %",
horizontalalignment='left', verticalalignment='top',transform=ax9.transAxes, fontsize=12,color="gray")
ax9.text(0.55, -0.15,
df_pmi.index[-1].strftime('%m/%d')+' : '+
str(round(df_pmi.iloc[-1,0],2))+" %",
horizontalalignment='left', verticalalignment='top',transform=ax9.transAxes, fontsize=12,color="gray")
plt.show()
# ここまで
以上です。
経済指標を確認する手間の軽減や、全体感の把握に役立てば幸いです。
では!
「缶コーヒー1杯、ご馳走してあげよう」という太っ腹な人は投げ銭を!
課金しなくても、参考になったら「ハートボタン、フォロー、リツイート」をお願いします。読まれる可能性があがるので、次の記事を書くやる気が出ます。
特に、現時点での予定はありませんが、何かしらのバージョンアップがあれば、課金してくれた方へのコンテンツで更新していこうと思います。
ここから先は
9,769字
/
1画像
¥ 100
この記事が気に入ったらチップで応援してみませんか?