Inflation survey indicators #

This category group features point-in-time survey scores related to inflation expectations, typically for the for the upcoming twelve months. At present it contains only household surveys.

Household inflation expectations scores #

Ticker : HHINFESCORE_NSA

Label : Household CPI inflation expectations, 1-year ahead, z-score.

Definition : Household CPI inflation expectations, 1-year ahead, z-score.

Notes :

  • Household inflation expectations are collected through surveys as expectations of CPI growth for the next 12 months. Countries publish this information as a percentage or as a diffusion index.

  • Both methodologies are made compatible through the calculation of scores based on past expanding data samples in order to replicate the market’s information state on survey readings. For in-depth explanation of how the z-scores are computed, please read Appendix 2 .

  • All survey indices used for this metric are summarized in Appendix 3 .

Changes in household inflation expectations #

Ticker : HHINFESCORE_NSA_D1M1ML1 / _D1Q1QL1 / _D3M3ML3

Label : Change in household inflation expectation score: diff m/m / diff q/q / diff 3m/3m

Definition : Change in household inflation expectation score: latest month over one month ago / latest quarter over one quarter ago / latest three months over the previous three months.

Notes :

  • This quantamental indicator measures the difference between the expectations of the latest period versus previous period according to the concurrent data vintage. For instance, a score that goes from 0.8 to 0.9 between periods will show an increase of 0.1.

  • Currency areas with monthly frequency surveys print monthly changes (_D1M1ML1 and _D3M3ML3), and areas with quarterly frequency provide only quarterly changes (_D1Q1QL1).

Imports #

Only the standard Python data science packages and the specialized macrosynergy package are needed.

import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import math

import json
import yaml

import macrosynergy.management as msm
import macrosynergy.panel as msp
import macrosynergy.signal as mss
import macrosynergy.pnl as msn


from macrosynergy.download import JPMaQSDownload

from timeit import default_timer as timer
from datetime import timedelta, date, datetime

import warnings

warnings.simplefilter("ignore")

The JPMaQS indicators we consider are downloaded using the J.P. Morgan Dataquery API interface within the macrosynergy package. This is done by specifying ticker strings , formed by appending an indicator category code <category> to a currency area code <cross_section> . These constitute the main part of a full quantamental indicator ticker, taking the form DB(JPMAQS,<cross_section>_<category>,<info>) , where <info> denotes the time series of information for the given cross-section and category.

The following types of information are available:

  • value giving the latest available values for the indicator

  • eop_lag referring to days elapsed since the end of the observation period

  • mop_lag referring to the number of days elapsed since the mean observation period

  • grade denoting a grade of the observation, giving a metric of real time information quality.

After instantiating the JPMaQSDownload class within the macrosynergy.download module, one can use the download(tickers, start_date, metrics) method to obtain the data. Here tickers is an array of ticker strings, start_date is the first release date to be considered and metrics denotes the types of information requested.

# Cross-sections of interest

cids_dmca = [
    "AUD",
    "CAD",
    "EUR",
    "GBP",
    "NOK",
    "NZD",
    "SEK",
    "USD"
]  # DM currency areas
cids_latm = ["BRL"]  # Latam countries
cids_emea = ["RUB", "CZK", "HUF", "PLN"]  # EMEA countries
cids_emas = [
    "INR",
    "KRW",
]  # EM Asia countries

cids_dm = cids_dmca
cids_em = cids_latm + cids_emea + cids_emas

cids = sorted(cids_dm + cids_em)
# Quantamental categories of interest

main = ["HHINFESCORE_NSA", "HHINFESCORE_NSA_D1M1ML1", "HHINFESCORE_NSA_D3M3ML3", "HHINFESCORE_NSA_D1Q1QL1"]  # main macro

econ = ["RIR_NSA"]  # economic context
mark = ["EQXR_NSA",
        "EQXR_VT10", 
        "DU02YXR_VT10", 
        "DU02YXR_NSA", 
        "DU05YXR_VT10",
        "DU05YXR_NSA", 
        "FXXR_VT10", 
        "FXXR_NSA",
        ]  # market links

xcats = main + econ + mark
# Download series from J.P. Morgan DataQuery by tickers

start_date = "1990-01-01"
tickers = [cid + "_" + xcat for cid in cids for xcat in xcats]
print(f"Maximum number of tickers is {len(tickers)}")

# Retrieve credentials

client_id: str = os.getenv("DQ_CLIENT_ID")
client_secret: str = os.getenv("DQ_CLIENT_SECRET")

# Download from DataQuery

with JPMaQSDownload(client_id=client_id, client_secret=client_secret) as downloader:
    start = timer()
    df = downloader.download(
        tickers=tickers,
        start_date=start_date,
        metrics=["value", "eop_lag", "mop_lag", "grading"],
        suppress_warning=True,
    )
    end = timer()

dfd = df

print("Download time from DQ: " + str(timedelta(seconds=end - start)))
Maximum number of tickers is 195
Downloading data from JPMaQS.
Timestamp UTC:  2025-02-03 13:47:06
Connection successful!
Some expressions are missing from the downloaded data. Check logger output for complete list.
128 out of 780 expressions are missing. To download the catalogue of all available expressions and filter the unavailable expressions, set `get_catalogue=True` in the call to `JPMaQSDownload.download()`.
Some dates are missing from the downloaded data. 
2 out of 9158 dates are missing.
Download time from DQ: 0:00:24.907638

Availability #

cids_exp = sorted(
    list(set(cids))
)  # cids expected in category panels
msm.missing_in_df(dfd, xcats=main, cids=cids_exp)
No missing XCATs across DataFrame.
Missing cids for HHINFESCORE_NSA:          []
Missing cids for HHINFESCORE_NSA_D1M1ML1:  ['CAD', 'GBP', 'NOK', 'NZD', 'SEK']
Missing cids for HHINFESCORE_NSA_D1Q1QL1:  ['AUD', 'BRL', 'CZK', 'EUR', 'HUF', 'INR', 'KRW', 'PLN', 'RUB', 'USD']
Missing cids for HHINFESCORE_NSA_D3M3ML3:  ['CAD', 'GBP', 'NOK', 'NZD', 'SEK']

Consumer inflation expectations are available from the early 2000s for the vast majority of countries. Currency areas providing monthly data will not display quarterly changes (_D1Q1QL1) and vice-versa.

For the explanation of currency symbols, which are related to currency areas or countries for which categories are available, please view Appendix 1 .

xcatx = main
cidx = cids_exp

dfx = msm.reduce_df(dfd, xcats=xcatx, cids=cidx)
dfs = msm.check_startyears(dfx)
msm.visual_paneldates(dfs, size=(18, 3))

print("Last updated:", date.today())
https://macrosynergy.com/notebooks.build/themes/economic-trends/_images/c47ed0237a1e6d7081a999426ad2896b291f5dc52fe579815eddb12bb5721724.png
Last updated: 2025-02-03

Average grades are on the low side at the moment, as electronic vintage records are not yet easily available. This, in turn, reflects that these surveys are not as carefully watched by markets.

xcatx = main
cidx = cids_exp

plot = msp.heatmap_grades(
    dfd,
    xcats=xcatx,
    cids=cidx,
    start=start_date,
    size=(18, 3),
    title=f"Average vintage grades, from {start_date} onwards",
)
https://macrosynergy.com/notebooks.build/themes/economic-trends/_images/d47443582d90f321cf37625fb32344ac74c81173766677b06f1c390e86943673.png

History #

Consumer expectation of 1-year ahead inflation #

Due to (point-in-time) normalization the variation of expectation scores has been of comparable magnitude across countries. Most long-term averages are near zero, but for countries with secular inflation trends or short histories, the average can be larger than half a standard deviation.

xcatx = ["HHINFESCORE_NSA"]
cidx = cids_exp
start_date = "2000-01-01"

msp.view_ranges(
    dfd,
    xcats=xcatx,
    cids=cidx,
    sort_cids_by="mean",
    start=start_date,
    kind="bar",
    size=(16, 8),
    title="Average and standard deviation of consumer inflation expectations score, since 2000 (for most)",
    xcat_labels=["1-year"],
)
https://macrosynergy.com/notebooks.build/themes/economic-trends/_images/1b3420ec3cd3b2471b13dece1cffb8e9f885dc7b7273ddf9cd893282110c0436.png
xcatx = ["HHINFESCORE_NSA"]
cidx = cids_exp
start_date = "1990-01-01"

msp.view_timelines(
    dfd,
    xcats=xcatx,
    cids=cidx,
    start=start_date,
    title="Consumer inflation expectations scores, since inception",
    legend_fontsize=17,
    label_adj=0.075,
    xcat_labels=["1-year ahead"],
    ncol=4,
    same_y=True,
    size=(12, 7),
    aspect=1.7,
    all_xticks=True,
)
https://macrosynergy.com/notebooks.build/themes/economic-trends/_images/c48c0f50b7895808669b1b6069d20ad8c305668bec806a06b9535a0b13f82a01.png

Consumer inflation expectations have been mostly positively correlated across countries. Sweden has been an exceptions, but that may largely reflect its short history.

xcatx = "HHINFESCORE_NSA"
cidx = cids_exp

msp.correl_matrix(dfd, xcats=xcatx, cids=cidx, size=(20, 14))
https://macrosynergy.com/notebooks.build/themes/economic-trends/_images/e1443e4e8bae434f312ed93bfd34d7b87f5af12497ea021bce5e5cb198292077.png

Importance #

Empirical clues #

dfx = dfd.copy()

dict_repl = {
    "HHINFESCORE_NSA_D1Q1QL1": "HHINFESCORE_NSA_D3M3ML3",
}
for key, value in dict_repl.items():
    dfx["xcat"] = dfx["xcat"].str.replace(key, value)

There has been a clear and significant negative relation between inflation expectation scores and subsequent vol-targeted duration returns in the U.S. and the euro area, at both the monthly and quarterly frequency.

xcatx = ["HHINFESCORE_NSA", "DU05YXR_VT10"]
cidx = ["EUR", "USD"]
start_date = "2000-01-01"

cr = msp.CategoryRelations(
    dfx,
    xcats=xcatx,
    cids=cidx,
    freq="Q",
    lag=1,
    xcat_aggs=["last", "sum"],
    start=start_date,
    years=None,
)

cr.reg_scatter(
    title="Inflation expectations scores and subsequent 5-year duration returns, U.S. and euro area, since 2000",
    labels=False,
    reg_order=1,
    coef_box="upper left",
    xlab="Inflation expectations score, end-of-quarter",
    ylab="Next quarter's 5-year IRS fixed receiver returns",
    reg_robust=True,
    prob_est='map',
)
https://macrosynergy.com/notebooks.build/themes/economic-trends/_images/0051d24cb0fef6dcb9c531990cc75f9fd840c0efc8a471d52e80537a1cdfee87.png

There is some evidence of a negative relationship between inflation expectation scores and subsequent equity returns in the U.S., at the monthly and quarterly frequency.

xcatx = ["HHINFESCORE_NSA", "EQXR_NSA"]
cidx = ["USD"]
start_date = "1990-01-01"

cr = msp.CategoryRelations(
    dfx,
    xcats=xcatx,
    cids=cidx,
    freq="Q",
    lag=1,
    xcat_aggs=["last", "sum"],
    start=start_date,
    years=None,
)

cr.reg_scatter(
    title="Inflation expectations scores and subsequent equity returns, U.S., since 1990",
    labels=False,
    reg_order=1,
    coef_box="upper left",
    xlab="Inflation expectations score, end-of-quarter",
    ylab="Equity index futures return, next quarter",
    reg_robust=True,
)
https://macrosynergy.com/notebooks.build/themes/economic-trends/_images/7de2794450135fd76a214a77a12c68a2884988d31050c4daade04e6e7cb377cc.png

The negative relation between inflation expectations and equity returns also holds for the developed markets as a whole. Panel correlation has been signficant, albeit not as much as some individual country relations. This reflects that there is a plausible intertemporal connect between inflation expectations and equity returns, i.e., a ensuing rise in real interest rates and discount factors, but no strong case for cross-country relations, given that U.S. and euro area inflation and monetary policy dominate the others.

xcatx = ["HHINFESCORE_NSA", "EQXR_NSA"]
cidx = cids_dm # ["USD"]
start_date = "1990-01-01"

cr = msp.CategoryRelations(
    dfx,
    xcats=xcatx,
    cids=cidx,
    freq="M",
    lag=1,
    xcat_aggs=["last", "sum"],
    start=start_date,
    years=None,
)

cr.reg_scatter(
    title="Inflation expectations scores and subsequent equity returns, U.S., since 1990",
    labels=False,
    reg_order=1,
    coef_box="upper left",
    xlab="Inflation expectations score, end-of-quarter",
    ylab="Equity index futures return, next quarter",
    reg_robust=True,
    prob_est='map',
)
EQXR_NSA misses: ['NOK', 'NZD'].
https://macrosynergy.com/notebooks.build/themes/economic-trends/_images/3acb1427543e9bcc4dfd5dec75b2b0bad51250d9bde8d5d9f73f212e6e99e366.png

Appendices #

Appendix 1: Currency symbols #

The word ‘cross-section’ refers to currencies, currency areas or economic areas. In alphabetical order, these are AUD (Australian dollar), BRL (Brazilian real), CAD (Canadian dollar), CHF (Swiss franc), CLP (Chilean peso), CNY (Chinese yuan renminbi), COP (Colombian peso), CZK (Czech Republic koruna), DEM (German mark), ESP (Spanish peseta), EUR (Euro), FRF (French franc), GBP (British pound), HKD (Hong Kong dollar), HUF (Hungarian forint), IDR (Indonesian rupiah), ITL (Italian lira), JPY (Japanese yen), KRW (Korean won), MXN (Mexican peso), MYR (Malaysian ringgit), NLG (Dutch guilder), NOK (Norwegian krone), NZD (New Zealand dollar), PEN (Peruvian sol), PHP (Phillipine peso), PLN (Polish zloty), RON (Romanian leu), RUB (Russian ruble), SEK (Swedish krona), SGD (Singaporean dollar), THB (Thai baht), TRY (Turkish lira), TWD (Taiwanese dollar), USD (U.S. dollar), ZAR (South African rand).

Appendix 2: Methodology of scoring #

The inflation expectation values are transformed into z-scores based on past expanding data samples in order to replicate the market’s information state on survey readings relative to what is considered as “normal”.

The underlying economic data used to develop the above indicators comes in the form of diffusion index or a percentage.

In order to standardise different survey indicators, we apply a custom z-scoring methodology to each survey’s vintage. We compute the mean absolute deviation to normalize deviations of confidence levels from their estimated neutral level. We require at least 12 observations to estimate it.

We finally calculate the z-score for the vintage values as

\[ Z_{i, t} = \frac{X_{i, t} - \bar{X_i|t}}{\sigma_i|t} \]

where \(X_{i, t}\) is the value of the indicator for country \(i\) at time \(t\) , \(\bar{X_i|t}\) is the measure of central tendency for country \(i\) at time \(t\) based on information up to that date, and \(\sigma_i|t\) is the mean absolute deviation for country \(i\) at time \(t\) based on information up to that date.

Appendix 3: Survey details #

surveys = pd.DataFrame(
    [
        {"country": "Australia", "source": "Melbourne Institute", "details": "Inflationary Expectations"},
        {"country": "Brazil", "source": "Getulio Vargas Foundation", "details": "Consumer Confidence Index, Inflation Expectations"},
        {"country": "Canada", "source": "Bank of Canada", "details": "Consumer Expectations, 1-Year-Ahead Inflation Expectations"},
        {"country": "Euro Area", "source": "DG ECFIN", "details": "Consumer Surveys, Price Trends Over Next 12 Months"},
        {"country": "India", "source": "Reserve Bank", "details": "Inflation Expectations Survey of Households, One Year Ahead"},
        {"country": "New Zealand", "source": "Reserve Bank", "details": "Inflationary Expectations (1-Year)"},
        {"country": "Norway", "source": "Bank of Norway", "details": "Expectations Survey, Expected Price Change in Next 12 Months"},
        {"country": "Russia", "source": "Central Bank", "details": "Households Inflationary Expectations"},
        {"country": "South Korea", "source": "Bank of Korea", "details": "Inflationary Expectations (1 year)"},
        {"country": "Sweden", "source": "SBAB", "details": "Consumer Confidence, Price Expectation (1 Year)"},
        {"country": "United Kingdom", "source": "Bank of England", "details": "Inflation Attitudes Survey, Expected Prices in the Shops Change Over the Next 12 Months"},
        {"country": "United States", "source": "University of Michigan", "details": "Consumer Sentiment, Expected Change in Inflation Rates"},
    ]
)
from IPython.display import HTML
HTML(surveys.to_html(index=False))
country source details
Australia Melbourne Institute Inflationary Expectations
Brazil Getulio Vargas Foundation Consumer Confidence Index, Inflation Expectations
Canada Bank of Canada Consumer Expectations, 1-Year-Ahead Inflation Expectations
Euro Area DG ECFIN Consumer Surveys, Price Trends Over Next 12 Months
India Reserve Bank Inflation Expectations Survey of Households, One Year Ahead
New Zealand Reserve Bank Inflationary Expectations (1-Year)
Norway Bank of Norway Expectations Survey, Expected Price Change in Next 12 Months
Russia Central Bank Households Inflationary Expectations
South Korea Bank of Korea Inflationary Expectations (1 year)
Sweden SBAB Consumer Confidence, Price Expectation (1 Year)
United Kingdom Bank of England Inflation Attitudes Survey, Expected Prices in the Shops Change Over the Next 12 Months
United States University of Michigan Consumer Sentiment, Expected Change in Inflation Rates