Inflation targets #
This category group contains real-time estimates of estimated official and effective inflation targets. The reference is always the estimated target for the next year. Target values are updated based on a review of official sources. The main function of these indicators is to serve as benchmark for assessment if actual or expected inflation in a currency area may be considered to be too high or too low.
Official inflation target #
Ticker : INFTARGETO_NSA
Label : Estimated official target for next calendar year, % over a year ago.
Definition : Estimate of the inflation rate targeted (formally or informally) by the government or central bank for the next calendar year, % over a year ago.
Notes :
-
JPMaQS has a tiered approach to deriving inflation targets. If the authorities have declared an official inflation target, this value is used. If there is no formal target, informal targets or reference values are used if they are communicated to the market or reflect a common understanding of the authorities and the public. For example, the ECB’s definition of price stability in the 2000s is regarded as an informal inflation target.
-
Often inflation targets are announced as ranges. In this case the mid-point of the target range is chosen as reference value. If terms such as “below” or “above” are used in respect to a reference value, 25bps are subtracted or added to the reference value. In case of doubt, monetary policy experts are consulted.
-
The reference period of the inflation target is conceptually the next calendar year. In the majority of cases, this is simply an extrapolation of the current year’s target. However, occasionally central banks announce targets or target changes for the year ahead.
-
The target values are updated once a quarter, at the end of the quarter, based on a review of official sources (central bank websites and web search terms).
Extended inflation target #
Ticker : INFTARGET_NSA
Label : Estimated extended official target for next year, % over a year ago.
Definition : Estimate of the inflation rate targeted by the government or central bank for the next calendar year, % over a year ago, extended to non-target years.
Notes :
-
The calculation of this category is largely similar to “official inflation target”. However, for periods back to 2000 for which neither a formal nor informal target value were available, pro-forma estimates have been generated based on the average of (i) the past three years’ median of CPI core and headline inflation and (ii) the global benchmark for price stability of 2%. This estimate is based on the idea that a generic country targets an inflation between its recent experienced price growth and what is commonly seen as price stability.
-
The main purpose of this series is to have a full set of plausible target reference values across all developed and emerging countries back to 2000.
-
For further calculation details, see Appendix 1 .
Effective inflation target #
Ticker : INFTEFF_NSA
Label : Effective official inflation target (Macrosynergy method), % over a year ago.
Definition : Estimated official inflation target for next year, adjusted for past target deviations.
Notes :
-
The effective inflation target is the estimated official inflation target plus an adjustment for past “target misses”. This adjustment is the last 3 years’ average gap between actual inflation and the estimated official 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 annoucements.
-
For further calculation details, see Appendix 1 .
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.
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)
main = ["INFTARGET_NSA", "INFTEFF_NSA", "INFTARGETO_NSA"]
econ = [
"NIR_NSA",
"RIR_NSA",
"CPIH_SJA_P3M3ML3AR",
"CPIC_SJA_P6M6ML6AR",
] # 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,
show_progress=True,
)
end = timer()
dfd = df
print("Download time from DQ: " + str(timedelta(seconds=end - start)))
Maximum number of tickers is 342
Downloading data from JPMaQS.
Timestamp UTC: 2023-07-14 10:16:47
Connection successful!
Number of expressions requested: 1368
Requesting data: 100%|█████████████████████████████████████████████████████████████████| 69/69 [00:21<00:00, 3.16it/s]
Downloading data: 100%|████████████████████████████████████████████████████████████████| 69/69 [00:42<00:00, 1.64it/s]
Download time from DQ: 0:01:20.046671
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: set()
Missing cids for INFTARGETO_NSA: set()
Missing cids for INFTARGET_NSA: set()
Missing cids for INFTEFF_NSA: set()
Inflation target indicators are typically available by 2000 for all cross-sections. Indonesia is a notable official inflation target late-starter, for which data is only available after 2016.
For the explanation of currency symbols, which are related to currency areas or countries for which categories are available, please view Appendix 2 .
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: 2023-07-14
xcatx = main
cidx = cids_exp
plot = msm.check_availability(
dfd, xcats=xcatx, cids=cidx, start_size=(18, 3), start_years=False, start=start_date
)

msp.heatmap_grades(dfd, xcats=main, cids=cids_exp, start="2000-01-10", size=(16, 2))

xcats_sel = main
msp.view_ranges(
dfd,
xcats=xcats_sel,
cids=cids_exp,
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=xcats_sel,
cids=cids_exp,
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 #
Official and extended inflation targets #
Estimated official inflation targets do not change often. In some countries they have been stable for decades. In other countries they have adapted to circumstances, typically on an annual basis. The extended targets have been more variable in the periods prior to official inflation target introduction, since they were estimated based on past experience.
xcatx = ["INFTARGET_NSA", "INFTARGETO_NSA"]
cidx = cids_exp
msp.view_timelines(
dfd,
xcats=xcatx,
cids=cidx,
start="2000-01-01",
title="Official and extended inflation targets",
xcat_labels=["Extended", "Official"],
title_adj=1.02,
title_xadj=0.47,
title_fontsize=27,
legend_fontsize=17,
label_adj=0.075,
ncol=4,
same_y=False,
size=(12, 7),
aspect=1.7,
all_xticks=True,
)

Estimated effective inflation target #
Effective inflation targets have been shifting in accordance with official announcements and past over- and underperformance. Since the mid-2000s, most countries’ effective targets have been either stationary or revealed only modest drifts.
xcatx = ["INFTEFF_NSA"]
cidx = cids_exp
msp.view_timelines(
dfd,
xcats=xcatx,
cids=cidx,
start="2000-01-01",
title="Estimated effective inflation target (Macrosynergy method)",
title_adj=1.02,
title_xadj=0.51,
title_fontsize=27,
legend_fontsize=17,
ncol=4,
same_y=False,
size=(12, 7),
aspect=1.7,
all_xticks=True,
)

Importance #
Relevant links #
“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 #
Inflation target measures can be used to assess when recorded inflation is “too high” or “too low”. By itself above-target inflation is more likely to elicit tighter monetary policy in words and action, while below-target inflation is more likely to trigger a shift towards more accomodative policy. Therefore, the inflation target helps setting a dividing line between unfavaourable and favourable inflation trends for long-duration assets, such as equity.
The below chart illustrates the point. Beyond a negative correlation it suggests that at 0% “excess inflation” equity returns are still marginally positive (risk premium) but from a significant excess of 3-4% (ar) onward, inflation trends predict declines in equity prices.
calcs = [
"CPIH_SJA_P3M3ML3ARX = CPIH_SJA_P3M3ML3AR - INFTARGET_NSA",
"CPIC_SJA_P6M6ML6ARX = CPIC_SJA_P6M6ML6AR - INFTARGET_NSA",
]
dfa = msp.panel_calculator(dfd, calcs, cids_exp)
dfd = msm.update_df(dfd, dfa)
cids_eq = set(cids_exp) - set(
["CLP", "COP", "CZK", "HUF", "IDR", "ILS", "NOK", "NZD", "PEN", "PHP", "RON", "RUB"]
)
cr = msp.CategoryRelations(
dfd,
xcats=["CPIH_SJA_P3M3ML3ARX", "EQXR_NSA"],
cids=cids_eq,
freq="Q",
lag=1,
xcat_aggs=["last", "mean"],
start="2000-01-01",
xcat_trims=[20, 20],
)
cr.reg_scatter(
title="Short-term CPI trend relative to target and country equity index returns (since 2000, liquid markets)",
labels=False,
reg_order=1,
coef_box="upper right",
xlab="CPI trend (%3m/3m, saar) relative to extended inflation target, quarter end.",
ylab="Average daily equity index return over the next quarter",
)

Appendices #
Appendix 1: Calculation details #
The calculations for the effective inflation targets are as follows:
-
The seasonally- and jump-adjusted core CPI (
CPIC_SJA
) and headline CPI (CPIH_SJA
) series are transformed to obtain growth series over the past year, resulting in the monthly-frequency seriesCPIC_SJA_P1M1ML12
andCPIH_SJA_P1M1ML12
respectively. -
The average of these two series is taken, resulting in a new series
CPIB_SA_P1M1ML12
:
-
Any NA values in the mean growth series
CPIB_SA_P1M1ML12
are replaced with the corresponding value in the headline CPI percentage growth seriesCPIH_SJA_P1M1ML12
. -
To adjust the estimated extended official inflation target for past “target misses”, the differential
INFVT_SA
is first calculated, whereINFTARGET_NSA
is the extended inflation target.
-
The penultimate step is to compute the correction series
INFTBIAS_NSA
, defined to be the moving average of the previously calculated differential over three years. -
Lastly, the effective inflation target series (
INFTEFF_NSA
) is calculated by adding half the correction series (INFTBIAS_NSA
) to the extended inflation target series (INFTARGET_NSA
):
Appendix 2: 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).