Inflation expectations (Macrosynergy method) #
This category features real-time estimates of inflation expectations, based on a formula that uses (i) vintages or recent adjusted inflation and (ii) the estimated effective long-term inflation target of the monetary authorities. A critical assumption of this formula is that the inflation target, adjusted for historic misses, always retains some degree of credibility. If inflation expectations have become evidently “unanchored” and hyperinflation is a distinct possibility this formula is not an appropriate formula.
Inflation expectations mainly serve as an adjustment factor for the calculation of ‘real’ indicators, such as real interest rates or real money and credit growth. However, inflation expectations and their changes can also be trend indicators in their own right, particularly for fixed income markets.
Estimated 1-year ahead inflation expectation #
Ticker : INFE1Y_JA
Label : Estimated 1-year ahead inflation expectations (Macrosynergy method).
Definition : Estimated CPI inflation expectations of market participants for 12 months subsequent to the latest reported CPI data.
Notes :
-
The estimate assumes that market participants form their inflation expectations based on the recent inflation rate (adjusted for jumps and outliers) and the effective inflation target. For recent inflation we use, where available, an average of headline and core inflation. For the 1-year forward horizon, the weight of recent inflation to effective target is 3/4 to 1/4.
-
The recent inflation rate is the average of the headline and core annual CPI inflation rate, with 50% adjustment for jumps and outliers.
-
The effective inflation target is the mean of the target range announced or implied by the authorities plus an adjustment for past “target misses”, which is the last 3 years’ average gap between actual inflation and the target mean. The formula implies that central banks gradually lose credibility if they miss their targets consistently on either the high or low side for several years. However, the formula does not allow for a sudden loss in credibility, which may arise from a change in policy or policy announcements.
Relative estimated 1-year ahead inflation expectation #
Ticker : INFE1YvBM_JA
Label : Estimated 1-year ahead inflation expectations relative to benchmark currency area.
Definition : Estimated CPI inflation expectations of a currency area versus its benchmark currency area, 12 months subsequent to latest report.
Notes :
-
For the principles of the calculations, see notes for INFE1Y_JA. This series is merely the difference between two quantamental indicators (base country indicator minus benchmark country indicator) and has been added to the system for convenience. It would typically be used to convert nominal FX carry into real FX carry.
-
For most countries, the benchmark currency area is the United States. For some European currencies (Switzerland, the Czech Republic, Hungary, Norway, Poland, Romania, Sweden), the benchmark is the euro area. For Great Britain, Turkey and Russia, an equally weighted average of the United States and the euro area has been used.
Estimated 2-years ahead inflation expectation #
Ticker : INFE2Y_JA
Label : Estimated 2-years ahead inflation expectations (Macrosynergy method).
Definition : Estimated CPI inflation expectations of market participants for 2 years subsequent to the latest reported CPI data.
Notes :
-
The estimate assumes that market participants form their inflation expectations based on the recent inflation rate (adjusted for jumps and outliers) and the effective inflation target. For recent inflation we use, where available, an average of headline and core inflation. For the 2-year forward horizon, the weights of recent inflation and effective target are equal.
-
The recent inflation rate is the average of the headline and core annual CPI inflation rate, with 50% adjustment for jumps and outliers.
-
The effective inflation target is the mean of the target range announced or implied by the authorities plus an adjustment for past “target misses”, which is the last 3 years’ average gap between actual inflation and the target mean.
Estimated 5-years ahead inflation expectation #
Ticker : INFE5Y_JA
Label : Estimated 5-years ahead inflation expectations (Macrosynergy method).
Definition : Estimated CPI inflation expectations of market participants for 5 years subsequent to the latest reported CPI data.
Notes :
-
The estimate assumes that market participants form their inflation expectations based on the recent inflation rate (adjusted for jumps and outliers) and the effective inflation target. For recent inflation we use, where available, an average of headline and core inflation. For the 5-year forward horizon, the weight of recent inflation to effective target is 1/5 to 4/5.
-
The recent inflation rate is the average of the headline and core annual CPI inflation rate, with 50% adjustment for jumps and outliers.
-
The effective inflation target is the mean of the target range announced or implied by the authorities plus an adjustment for past “target misses”, which is the last 3 years’ average gap between actual inflation and the target mean.
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",
"CHF",
"EUR",
"GBP",
"JPY",
"NOK",
"NZD",
"SEK",
"USD",
] # DM currency areas
cids_dmec = ["DEM", "ESP", "FRF", "ITL", "NLG"] # DM euro area countries
cids_latm = ["BRL", "COP", "CLP", "MXN", "PEN"] # Latam countries
cids_emea = ["CZK", "HUF", "ILS", "PLN", "RON", "RUB", "TRY", "ZAR"] # EMEA countries
cids_emas = [
"CNY",
"HKD",
"IDR",
"INR",
"KRW",
"MYR",
"PHP",
"SGD",
"THB",
"TWD",
] # EM Asia countries
cids_dm = cids_dmca + cids_dmec
cids_em = cids_latm + cids_emea + cids_emas
cids = sorted(cids_dm + cids_em)
# Quantamental categories of interest
main = ["INFE1Y_JA", "INFE1YvBM_JA", "INFE2Y_JA", "INFE5Y_JA"]
econ = ["RIR_NSA"] # economic context
mark = ["EQXR_NSA", "EQXR_VT10"] # market links
xcats = main + econ + mark
# Download series from J.P. Morgan DataQuery by tickers
start_date = "2000-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 266
Downloading data from JPMaQS.
Timestamp UTC: 2024-02-23 12:12:39
Connection successful!
Some expressions are missing from the downloaded data. Check logger output for complete list.
220 out of 1064 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 6302 dates are missing.
Download time from DQ: 0:00:31.569755
Availability #
cids_exp = sorted(
list(set(cids) - set(cids_dmec + ["ARS", "HKD"]))
) # cids expected in category panels
msm.missing_in_df(dfd, xcats=main, cids=cids_exp)
Missing xcats across df: []
Missing cids for INFE1Y_JA: []
Missing cids for INFE1YvBM_JA: ['USD']
Missing cids for INFE2Y_JA: []
Missing cids for INFE5Y_JA: []
Inflation expectations are available from 2000-2002 for the vast majority of countries. Columbia, the Philippines and Hungary are notable late starters.
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())
Last updated: 2024-02-23
xcatx = main
cidx = cids_exp
plot = msm.check_availability(
dfd, xcats=xcatx, cids=cidx, start_size=(18, 3), start_years=False, start=start_date
)
Vintages are consistently high-graded. USD, however, is the only cross-section to achieve the highest grading across all available cross-sections. The relative estimated 1-year ahead inflation expectation indicator category consistently posts the highest data grades across all relevant cross-sections.
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",
)
xcatx = main
cidx = cids_exp
msp.view_ranges(
dfd,
xcats=xcatx,
cids=cidx,
val="eop_lag",
title="End of observation period lags (ranges of time elapsed since end of observation period in days)",
start="2000-01-01",
kind="box",
size=(16, 4),
)
msp.view_ranges(
dfd,
xcats=xcatx,
cids=cidx,
val="mop_lag",
title="Median of observation period lags (ranges of time elapsed since middle of observation period in days)",
start="2000-01-01",
kind="box",
size=(16, 4),
)
History #
Estimated 1 and 2 years inflation expectations #
Currency areas with higher average inflation expectations also display higher fluctuations in those expectations. This corresponds to traditional economic theory, which stipulates that high expected inflation comes with high inflation uncertainty (and related economic costs).
xcatx = ["INFE1Y_JA", "INFE2Y_JA"]
cidx = cids_exp
msp.view_ranges(
dfd,
xcats=xcatx,
cids=cidx,
sort_cids_by="mean",
start=start_date,
kind="bar",
size=(16, 8),
title="Means and standard deviations of estimated inflation expectations, jump-adjusted, since 2000",
xcat_labels=["1-year", "2-year"],
)
xcatx = ["INFE1Y_JA", "INFE2Y_JA"]
cidx = cids_exp
msp.view_timelines(
dfd,
xcats=xcatx,
cids=cidx,
start=start_date,
title="Estimated inflation expectations, jump-adjusted (Macrosynergy method)",
title_fontsize=27,
legend_fontsize=17,
label_adj=0.075,
xcat_labels=["1 year ahead", "2 years ahead"],
ncol=4,
same_y=False,
size=(12, 7),
aspect=1.7,
all_xticks=True,
)
Short-term inflation expectations are mostly positively correlated across countries. Japan, China and Turkey have displayed the most idiosyncratic dynamics.
xcatx = "INFE1Y_JA"
cidx = cids_exp
msp.correl_matrix(dfd, xcats=xcatx, cids=cidx, size=(20, 14))
Estimated 1 and 5 years inflation expectations #
In a credible inflation targeting regime, longer-term inflation expectations should be better anchored and less volatile. For some EM countries, the credibility benefit has been marginal or failed to materialize at all. However, the majority of that credibility deficit manifested in the early 2000s.
xcatx = ["INFE1Y_JA", "INFE5Y_JA"]
cidx = cids_exp
msp.view_ranges(
dfd,
xcats=xcatx,
cids=cidx,
sort_cids_by="mean",
start=start_date,
kind="bar",
title="Means and standard deviations of estimated inflation expectations, jump-adjusted, since 2000",
xcat_labels=["1 year ahead", "5 years ahead"],
size=(16, 8),
)
xcatx = ["INFE1Y_JA", "INFE5Y_JA"]
cidx = cids_exp
msp.view_timelines(
dfd,
xcats=xcatx,
cids=cidx,
start=start_date,
title="Estimated inflation expectations, jump-adjusted (Macrosynergy method)",
title_fontsize=27,
legend_fontsize=17,
label_adj=0.075,
xcat_labels=["1-year", "5-year"],
ncol=4,
same_y=False,
size=(12, 7),
aspect=1.7,
all_xticks=True,
)
Relative estimated inflation expectations #
Averages, standard deviations and patterns of relative inflation expectations (versus benchmark currency area) have been extremely diverse across countries.
xcatx = ["INFE1YvBM_JA"]
cidx = cids_exp
msp.view_ranges(
dfd,
xcats=xcatx,
cids=cidx,
sort_cids_by="mean",
start=start_date,
kind="bar",
title="Means and standard deviations of estimated inflation expectations, relative to natural benchmarks, jump-adjusted, since 2000",
xcat_labels=["1-year vs BM"],
size=(16, 8),
)
xcatx = ["INFE1YvBM_JA"]
cidx = cids_exp
msp.view_timelines(
dfd,
xcats=xcatx,
cids=cidx,
start=start_date,
title="Estimated inflation expectations, relative to natural benchmarks, jump-adjusted (Macrosynergy method)",
title_fontsize=27,
legend_fontsize=17,
label_adj=0.075,
xcat_labels=["1-year"],
ncol=4,
same_y=False,
size=(12, 7),
aspect=1.7,
all_xticks=True,
)
Short-term relative inflation expectations have displayed both negative and positive correlations across the smaller economies, even though most of them have been benchmarked against the USD.
xcatx = "INFE1YvBM_JA"
cidx = cids_exp
msp.correl_matrix(
dfd,
xcats=xcatx,
cids=cidx,
title="Cross-sectional correlation of short-term relative inflation expectations (Macrosynergy method)",
size=(20, 14),
)
Importance #
Research links #
“Inflation expectations wield great influence over fixed income returns. They determine the nominal yield required for a given equilibrium real interest rate, they influence inflation risk premia, and they shape the central bank’s course of action. There is no uniform inflation expectation metric than can be tracked in real-time. However, there are useful and complementary proxies, such as market-based breakeven inflation and economic data-based estimates. For trading strategies, these two can be combined. The advantage of breakeven rates is the real-time tracking of a broad range of influences. The advantages of economic data-based estimates are clarity, transparency, and precision of measurement. Changes in both inflation metrics help predict interest rate swap returns, but their combination is a better predictor than the individual series, emphasizing the complementarity of market and economic data.” Macrosynergy
“A theoretical paper shows that a downward shift in expected inflation increases equity valuations and credit default risk at the same time. The reason for this is ‘nominal stickiness’. A slowdown in consumer prices reduces short-term interest rates but does not immediately reduce earnings growth by the same rate, thus increasing the discounted present value of future earnings. At the same time, a downward shift in expected inflation increases future real debt service and leverage of firms and increases their probability of default. This theory is supported by the trends in U.S. markets since 1970.” Macrosynergy
“Two recent empirical studies highlight the risk that inflation expectations in the euro area are becoming de-anchored, similar to Japan. De-anchoring means that short-term price shocks can change long-term expectations. Importantly, the papers suggest medium- and short-term measures to track this de-anchoring. De-anchoring increases the risk of actual deflation and may add to the risk premia on equity and credit.” Macrosynergy
Empirical clues #
Unsurprisingly, short-term interest rates and inflation expectations have been closely related across time and countries.
xcatx = ["INFE1Y_JA", "RIR_NSA"]
cidx = list(set(cids_exp) - set(["TRY"]))
cr = msp.CategoryRelations(
dfd,
xcats=xcatx,
cids=cidx,
freq="M",
lag=0,
xcat_aggs=["mean", "mean"],
start=start_date,
years=3,
xcat_trims=[15, 25],
)
cr.reg_scatter(
title="Short-term interest rates and inflation expectations (Macrosynergy method) over 3-year periods since 2000",
labels=True,
reg_order=1,
coef_box="upper left",
xlab="1 year ahead inflation expectation",
ylab="Nominal 1-month inter-bank rate or closest proxy",
reg_robust=True,
)
Interestingly, there has also been a positive correlation between longer-term inflation expectations and short-term real interest rates. This emphasizes that countries or episodes with greater inflation fears often force the central bank to impose higher real refinancing rates.
xcatx = ["INFE5Y_JA", "RIR_NSA"]
cidx = list(set(cids_exp) - set(["TRY"]))
cr = msp.CategoryRelations(
dfd,
xcats=xcatx,
cids=cidx,
freq="M",
lag=0,
xcat_aggs=["mean", "mean"],
start=start_date,
years=3,
xcat_trims=[15, 25],
)
cr.reg_scatter(
title="Short-term interest rates and inflation expectations (Macrosynergy method) over 3-year periods since 2000",
labels=True,
reg_order=1,
coef_box="upper left",
xlab="5 years ahead inflation expectation",
ylab="Real 1-month inter-bank rate or closest proxy",
reg_robust=True,
)
Rising inflation expectations have historically boded ill for local equity returns. There has been clear negative correlation between monthly or quarterly expectation revisions and subsequent monthly or quarterly equity index returns.
xcatx = ["INFE1Y_JA", "EQXR_NSA"]
cidx = list(
set(cids_exp)
- set(
[
"CLP",
"COP",
"CZK",
"HUF",
"IDR",
"ILS",
"NOK",
"NZD",
"PEN",
"PHP",
"RON",
"RUB",
"TRY",
]
)
) # missing cids
cr = msp.CategoryRelations(
dfd,
xcats=xcatx,
xcat1_chg="diff",
cids=cidx,
freq="Q",
lag=1,
xcat_aggs=["last", "sum"],
start=start_date,
years=None,
)
cr.reg_scatter(
title="Changes in inflation expectations and subsequent equity returns (19 currency areas since 2000)",
labels=False,
reg_order=1,
coef_box="upper left",
xlab="Change in 1-year-ahead inflation expectation over current quarter",
ylab="Local equity index return, next quarter",
reg_robust=True,
)
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).