見出し画像

主要な経済指標をチェックする

数々の経済指標、断片を見るより過去からのトレンドを確認したいし、個々の指標だけでなく、複数の指標を横断的に見て全体感を把握したい。

ということで、いつくかの指標を一覧で確認できるツールを作りました。
(サムネをTikTok風にしてみました。)

取得できる情報は下図の通り。

画像1

このツールでは、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

この記事が気に入ったらサポートをしてみませんか?