見出し画像

【Python】【経済指標】ISMデータを取得して描画する

ISMとは、全米供給管理協会(ISM : Institute for Supply Management )が公表している製造業景況指数のことで、ISM製造業景況指数と呼ばれます。アメリカにおける製造業の景況感を表す指標として広く用いられています。速報性が高く、市場で注目されます。毎月、製造業の購買担当者と非製造業者(サービス)の購買担当者を対象として、アンケートにより前月比で改善したかが指数化されます。

景気サイクルの転換期を示す先行指標としての精度が高いことから、ISMはアメリカ市場における最重要指標の1つとみなされています。毎月第1営業日公表と、米雇用統計などの主要指標よりも早く公表される速報性も注目を集める理由です。

インデックスは、50をボーダーラインとして判断します。数値が50を超えていれば景気拡大下回れば景気後退を示唆すると言われています。

また長期金利との関係も見逃せない点のようです。

また債券市場は、ISM製造業景況指数に対して、かなり敏感に反応します。この数字が事前予想に比べて強いと、ほぼ例外なく債券が売られます。つまり金利が上昇します。米国の長期金利は、ISM製造業景況指数に対して70%程度の相関性があると言われています。数字とマーケットの関係を整理すると、50以上が続くと金利に上昇圧力がかかってきます。結果、債券は売られやすく、株式は買われやすくなります。そして、45~50が債券にとって居心地の良い水準で、債券が買われて金利が低下します。特に45以下になると債券への投資意欲が強まり、債券価格が大きく上昇する一方、金利が大きく低下します。

世界インフレ時代の経済指標 エミン・ユルマズ著


ここでは、IMSデータの取得と描画を学んでいきます。

なお、最低限のポイントのみの説明にするため、Pythonライブラリ、モジュール等のインストール方法については割愛させて頂きます。お使いのPC環境等に合わせてインストールしてもらえればと思います。


1.ISM製造業景況指数を取得する

アメリカにおける製造業の景況感を分析するには、pandasのDataFrameオブジェクトにデータを用意する必要があります。ここでは、ISM製造業景況指数Quandlから取得していきます。Quandlのライブラリを使うことで金融、経済に関するデータを取得できます。データの取得期間は、2000年1月1日から現在の日付までです。

import pandas_datareader.data as web
import quandl
import datetime

# 2000/1/1から現在まで
start = '2000-01-01'
end = datetime.date.today()

# PMIデータ取得
df_pmi = quandl.get("ISM/MAN_PMI",start_date=start, end_date=end)

グラフ上にボーダーライン 50 のラインを引くため、値50を格納したデータフレームを作成します。

# ボーダーライン 50のデータフレームを作成
df_y = df_pmi.copy()
df_y['PMI'] = 50


2.ISM製造業景況指数を描画

# データのグラフ表示
plt.figure(figsize=(12, 6))
plt.plot(df_pmi.index, df_pmi['PMI'])
plt.xlabel('Date')
plt.ylabel('PMI Index')
plt.title('ISM Manufacturing PMI')
plt.grid(True)
plt.show()


次に、plotlyを使って描画していきます。plotlyについては、以前に描画方法と見た目に関わる設定について投稿しているので参考にしてもらえればと思います。


# グラフィック系ライブラリ
import plotly.graph_objects as go  # グラフ表示関連ライブラリ
import plotly.io as pio  # 入出力関連ライブラリ
pio.renderers.default = 'iframe'

# グラフの実体trace オブジェクトを生成
scatter_trace_1 = go.Scatter(
    x=df_pmi.index,
    y=df_pmi['PMI'],
    mode='lines',
    line=dict(color='red', width=5),
)

# グラフの実体trace オブジェクトを生成。ボーダーライン50の描画のため
y_trace = go.Scatter(
    x=df_y.index,
    y=df_y['PMI'],
    mode='lines',
    line=dict(color='grey', width=2, dash='dash'),
)


# レイアウトオブジェクトを生成
graph_layout = go.Layout(

    # 凡例は消去
    showlegend=False,
    
    # 幅と高さの設定
    width=800, height=500,
    
    # タイトルの設定
    title=dict(
        text='ISM Manufacturing PMI', # タイトル
        font=dict(family='Times New Roman', size=20, color='grey'), # フォントの指定
        xref='paper', # container or paper
        x=0.5,
        y=0.87,
        xanchor='center',
    ),
    
    # y軸の設定
    yaxis=dict(
        # y軸のタイトルの設定
        title=dict(text='Index', font=dict(family='Times New Roman', size=20, color='grey')),
        range=[30,70] # 軸の範囲の設定
    ),
    
    # 凡例の設定
    legend=dict(
        xanchor='left',
        yanchor='bottom',
        x=0.02,
        y=0.7,
        orientation='v',
        bgcolor='white',
        bordercolor='grey',
        borderwidth=1,
    ),
)


# 描画領域である figure オブジェクトの作成                    
fig = go.Figure(layout=graph_layout)


# add_trace()メソッドでグラフの実体を追加
fig.add_trace(scatter_trace_1)
fig.add_trace(y_trace)


# レイアウトの更新
fig.update_layout(
    plot_bgcolor='white', # 背景色を白に設定
)



# 軸の設定
# linecolorを設定して、ラインをミラーリング(mirror=True)して枠にする
fig.update_xaxes(linecolor='black', linewidth=1, mirror=True)
fig.update_yaxes(linecolor='black', linewidth=1, mirror=True)

# ticks='inside':目盛り内側, tickcolor:目盛りの色, tickwidth:目盛りの幅、ticklen:目盛りの長さ
fig.update_xaxes(ticks='inside', tickcolor='black', tickwidth=1, ticklen=5)
fig.update_yaxes(ticks='inside', tickcolor='black', tickwidth=1, ticklen=5)

# gridcolor:グリッドの色, gridwidth:グリッドの幅、griddash='dot':破線
fig.update_xaxes(gridcolor='lightgrey', gridwidth=1, griddash='dot')
fig.update_yaxes(gridcolor='lightgrey', gridwidth=1, griddash='dot')

# tick0:初期軸目盛り, dtick:軸目盛り間隔
fig.update_xaxes(dtick='M12')  # 12カ月ごと
fig.update_yaxes(tick0=0 , dtick=5)

# 軸の文字サイズ変更
fig.update_xaxes(tickfont=dict(size=15, color='grey'))
fig.update_yaxes(tickfont=dict(size=15, color='grey'))


# show()メソッドでグラフを描画
fig.show()


3.ISM製造業景況指数と長期金利との関係を描画する

以前投稿した金利データ取得描画を参考にして、ISM製造業景況指数と長期金利との関係を描画します。

import pandas_datareader.data as web
import quandl
import datetime

# 2018/1/1から現在まで
start = '2010-01-01'
end = datetime.date.today()

# PMIデータ取得
df_pmi = quandl.get("ISM/MAN_PMI", start_date=start, end_date=end)

# 米国市場国債データ取得
df_rate_dgs = web.DataReader(['DGS10'], 'fred', start, end)
df_rate_dgs = df_rate_dgs.dropna() # 空データ削除


●plotlyでグラフを描画
※2つ目の軸を表示するためには、下記の"secondary_y" を True にすることで可能になります。fig = make_subplots(specs=[[{"secondary_y": True}]])
また、グラフを書く際の記述の追加として、各グラフに "secondary_y"を Trueにするか、Falseにするかを加えます。 Trueにすると第2軸に、Falseにすると第1軸となります。

import plotly.graph_objects as go  # グラフ表示関連ライブラリ
import plotly.io as pio  # 入出力関連ライブラリ
pio.renderers.default = 'iframe'

# subplot
from plotly.subplots import make_subplots


# グラフの実体trace オブジェクトを生成
pmi_trace = go.Scatter(
    x=df_pmi.index,
    y=df_pmi['PMI'],
    mode='lines',
    line=dict(color='red', width=5),
    name='ISM Manufacturing PMI'
)

# グラフの実体となる trace オブジェクトを生成
rate_dgs_trace = go.Scatter(
    x=df_rate_dgs.index,
    y=df_rate_dgs['DGS10'],
    mode='lines',
    line={'color':'blue', 'width':4},
    name='10-Year Treasury Constant Maturity Rate'
)

# 2つ目の軸を表示する設定
fig = make_subplots(specs=[[{"secondary_y": True}]])

# 描画領域である figure オブジェクトの作成                  
fig.add_trace(pmi_trace, secondary_y=False)  # 第1軸に設定(secondary_y=False)
fig.add_trace(rate_dgs_trace, secondary_y=True)  # 第2軸に設定(secondary_y=True)


# レイアウトの更新
fig.update_layout(
    
    # 凡例は消去
    showlegend=True,
    
    # 幅と高さの設定
    width=900,height=600,
    
    # タイトルの設定
    title=dict(
        text='ISM製造業景況指数と米長期金利の関係', # タイトル
        font=dict(family='Times New Roman', size=20, color='grey'), # フォントの指定
        xref='paper', # container or paper
        x=0.5,
        y=0.87,
        xanchor='center',
    ),
    
    plot_bgcolor='white', # 背景色を白に設定

    # 凡例の設定
    legend=dict(
        xanchor='right',
        yanchor='bottom',
        x=0.5,
        y=0.85,
        orientation='v',
        bgcolor='white',
        bordercolor='grey',
        borderwidth=1,
    ),
    
),

# 軸の設定
fig.update_yaxes(title='Index', secondary_y=False)
fig.update_yaxes(title='Treasury Constant Maturity Rate', secondary_y=True)


# linecolorを設定して、ラインをミラーリング(mirror=True)して枠にする
fig.update_xaxes(linecolor='black', linewidth=1, mirror=True)
fig.update_yaxes(linecolor='black', linewidth=1, mirror=True)

fig.update_xaxes(linecolor='black', linewidth=1, mirror=True)
fig.update_yaxes(linecolor='black', linewidth=1, mirror=True)


# ticks='inside':目盛り内側, tickcolor:目盛りの色, tickwidth:目盛りの幅、ticklen:目盛りの長さ
fig.update_xaxes(ticks='inside', tickcolor='black', tickwidth=1, ticklen=5)
fig.update_yaxes(ticks='inside', tickcolor='black', tickwidth=1, ticklen=5)

fig.update_xaxes(ticks='inside', tickcolor='black', tickwidth=1, ticklen=5)
fig.update_yaxes(ticks='inside', tickcolor='black', tickwidth=1, ticklen=5)


# gridcolor:グリッドの色, gridwidth:グリッドの幅、griddash='dot':破線
fig.update_xaxes(gridcolor='lightgrey', gridwidth=1, griddash='dot')
fig.update_yaxes(gridcolor='lightgrey', gridwidth=1, griddash='dot')

fig.update_xaxes(gridcolor='lightgrey', gridwidth=1, griddash='dot')
fig.update_yaxes(gridcolor='lightgrey', gridwidth=1, griddash='dot')


# tick0:初期軸目盛り, dtick:軸目盛り間隔
fig.update_xaxes(dtick='M12')  # 12カ月ごと

# 軸の文字サイズ変更
fig.update_xaxes(tickfont=dict(size=14, color='grey'))
fig.update_yaxes(tickfont=dict(size=18, color='grey'))

# show()メソッドでグラフを描画
fig.show()

米長期金利は、ISM製造業景況指数とある程度の相関関係がありそうです。

今回は、株式投資において重要なアメリカにおける製造業の景況感に関するデータを取得して、plotlyを用いてデータの可視化を行いました。今後は、他の経済指標と合わせた分析を行っていきたいと思います。



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