まとめ消費者信頼感指数(Consumer Confidence Index、CCI)は、家計に「今後 1 年の景気はよくなるか」「大きな買い物をするのに良い時期か」などを尋ねたアンケートを指数にした景気指標で、個人消費の先行指標として見られます。このページでは FRED からミシガン大学版の UMCSENT を取り、diff(12) で前年同月との差(前年比)、さらにその diff() で前年比の月次変化を作ります。前年比が −5 未満かつ変化が −2 未満の月を「消費者心理が急に冷えた月」として axvline で帯を引き、同じ図に 0〜100 に正規化した S&P 500 を重ねて、帯の位置が株価の下落と重なるかを 1 枚で確認します。読み終えると、diff(n) の n を変えることで「水準」「前年比」「加速度」の 3 つの見方を同じ系列から作れることが分かります。
直感
#
消費者信頼感指数は 1966 年を 100 とした指数で、2017 年以降は 95〜100 前後で推移していました。この水準そのものより、投資家が気にするのは「急に悪化していないか」です。前年の同じ月と比べた差(前年比)を取ると季節のくせが消え、さらにその差を 1 か月前と比べると「悪化が加速している月」が分かります。CCI には全米産業審議委員会(Conference Board)版とミシガン大学版があり、通常はミシガン大学の速報値が先に出るため、ここではミシガン大学版 UMCSENT を使います。
UMCSENT を取得→
diff(12) で前年比→
diff() で前年比の変化→
前年比 < −5 かつ変化 < −2 の月を抽出→
axvline で帯→
正規化した S&P 500 と重ねる
FRED からデータを取り出す準備
#
関数 get_fred_data() は FRED データベース のページと同じもので、系列 ID を渡すと日付索引の DataFrame を返します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| import japanize_matplotlib
import numpy as np
import os
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from full_fred.fred import Fred
# FRED_API_KEY = os.getenv('FRED_API_KEY')
fred = Fred()
print(f"FRED APIキーが環境変数に設定されている:{fred.env_api_key_found()}")
def get_fred_data(name, start="2013-01-01", end=""):
df = fred.get_series_df(name)[["date", "value"]].copy()
df["date"] = pd.to_datetime(df["date"])
df["value"] = pd.to_numeric(df["value"], errors="coerce")
df = df.set_index("date")
if end == "":
df = df.loc[f"{start}":]
else:
df = df.loc[f"{start}":f"{end}"]
return df
|
FRED APIキーが環境変数に設定されている:True
消費者信頼感指数(UMCSENT)から前年比と変化を作る
#
ソース: University of Michigan: Consumer Sentiment
消費者のセンチメント(消費者マインド)をアンケートで調査して指数化した景気関連の経済指標です。CCI(Consumer Confidence Index)とも呼ばれています。一般的に個人消費やGDPとの相関性が高く、これらの先行指標として注目されています。 (出典:SMBC日興証券株式会社)
元データは Surveys of Consumers, University of Michigan で公開されている「Index of Consumer Sentiment」です。FRED では UMCSENT の ID で月次の値が取れます。
1
2
3
4
| start_date = "2017-01-01"
df_UMCSENT = get_fred_data("UMCSENT", start=start_date)
df_UMCSENT["前年比"] = df_UMCSENT["value"].diff(12)
df_UMCSENT["前年比変化"] = df_UMCSENT["前年比"].diff()
|
S&P 500 を 0〜100 に正規化する
#
ソース: Categories > Money, Banking, & Finance > Financial Indicators > Stock Market Indexes > S&P 500 | FRED
S&P 500 は 2,000〜4,000 ポイント、消費者信頼感指数は 50〜100 前後です。同じ縦軸に重ねるために、株価指数を最小 0・最大 100 に伸縮させます。
1
2
3
4
5
| df_SP500 = get_fred_data("SP500", start=start_date)
df_SP500["value"] -= df_SP500["value"].min()
df_SP500["value"] /= df_SP500["value"].max()
df_SP500["value"] *= 100
df_SP500["前月比"] = df_SP500["value"].diff(30)
|
4 本の線と「心理が冷えた月」の帯を重ねる
#
消費者信頼感指数の水準・前年比・前年比変化と、正規化した S&P 500 を 1 枚に描き、前年比が −5 を下回りかつ変化が −2 を下回った月に灰色の帯を引きます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| sns.set(rc={"figure.figsize": (15, 8)})
japanize_matplotlib.japanize()
# 折れ線グラフをプロット
sns.lineplot(data=df_UMCSENT, x="date", y="value", label="消費者信頼感指数", alpha=0.5)
sns.lineplot(data=df_SP500, x="date", y="value", label="SP500")
sns.lineplot(data=df_UMCSENT, x="date", y="前年比", label="消費者信頼感指数の前年比")
sns.lineplot(data=df_UMCSENT, x="date", y="前年比変化", label="消費者信頼感指数の前年比変化")
# 前年比との変化が大きいタイミングに線を引く
previous_down_date = df_UMCSENT.index[0]
for date, row in df_UMCSENT.iterrows():
if row["前年比変化"] < -2 and row["前年比"] < -5:
previous_down_date = date
plt.axvline(x=date, alpha=0.2, linewidth=12, color="k")
# plt.text(
# date + pd.DateOffset(10),
# -20,
# f'{date.strftime("%Y/%m/%d")}',
# rotation=90,
# )
plt.legend(fontsize=15, loc="upper left")
plt.show()
|

実行結果の読み方
#
灰色の帯は 2020 年 3〜4 月と 2022 年前半に集中しています。2020 年の帯では正規化した S&P 500(オレンジ)が 0 近くまで落ちており、消費者心理の急な冷え込みと株価の急落が同じ月に起きています。2022 年の帯ではインフレによる心理悪化が先に進み、株価の下落は帯より緩やかで、消費者信頼感指数が必ず株価に先行するわけではないことも同じ図から読めます。
使いどころと落とし穴
#
diff(12) が前年比になるのは月次で欠測が無いときだけで、FRED の UMCSENT のように毎月 1 行揃っている系列でないと 12 行前が 1 年前になりません。日次の SP500 に同じ diff(12) を当てると 12 営業日前との差になるので、頻度ごとに n を決め直します。正規化した S&P 500 は「この期間の最小が 0、最大が 100」という相対値なので、期間を 2010 年からに変えると 2020 年の底は 0 ではなくなり、帯との見た目の重なりも変わります。閾値 −5・−2 は 2017〜2023 年の図で見やすい値を手で選んだもので、別の期間や Conference Board 版の CCI(水準が 100〜130 と高い)では調整が必要です。
まとめ
#
消費者信頼感指数 UMCSENT は diff(12) で前年比、その diff() で前年比の変化という 2 つの派生系列を作ると、「前年より 5 ポイント以上低く、かつ 2 ポイント以上さらに悪化した月」を機械的に抜き出せます。S&P 500 は min-max 正規化で 0〜100 に揃えて同じ軸に重ね、axvline(linewidth=12, alpha=0.2) の帯で条件を満たす月を示しました。2020 年の帯は株価の底と一致し、2022 年の帯は株価より先に出ており、心理指標と株価の関係が局面によって違うことが 1 枚の図で確認できます。