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())
../_images/Inflation targets_18_0.png
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
)
../_images/Inflation targets_19_0.png
msp.heatmap_grades(dfd, xcats=main, cids=cids_exp, start="2000-01-10", size=(16, 2))
../_images/Inflation targets_20_0.png
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),
)
../_images/Inflation targets_21_0.png ../_images/Inflation targets_21_1.png

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,
)
../_images/Inflation targets_25_0.png

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,
)
../_images/Inflation targets_28_0.png

Importance#

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",
)
../_images/Inflation targets_36_0.png

Appendices#

Appendix 1: Calculation details#

The calculations for the effective inflation targets are as follows:

  1. 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 series CPIC_SJA_P1M1ML12 and CPIH_SJA_P1M1ML12 respectively.

  2. The average of these two series is taken, resulting in a new series CPIB_SA_P1M1ML12:

(2)#\[\begin{equation} CPIB\_SA\_P1M1ML12 = \frac{1}{2} \times [\text{Percentage CPIC growth over the past year} + \text{Percentage CPIH growth over the past year}] \end{equation}\]
  1. Any NA values in the mean growth series CPIB_SA_P1M1ML12 are replaced with the corresponding value in the headline CPI percentage growth series CPIH_SJA_P1M1ML12.

  2. To adjust the estimated extended official inflation target for past “target misses”, the differential INFVT_SA is first calculated, where INFTARGET_NSA is the extended inflation target.

(3)#\[\begin{equation} INFVT\_SA = CPIB\_SA\_P1M1ML12 - INFTARGET\_NSA \end{equation}\]
  1. 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.

  2. 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):

(4)#\[\begin{equation} INFTEFF\_NSA = INFTARGET\_NSA + \frac{1}{2} INFTBIAS\_NSA \end{equation}\]

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).