Producer price inflation #
This category group contains real-time information states of output price growth in the economy. In particular, it contains the following important concepts:
-
Real-time measures of internationally comparable GDP price deflators based on vintages which are either taken from national sources or by JPMaQS.
-
Estimated economy-wide output price growth based on standard econometric (“technical”) estimates that use GDP deflators as target but deploy higher-frequency price information. Historic and current models are based on the simplest conventions and are recurrently reconstructed based on learning (view basic principles here )
-
Real-time measures of standard producer price (PPI) index trends of selected sectors in accordance with local convention (typically focused on industry), based on sequential estimation of seasonal factors and/or original data vintages.
GDP deflator trends #
Ticker : PGDP_SA_P1Q1QL4 / _P1Q1QL1AR / _P2Q2QL2AR
Label : GDP price deflator, sa: %oya (quarterly) / % q/q ar / % 2q/2q ar
Definition : GDP price deflator, seasonally-adjusted: % over a year ago (quarterly) / % quarter over previous quarter, annualized / % 2 quarters over previous 2 quarters, annualized
Notes :
-
“ The GDP implied deflator is used to measure changes in the overall level of prices for the goods and services that make up GDP. It is an important indicator in the National Accounts as it distinguishes output growth that comes about due to volume increase and that due to price changes.” [ Chowdhury ]
-
For the following countries deflator vintages are directly taken from official national sources: Australia, Canada, the euro area, Germany, Japan, Malaysia, New Zealand, Spain, Switzerland, the UK, and the U.S.
-
For the remaining currency areas and countries, we calculate the price deflators indirectly, as the ratio of nominal GDP to real GDP. In this case the data are not seasonally adjusted and JPMaQS applies sequential seasonal adjustment based on the standard X13 method.
Economy-wide estimated output price trends and changes (broad) #
Ticker : PGDPTECH_SA_P1M1ML12 / _P1M1ML12_3MMA / _P1M1ML12_D3M3ML3
Label : Economy-wide output prices, GDP-based broad estimate: % oya / % oya, 3mma / % oya, 3mma, diff over 3m
Definition : Economy-wide output prices, GDP-based broad estimate: % over a year ago / % over a year ago, 3-month moving average / % over a year ago, 3-month moving average, difference versus 3 months ago
Notes :
-
Output price trends for the overall economy resemble GDP deflators in principle but are estimated at a monthly frequency with a simple nowcasting method and based on a limited early set of price indicators. They are a much rougher indicator of overall output price growth than deflators but are transparent and very timely. They are related to corporate profitability and conceptually different from consumer price indicators, which focus on households living costs, and standard producer prices, which are typically collected only for the manufacturing sector alone.
-
Formally price trends are estimated as nowcasters of annual growth rates of GDP deflation, based on early indicators such as CPI, PPI, oil prices in local currency and so forth. The presence of predictive power is ascertained by using the “elastic net” regression method. A more detailed explanation can be found in Appendix 1 . A full list of inputs for each cross section for each country is provided in Appendix 2 .
-
Important note: The quantamental series of a 3-month moving average, as presented here, is not the same as the 3-month moving average of a quantamental series. Instead it is a 3-month moving average of the concurrent available vintage. Since the latest month and the previous months may be estimated based on different monthly-frequency data, depending on publication lag, the quantamental 3-month moving averages contain independent information and may look very different from the smoothed monthly quantamental series. The same applies to change of output price trends: quantamental indicators of changes are not the same as changes in quantamental indicators.
Economy-wide estimated output price trends and changes (narrow) #
Ticker : PGDPTECHX_SA_P1M1ML12 / PGDPTECHX_SA_P1M1ML12_3MMA / _P1M1ML12_D3M3ML3
Label : Economy-wide output prices, GDP-based narrow estimate: % oya / % oya, 3mma / % oya, 3mma, diff over 3m
Definition : Economy-wide output prices, GDP-based narrow estimate: % over a year ago / % over a year ago, 3-month moving average / % over a year ago, 3-month moving average, difference versus 3 months ago
Notes :
-
These indicators are similar to the broad outprice trends, except that they uses a more narrow and conservative high-frequency predictors, mainly consumer and producer price indices, which also be seen in Appendix 2 .
-
These indicators cannot be calculated for Australia and New Zealand, since the national statistical agencies do not publish monthly CPI or PPI data.
Standard PPI inflation #
Ticker : PPIH_NSA_P1M1ML12 / _P1M1ML12_3MMA
Label : Main producer price index: %oya / %oya, 3mma
Definition : Main producer price index: % over a year ago / % over a year ago, 3-month moving average
Notes :
-
In general, the PPIs used for this category are the most commonly watched local measures. Definitions are not equal across currency areas. In some countries, prices refer only to manufacturing output. In others, they include construction, mining and utilities. Some also include agriculture and services. See the country-specific notes in Appendix 1 .
-
India and Taiwan do not report PPI and instead the wholesale price index has been used.
-
Most underlying vintages have a monthly frequency. Australia, New Zealand and Indonesia only publish quarterly production price indices. For trend growth calculations, these indices are assumed to be stable over the quarter.
-
USA changed how it calculated PPI from the processing stage to the final intermediate demand. The final demand version is used from January 2016 onwards.
-
Hungary only reported manufacturing prices until 2010.
-
South Africa only reported manufacturing prices until 2012.
-
For Brazil, WPI was used in calculations until 2019.
Seasonally-adjusted PPI trends #
Ticker : PPIH_SA_P3M3ML3AR / _P6M6ML6AR
Label : Adjusted PPI trend: % 3m/3m ar / % 6m/6m ar
Definition : Headline PPI, seasonally-adjusted: % of latest 3 months over previous three months at annualized rate / % of latest six months over previous 6 months at an annualized rate.
Notes :
-
See the important notes in the section above on “Annual PPI inflation”.
-
Seasonal adjustment factors are sequentially re-estimated as new data are being released. Every re-estimation gives rise to a new data vintage which is the basis of concurrent trend estimation.
-
China does not publish a proper PPI index. The official statistics only display a % over a year ago series. This means that short-term production price trends cannot be calculated.
Imports #
Only the standard Python data science packages and the specialized
macrosynergy
package are needed.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import math
import os
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 requests
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 easily download the necessary data, where
tickers
is an array of ticker strings,
start_date
is the first collection date to be considered and
metrics
is an array comprising the times series information to be downloaded.
# 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)
# for FX
cids_nofx = ["EUR", "USD", "SGD"] + cids_dmec
cids_fx = list(set(cids) - set(cids_nofx))
cids_eur = ["CHF", "CZK", "HUF", "NOK", "PLN", "RON", "SEK"] # trading against EUR
cids_eud = ["GBP", "RUB", "TRY"] # trading against EUR and USD
cids_usd = list(set(cids_fx) - set(cids_eur + cids_eud)) # trading against USD
# Quantamental categories of interest
main = [
"PGDP_SA_P1Q1QL4",
"PGDP_SA_P1Q1QL1AR",
"PGDP_SA_P2Q2QL2AR",
"PGDPTECH_SA_P1M1ML12_3MMA",
"PGDPTECH_SA_P1M1ML12",
"PGDPTECH_SA_P1M1ML12_D3M3ML3",
"PGDPTECHX_SA_P1M1ML12_3MMA",
"PGDPTECHX_SA_P1M1ML12",
"PGDPTECHX_SA_P1M1ML12_D3M3ML3",
"PPIH_NSA_P1M1ML12",
"PPIH_NSA_P1M1ML12_3MMA",
"PPIH_SA_P3M3ML3AR",
"PPIH_SA_P6M6ML6AR",
]
econ = ["CPIH_SA_P1M1ML12", "INFTEFF_NSA"] # economic context
mark = [
"FXXR_NSA",
"FXXR_VT10",
"EQXR_NSA",
"DU05YXR_NSA",
"DU02YXR_NSA",
"FXTARGETED_NSA",
"FXUNTRADABLE_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()
assert downloader.check_connection()
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 814
Downloading data from JPMaQS.
Timestamp UTC: 2024-01-09 16:06:23
Connection successful!
Number of expressions requested: 3256
Requesting data: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 163/163 [00:57<00:00, 2.81it/s]
Downloading data: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 163/163 [00:49<00:00, 3.26it/s]
Download time from DQ: 0:03:43.823323
Availability #
cids_exp = cids # cids expected in category panels
msm.missing_in_df(dfd, xcats=xcats, cids=cids_exp)
Missing xcats across df: []
Missing cids for CPIH_SA_P1M1ML12: []
Missing cids for DU02YXR_NSA: ['RON', 'DEM', 'PHP', 'ITL', 'FRF', 'BRL', 'PEN', 'NLG', 'ESP']
Missing cids for DU05YXR_NSA: ['RON', 'DEM', 'PHP', 'ITL', 'FRF', 'BRL', 'PEN', 'NLG', 'ESP']
Missing cids for EQXR_NSA: ['COP', 'ILS', 'NZD', 'RON', 'RUB', 'IDR', 'PHP', 'CLP', 'HUF', 'NOK', 'PEN', 'CZK']
Missing cids for FXTARGETED_NSA: ['DEM', 'USD', 'ITL', 'FRF', 'NLG', 'ESP']
Missing cids for FXUNTRADABLE_NSA: ['DEM', 'USD', 'ITL', 'FRF', 'NLG', 'ESP']
Missing cids for FXXR_NSA: ['DEM', 'USD', 'ITL', 'FRF', 'NLG', 'ESP']
Missing cids for FXXR_VT10: ['DEM', 'USD', 'ITL', 'FRF', 'NLG', 'ESP']
Missing cids for INFTEFF_NSA: ['DEM', 'ITL', 'FRF', 'NLG', 'ESP']
Missing cids for PGDPTECHX_SA_P1M1ML12: ['AUD', 'NZD']
Missing cids for PGDPTECHX_SA_P1M1ML12_3MMA: ['AUD', 'NZD']
Missing cids for PGDPTECHX_SA_P1M1ML12_D3M3ML3: ['AUD', 'NZD']
Missing cids for PGDPTECH_SA_P1M1ML12: []
Missing cids for PGDPTECH_SA_P1M1ML12_3MMA: []
Missing cids for PGDPTECH_SA_P1M1ML12_D3M3ML3: []
Missing cids for PGDP_SA_P1Q1QL1AR: []
Missing cids for PGDP_SA_P1Q1QL4: []
Missing cids for PGDP_SA_P2Q2QL2AR: []
Missing cids for PPIH_NSA_P1M1ML12: []
Missing cids for PPIH_NSA_P1M1ML12_3MMA: []
Missing cids for PPIH_SA_P3M3ML3AR: ['CNY']
Missing cids for PPIH_SA_P6M6ML6AR: ['CNY']
xcatx = xcats
cidx = cids_exp
dfx = msm.reduce_df(dfd, xcats=main, cids=cidx)
dfs = msm.check_startyears(
dfx,
)
msm.visual_paneldates(dfs, size=(20, 5))
print("Last updated:", date.today())
Last updated: 2024-01-09
xcatx = main
cidx = cids_exp
plot = msm.check_availability(
dfd, xcats=xcatx, cids=cidx, start_size=(12, 4), start_years=False
)
xcatx = main
cidx = cids_exp
plot = msp.heatmap_grades(
dfd,
xcats=xcatx,
cids=cidx,
size=(12, 4),
title=f"Average vintage grades from {start_date} onwards",
)
Standard PPI inflation data have the shortest observation period lags, following by economy-wide estimated output price trends. The GDP deflatos lake longest to release.
xcatx = ["PGDPTECH_SA_P1M1ML12_3MMA", "PGDP_SA_P1Q1QL4", "PPIH_NSA_P1M1ML12"]
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=start_date,
kind="box",
size=(16, 7),
)
History #
GDP price deflators inflation #
Averages and variation of GDP deflators have been very different across countries. Quarterly deflator changes are very volatile for most countries. The annual growth rates and the 2-quarter growth rates have empirically been more plausible indicators of trends.
xcatx = ["PGDP_SA_P1Q1QL4", "PGDP_SA_P1Q1QL1AR","PGDP_SA_P2Q2QL2AR"]
cidx = cids_exp
msp.view_ranges(
dfd,
xcats=xcatx,
cids=cidx,
sort_cids_by="mean",
start="2000-01-01",
title="Means and standard deviations of GDP price deflators inflation, since 2000",
kind="bar",
size=(16, 8),
)
Some countries such as Great Britain and China can have highly volatile GDP price deflator, which can be explained by methodology changes. For example, in the UK during the height of COVID , the Office for National Statistics reduced public sector output based on physical indicators, such as in-person classes taught. Since at the same time costs for such services remained stable the inputted deflator surged. which affected the GDP deflator during the covid disruption. China has historically used undisclosed methods for their real growth rate and there have been implausible patterns in their data. There is evidence to suggest that China overstates real GDP growth in downturns, as there has been a pattern of decreasing price growth rather than production growth.
xcatx = ["PGDP_SA_P1Q1QL4","PGDP_SA_P2Q2QL2AR"]
cidx = cids_exp
msp.view_timelines(
dfd,
xcats=xcatx,
cids=cidx,
start="2000-01-01",
title="GDP deflator trends",
# label_adj=0.05,
title_fontsize=27,
legend_fontsize=17,
title_adj=1.02,
title_xadj=0.42,
ncol=4,
same_y=False,
size=(12, 7),
aspect=1.7,
all_xticks=True,
)
GDP price deflators have generally not been strongly correlated across countries. Clusters of strong correlation can be found, however, among European economies and other specific country pairs. Japan’s and Taiwan’s deflator trends have been negatively correlated with many EM countries.
xcatx = ["PGDP_SA_P1Q1QL4"]
cidx = cids_exp
msp.correl_matrix(
dfd,
xcats=xcatx,
cids=cidx,
size=(20, 14),
title="Cross-sectional correlations of annual GDP price deflators inflation since 1990",
cluster=True,
)
Economy output price trends #
Even though broad economic output price trends are derived as types of nowcasters on GDP deflators, their information states can deviate substantially and over long periods of time. This reflects two important differences:
-
The economy price trends are much timelier and only use a small set of timely available indicators. Other sources of price fluctuations and trends, such as imputed public sector output prices, are not considered.
-
Economy output trends only use higher-frequency price indicators only to the extent that they have historically been successful in estimating the GDP deflator. The predictive power of even the full set of indicators can sometimes be low, in which case the real-time estimator is very conservative and close to a longer-term term GDP deflator growth average.
Deflator nowcasters can deviate from their targets a lot more persistently than GDP nowcasters because there are less explanatory high frequency series. After all deflators are only of interest for specialized purposes, while real GDP is a mainstream piece of information with great relevance for politics and economic and monetary policy.
xcatx=["PGDPTECH_SA_P1M1ML12_3MMA", "PGDP_SA_P1Q1QL4"]
cidx = cids_exp
msp.view_timelines(
dfd,
xcats=xcatx,
cids=cidx,
start="2000-01-01",
title="Broad output prices (blue) and GDP deflator (orange) growth, %oya, 3mma or quarterly",
# label_adj=0.05,
title_fontsize=27,
legend_fontsize=17,
title_adj=1.02,
title_xadj=0.42,
ncol=4,
same_y=False,
size=(12, 7),
aspect=1.7,
all_xticks=True,
)
The narrow version of the economy’s estimated output price trend can produce very different short-term dynamics. It is no less volatile than the broad metric, however.
xcatx = ["PGDPTECHX_SA_P1M1ML12_3MMA","PGDPTECH_SA_P1M1ML12_3MMA",]
cidx = cids_exp
msp.view_timelines(
dfd,
xcats=xcatx,
cids=cidx,
start="2000-01-01",
title="Narrow (blue) and broad (orange) economy-wide outout price growth, %oya, 3mma",
title_fontsize=27,
legend_fontsize=17,
title_adj=1.02,
title_xadj=0.42,
ncol=4,
same_y=False,
size=(12, 7),
aspect=1.7,
all_xticks=True,
)
Changes of the economy’s output price trends #
Short-term changes in estimated output price trends in the economy are strongly mean reverting with many “mini-cycles”. Differences between narrow (conservative) and broad estimates can be large.
xcatx = ["PGDPTECHX_SA_P1M1ML12_D3M3ML3", "PGDPTECH_SA_P1M1ML12_D3M3ML3",]
cidx = cids_exp
msp.view_timelines(
dfd,
xcats=xcatx,
cids=cidx,
start="2000-01-01",
title="Changes in estimated output price trends in the economy",
# label_adj=0.05,
title_fontsize=27,
legend_fontsize=17,
title_adj=1.02,
title_xadj=0.42,
ncol=4,
same_y=False,
size=(12, 7),
aspect=1.7,
all_xticks=True,
)
Annual PPI inflation #
Average rates and standard deviations of PPI inflation have been diverse across countries, with exchange rates being a key differentiating factor. Long-term average inflation has ranged from near-zero in Switzerland to near 20% in Turkey.
xcatx = ["PPIH_NSA_P1M1ML12", "PPIH_NSA_P1M1ML12_3MMA"]
cidx = cids_exp
msp.view_ranges(
dfd,
xcats=xcatx,
cids=cidx,
sort_cids_by="mean",
start="2000-01-01",
title="Means and standard deviations of annual PPI inflation",
xcat_labels=["%oya", "%oya, 3mma"],
kind="bar",
size=(16, 8),
)
xcatx = ["PPIH_NSA_P1M1ML12", "PPIH_NSA_P1M1ML12_3MMA"]
cidx = cids_exp
msp.view_timelines(
dfd,
xcats=xcatx,
cids=cidx,
start="2000-01-01",
title="Headline PPI inflation and three month moving average",
title_fontsize=27,
legend_fontsize=17,
title_adj=1.02,
title_xadj=0.42,
ncol=4,
same_y=False,
size=(12, 7),
aspect=1.7,
all_xticks=True,
)
Quantamental series of PPI inflation rates are positively correlated across almost all country pairs and often strongly so. This mainly reflects the impact of various raw materials on PPI dynamics.
msp.correl_matrix(dfd, xcats="PPIH_NSA_P1M1ML12", cids=cids_exp, size=(20, 14))
Seasonally-adjusted PPI trend #
The 6-months-over-6months trends have been a lot more stable than the 3-months-over-3-months trends and seem to be a useful basis for measuring shorter-term producer price inflation trend differentials across countries.
xcatx = ["PPIH_SA_P3M3ML3AR", "PPIH_SA_P6M6ML6AR"]
cidx = cids_exp
msp.view_ranges(
dfd,
xcats=xcatx,
cids=cidx,
sort_cids_by="mean",
start="2000-01-01",
title="Means and standard deviations of seasonally-adjusted PPI trends",
xcat_labels=["3-month/3-month trend", "6-month/6-month trend"],
kind="bar",
size=(16, 8),
)
xcatx = ["PPIH_SA_P3M3ML3AR", "PPIH_SA_P6M6ML6AR"]
cidx = cids_exp
msp.view_timelines(
dfd,
xcats=xcatx,
cids=cidx,
start="2000-01-01",
xcat_labels=[
"% 3m/3m, seasonally-adjusted annualized rate",
"% 6m/6m, seasonally-adjusted annualized rate",
],
title="Seasonally adjusted trends of headline PPI",
title_fontsize=27,
legend_fontsize=17,
label_adj=0.075,
title_adj=1.02,
title_xadj=0.4,
ncol=4,
same_y=False,
size=(12, 7),
aspect=1.7,
all_xticks=True,
)
Importance #
Research links #
“Nowcasting economic trends can make use of a broad range of machine learning methods. This not only serves the purpose of optimization but also allows replication of past information states of the market and supports realistic backtesting. A practical framework for modern nowcasting is the three-step approach of (1) variable pre-selection, (2) orthogonalized factor formation, and (3) regression-based prediction.” Macrosynergy
Empirical clues #
calcs = ["XPGDPTECH_SA_P1M1ML12 = PGDPTECH_SA_P1M1ML12 - INFTEFF_NSA ",
"XPGDPTECHX_SA_P1M1ML12 = PGDPTECHX_SA_P1M1ML12 - INFTEFF_NSA ",]
dfa = msp.panel_calculator(dfd, calcs=calcs, cids=cids)
dfd = msm.update_df(dfd, dfa)
dfb = dfd[dfd["xcat"].isin(["FXTARGETED_NSA", "FXUNTRADABLE_NSA"])].loc[
:, ["cid", "xcat", "real_date", "value"]
]
dfba = (
dfb.groupby(["cid", "real_date"])
.aggregate(value=pd.NamedAgg(column="value", aggfunc="max"))
.reset_index()
)
dfba["xcat"] = "FXBLACK"
fxblack = msp.make_blacklist(dfba, "FXBLACK")
xcatx = [
"XPGDPTECHX_SA_P1M1ML12",
"XPGDPTECH_SA_P1M1ML12",
"PGDPTECHX_SA_P1M1ML12",
"PGDPTECH_SA_P1M1ML12",
]
for xc in xcatx:
calc_eur = [f"{xc}vBM = {xc} - iEUR_{xc}"]
calc_usd = [f"{xc}vBM = {xc} - iUSD_{xc}"]
calc_eud = [f"{xc}vBM = {xc} - 0.5 * ( iEUR_{xc} + iUSD_{xc} )"]
dfa_eur = msp.panel_calculator(dfd, calcs=calc_eur, cids=cids_eur)
dfa_usd = msp.panel_calculator(dfd, calcs=calc_usd, cids=cids_usd)
dfa_eud = msp.panel_calculator(dfd, calcs=calc_eud, cids=cids_eud)
dfa = pd.concat([dfa_eur, dfa_usd, dfa_eud])
dfd = msm.update_df(dfd, dfa)
Relative output price growth trends across countries are plausible predictors of FX return trends. That is because they indicate improving terms-of-trade and a greater bias towards monetary tightening. A country whose production prices grow faster than in the U.S. or the euro area has a better chance to experience currency appreciation against either of these two benchmarks.
Empirically, i.e., since 2000 and for 29 DM and EM currency areas, output price trend differentials have been positively correlated with subsequent returns both at a monthly and quarterly frequency. For both broad and narrow output price trends this relationship has been highly significant.
xcatx = ["PGDPTECH_SA_P1M1ML12vBM", "FXXR_VT10"]
cidx = cids
cr_crr = msp.CategoryRelations(
dfd,
xcats=xcatx,
cids=cidx,
freq="Q",
lag=1,
xcat_aggs=["last", "sum"],
start="2000-01-01",
blacklist=fxblack,
)
cr_crr.reg_scatter(
title="Estimated output price differentials and subsequent FX forward returns, 29 countries since 2000",
labels=False,
coef_box="lower left",
xlab="Estimated broad output price growth of the economy, %oya, versus benchmark (USD or EUR)",
ylab="FX forward return, targeted to 10% ar vol, versus benchmark (USD or EUR), next quarter",
prob_est="map"
)
PGDPTECH_SA_P1M1ML12vBM misses: ['DEM', 'ESP', 'EUR', 'FRF', 'ITL', 'NLG', 'SGD', 'USD'].
FXXR_VT10 misses: ['DEM', 'ESP', 'FRF', 'ITL', 'NLG', 'USD'].
xcatx = ["PGDPTECHX_SA_P1M1ML12vBM", "FXXR_VT10"]
cidx = cids
cr_crr = msp.CategoryRelations(
dfd,
xcats=xcatx,
cids=cidx,
freq="Q",
lag=1,
xcat_aggs=["last", "sum"],
start="2000-01-01",
blacklist=fxblack,
)
cr_crr.reg_scatter(
title="Narrow output price differentials and subsequent FX forward returns, 29 countries since 2000",
labels=False,
coef_box="lower left",
xlab="Estimated narrow output price growth of the economy, %oya, versus benchmark (USD or EUR)",
ylab="FX forward return, targeted to 10% ar vol, versus benchmark (USD or EUR), next quarter",
prob_est="map"
)
PGDPTECHX_SA_P1M1ML12vBM misses: ['AUD', 'DEM', 'ESP', 'EUR', 'FRF', 'ITL', 'NLG', 'NZD', 'SGD', 'USD'].
FXXR_VT10 misses: ['DEM', 'ESP', 'FRF', 'ITL', 'NLG', 'USD'].
Quantamental data of PPI inflation have been negatively related to subsequent swap returns across the major tenors.
xcatx = ["PPIH_SA_P6M6ML6AR", "DU02YXR_NSA"]
cidx = list(
set(cids_exp)
- set(["BRL", "CNY", "DEM", "ESP", "FRF", "ITL", "NLG", "PEN", "PHP", "RON"])
) # missing cids
cr = msp.CategoryRelations(
dfd,
xcats=xcatx,
cids=cidx,
freq="M",
lag=1,
fwin=1,
xcat_aggs=["last", "sum"],
xcat_trims=[100, 10],
start="2000-01-01",
years=None,
)
cr.reg_scatter(
title="PPI inflation and subsequent 2-year IRS returns since 2000 across all markets",
labels=False,
coef_box="upper right",
xlab="PPI trend, %6m/6m, ar, seasonally-adjusted, end of month",
ylab="Next month's 2-year IRS fixed receiver returns",
prob_est="map",
)
Appendices #
Appendix 1: How technical macro trends are estimated #
The basics in a nutshell #
Unlike market trends, trends in the macro quantamental space refer to fundamental economic changes as observed by financial markets. Since broad trends in many areas are reported with long lags, their timely estimation requires some econometric modelling. And since these models plausibly change over time, their construction for the purpose of backtesting and future trading requires some automation, by combining econometrics with machine learning. A practical approach to such technical macro trends is “two-stage supervised learning”. Its first stage is scouting features (predictors), by applying a regularization algorithm, such as “elastic net”, to available data sets during the regular release cycle, which identifies competitive features based on timelines and predictive power. Sequential scouting gives feature vintages. The second stage evaluates various candidate models based on the concurrent feature vintages and selects at any point in time one with the best historic predictive power. Sequential evaluation gives data vintages. For a more thorough explanation of this principle, view the summary here .
Conventional econometric models, such as those used by central banks, are immutable and not a valid basis for backtesting trading strategies. That is because they are being built and redesigned with hindsight and do not aim at replicating perceived economic trends in real time. Even if estimated parameters are sequentially updated, hyperparameters (structural model decisions) are not. By contrast, technical macro trends evolve in accordance with three types of changes arising from the information flow: (1) new information on fundamental developments (as captured by static prediction models), (2) revisions of prediction model parameters (implemented by some nowcasting frameworks), and (3) changes in prediction model structure (implemented by supervised statistical learning). In practice, this requires dealing with three major challenges: the feature selection problem, the publication lag and frequency problem, and the prediction problem.
The feature selection problem #
Many broad macro indicators such as national accounts and corporate earnings, are published in low frequency and with considerable lags after the observed period. That is why markets predict their forthcoming releases based on more timely higher-frequency indicators. In the context of machine learning, unpublished key indicators become targets and the higher-frequency predictors become features (aka predictors) or at least feature candidates.
The choice of features is a key structural model decision. The challenge is to allow the algorithm to support that choice in a consistent fashion for the past, present and future. A feature should only be added at any given real time date if it had helped predicting the target prior to the date. JPMaQS makes this choice by applying the elastic net regularization method to all plausible features used by the market at a given point in the data cycle. All plausible features refers to all indicators that are rated as important by market news services (release calendars) that are logically and directly related to the target. For example, the plausible features for annual GDP growth rate are mostly annual percent changes or differences in activity indices. Asset returns or analyst predictions do not qualify. Point in the data cycle means a point in time between two first releases of the low-frequency target, which is related to the available subset of predictors.
During the length of the cycle, JPMaQS considers the growing set of features as forecasting candidates and if a feature has value as a predictor even just one day in the cycle - according to the elastic net - it is pre-selected as feature of the model going forward. This pre-selection is revised annually.
The lag and frequency problem #
Economic data that informs on activity of an observed period (typically a month) are released with varying delays. On any given day, the market sees only a smaller or larger subset of all interesting indicators for a recent period. This is equivalent to what econometricians call the “jagged edge” of recent data sets, the appearance of various “non-available” entries in the data matrix used for low-frequency indicator prediction.
These non-available entries will be filled by predictions based on all available high-frequency values. For example, if a feature is available for January but not February and March, its values for February and March will be equal to the January value plus a prediction of change based on its correlation with all other features that have already been released for February and March respectively. For further information, see Appendix 2 below.
The prediction problem #
If one has chosen the right features and “filled in” their missing values, one needs to formalize an appropriate and robust relation between the features and their target. Estimating such a relation may not be very stable if there are many features and short time series. Hence, JPMaQS predicts the low-frequency target value by using the values of the first principal component of the feature set for all high-frequency periods in question. The prediction itself is than done with ordinary least squares regression. Linear regression on principle components is a most simple prediction method that has been very popular in market economics for decades. For more information, see Appendix 3 .
Important technical details #
Some of the most financially significant economic indicators suffer from the low frequency with which they are published. Fortunately, indicators of a higher frequency often prevail which indirectly inform on forthcoming low-frequency tickers. For example, the task of calculating the Gross Domestic Product price deflator (PGDP) inexorably renders it a quarterly observed macro-variable. Incremental changes in RGDP can nevertheless be estimated between releases by looking at innovations in monthly macro variables such as the unemployment rate, industrial production, and consumer confidence surveys.
Technical Indicators was thus born out of a need for a universal machine which maps high frequency macro-variables into an effective present estimate of lower frequency variables of interest - without losing economic plausibility and intuition in the process. In designing such a system, we have addressed three key methodological issues viz.:
(1) Pre-selection of features : How can we make an economically plausible preliminary assessment of which high-frequency variables to include, void of forward looking bias?
(2) Dealing with release schedule inequality : Upon lining up high-frequency series for prediction purposes, one may find some of the recent values to be missing. These NaNs are spawned by series which have yet to be released in the latest available observation period. How does one go about handling this so-called jagged edge? (See figure below).
(3) Estimating the low-frequency series : Finally, a map between input features (high-frequency variables) and response (low-frequency variable) needs to be learned. How do we formalize such a relationship?
The technical details of these three points are presented below.
We will assume that across our features and response variables, we are dealing with growth rates (or difference in levels) over the same window of time (typically, annually). For example, for PGDP (an Index) we look at the percentage change over a year ago. Applying these transformations will in the majority of cases guarantee that our series are stationary. To curb the effect of outliers in the data, it may be desirable to further introduce some level of winsorization , e.g. by applying a log transformation beyond a certain threshold.
Pre-selection of Features #
Deciding which features to use in our model is a delicate matter. Should we invoke considerable domain-expertise by having an economist pre-select our feature space, or should we throw anything but the kitchen sink at our problem? Neither approach is strictly speaking desirable, being respectively prone to hindsight bias and numerical noise / short fat data issues. Rather, we desire a systematic feature reduction technique (i.e. elastic net ) which can help prune our feature space. To mimic the data release schedule, we will make a running assessment of which features economist plausibly would consider adding to their model between quarterly releases. As information is released between quarters, we shall consider this growing set of macro-indicators as forecasting candidates. If a feature at any point during this quarterly life-cycle exhibits explanatory power, we consider it as pre-selected for the purpose of steps (2) and (3).
More formally, let \(q_0, q_1, q_2, ..., q_n\) be a series of quarterly releases of the response variable, and let \(\{q_i, q_{i+1}\}\) be any two contiguous releases. Let \(t[i], t[i+1]\) be the times at which they are released and let \(t \in [t[i], t[i+1]) \equiv \mathbb{T}_{i+1}\) be some time at which we desire an estimate of the quarterly release. Furthermore, let \(\mathbb{F}_{i+1}=\{f_1,f_2,...,f_p\}\) be the set of macro-predictors (features) released in the interval \(\mathbb{T}_{i+1}\) . Typically these predictors have monthly observations, but importantly they are not all released at the same time.
Now suppose we are in the business of forecasting \(q_{i+1}\) . First we will look at the previous release interval \(\mathbb{T}_i \equiv[t[i-1],t[i])\) and rank all macro-economic indicators according to their release date. For this exercise we are only interested in those releases which have observation periods inside of \(\mathbb{T}_i\) . Now \(\forall t \in \mathbb{T}_{i}\) let \(\mathbb{F}_{t,i}\) be the space of all such features that have been released in \([t[i-1],t]\) (e.g. in today is Feb 27 we’d consider all features with releases between this date and the previous quarterly release). We align all features \(f \in \mathbb{F}_{t,i}\) based on their observation periods in the matrix \(X_t\) , forward-fill the jagged edge, and finally shift all observation periods \(\Delta\) months forward, where \(\Delta\) is the number of months between the last observation period in \(X_t\) and the last observation period in \(q_t\) . Next we extract the important features at time \(t\) by performing a constrained regression of the quarterly release against this time-shifted feature matrix, specifically via a cross-validated Elastic Net. By normalizing features inside the cross-validation pipeline, we allow ourselves to read-off the magnitude of the regression coefficients directly as importance weights, without leaking in future information. Importantly, features with zero coefficients are deemed irrelevant for the forecast at time \(t\) .
Let \(\mathbb{I}_{t,i} \subseteq \mathbb{F}_{t,i}\) be the subset of features thus selected, then for the purpose of our forecast in step 2 we will maximally consider using all of those features we at some point picked out during \(\mathbb{T}_i\) . Specifically, for our \(q_{i+1}\) forecast we will use the features:
NOTE : In practice, we only perform pre-selection once per annum to reduce the computational burden.
Dealing with Release Schedule Inequality (the “Jagged Edge”) #
Having established which features we want to consider at time \(t\) , we can construct the associated feature matrix \(X_t\) which will be used in learning the map \(f: X \mapsto q\) . Again, we are faced with the jagged edge: certain features might have missing recent observations in \(X_t\) as they are yet to be published.
To overcome this issue, we make two important empirical observations: first , individual features typically exhibit strong correlation with their first lag. Secondly , the first difference of \(X_t\) showns non-zero cross correlations between features. Using the notational convention that \(x_{i,:}\) is the \(i^{th}\) row of \(X_t\) , this motivates us to postulate that \(x_{i,:}\) obeys the dynamical relationship
where \(\Sigma\) is a covariance matrix the off-diagonal entries of which need not be zero. Prosaically, feature values at observation point \(i\) are assumed multi-normally distributed, centered around their most recent value, but not independently so. The benefit of this model is that it is easy to estimate. Crucially, it also enables us to fill out NaNs in \(X_t\) in a “non-trivial” way by computing conditional expectations based of partially observed information (the publication of a subset of features). Effectively, shocks in observed values vis-a-vis their expectation will propagate to unobserved values.
To see how this works, consider the simple case of a bivariate feature matrix \(X_t \in \mathbb{R}^{N \times 2}\) for which \(x_{:,1}\) is completely specified but \(x_{:,2}\) has a missing value at the end ( \(x_{N;2} \in \emptyset\) ). We are interested in computing \(\mathbb{E}[x_{N;2} | x_{N;1}=x]\) - the conditional expectation for the missing value in feature 2, given our knowledge of the most recent realisation in feature 1. Assuming the joint distribution \(\forall i\) :
where the \(\sigma_i\) s codify variance and \(\rho\) the correlation, it can be shown that
Intuitively this tells us that if the (differenced) series are independent ( \(\rho=0\) ) then the expected value for \(x_{N;2}\) is just the most recently available observation: \(x_{N-1;2}\) . On the other hand, if \(\rho \neq 0\) , the surprise from the observation in feature 1 (i.e. the observed feature 1 value less its marginal expectation), perturbs our expectation for \(x_{N,2}\) away from \(x_{N-1;2}\) with magnitude \(\rho \sigma_2 /\sigma_1\) . If the surprise is positive (negative) and \(\rho>0\) ( \(\rho<0\) ) this would entail a bump upwards in our expectation for \(x_{N;2}\) . On the other hand, if the surprise is positive (negative) and \(\rho<0\) ( \(\rho > 0\) ) we would lower our expectations for the value of \(x_{N;2}\) .
The same general idea extends to feature matrices of higher dimensionality. For an overview of computing conditional expectations with the multivariate normal distribution the reader is referred to the Wikipedia entry.
Estimating the Low-frequency Series #
Upon formalizing a relationship between input features and response we follow a somewhat familiar path in the now-casting literature which is deploy a factor-model. Specifically, we extract the first principal component of the feature-matrix alongside the first and second lag thereof and run the regression:
(Here \(PC_1\) is the first principal component of \(X_t\) and \(\text{lag}(PC_1,n)\) is the same vector shifted \(n\) units forward, while \(\epsilon\) is a noise term). The coefficients are immediately obtained through ordinary least squares (OLS) using the available (quarterly) data. The model is thus not only easy to estimate, but also easy to interpret. The inclusion of the lagged variables is motivated by the idea that running monthly observations inside a quarter all “add up” to the quarterly release.
Finally, by plugging in the final entry of \([PC_1, \text{lag}(PC_1,1), \text{lag}(PC_1,2)]\) into this relationship we obtain the present purported value of the quarterly variable.
Methodological Pseudo-code #
To summarise, technical indicators operates along the following lines:
For \(t\) in all possible ordered feature releases :{
If \(t\) is a new year: Pre-select features \(\mathbb{I}\) for consideration using a running elastic net regression (step (1)).
Construct the feature matrix \(X_t\) using features \(\mathbb{I}\) . Populate the jagged edge using a conditional multivariate normal assumption (step (2)).
Regress the first PC of \(X_t\) against the quarterly variable (overlapping quarterly observations only). Use the last entry in \(X_t\) to make an estimate as to where the quarterly variable is “now” (step (3)).
}
Appendix 2: Feature candidates output price trends #
Broad output price trends - developed markets #
AUD
-
Brent Forties Oseberg Month 1 Europe FOB - AUD
-
Australia, TD-MI Inflation Gauge, Index, Melbourne Institute of Applied Economic & Social Research, Index
-
AUD, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
CAD
-
NYMEX - Light Crude Oil - CAD
-
Canada, Producer Price Index, Industrial, Total, Statistics Canada, Index
-
Canada, Consumer Price Index, Total, SA, Statistics Canada, Index
-
CAD, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
-
Canada wages composite
CHF
-
Brent Forties Oseberg Month 1 Europe FOB - CHF
-
Switzerland, Producer Price Index, Total, Swiss Federal Statistical Office (Bundesamt fuer Statistik), Index
-
Switzerland, Consumer Price Index, Total, Base Year 2015, Swiss Federal Statistical Office (Bundesamt fuer Statistik), Index
-
CHF, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
EUR
-
Brent Forties Oseberg Month 1 Europe FOB - EUR
-
Euro Area 19, Producer Price Index, Domestic, Industrial Domestic Output Prices - Total Industry (excluding Construction), Eurostat, Index
-
Euro Area, ECB, Consumer Price Index (HICP), Institution Originating the Data: ECB, Eurostat, Overall Index
-
EUR, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
GBP
-
Brent Forties Oseberg Month 1 Europe FOB - GBP
-
United Kingdom, Producer Price Index, Output, Manufactured Products for Domestic Market, U.K. Office for National Statistics (ONS), Index
-
New, Consumer Price Inflation, NOT seasonal adjusted, TCPI after, Previously RPI, U.K. Office for National Statistics (ONS), Index, U.K. Office for National Statistics (ONS),
-
GBP, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
-
United Kingdom, Average Weekly Earnings, Total Economy, Total Pay, SA, GBP
JPY
-
Brent Forties Oseberg Month 1 Europe FOB - JPY
-
Japan, Producer Price Index, Goods, Total, Japanese Statistics Bureau, Ministry of Internal Affairs & Communications, Index
-
Japan, Consumer Price Index, Total, All Japan, Japanese Statistics Bureau, Ministry of Internal Affairs & Communications, Index
-
JPY, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
-
Japan wages composite
KRW
-
Brent Forties Oseberg Month 1 Europe FOB - KRW
-
South Korea, Producer Price Index, Total, Statistics Korea (KoSIS), Index
-
South Korea, Consumer Price Index, Total, Statistics Korea (KoSIS), Index
-
KRW, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
-
South Korea, Wages & Salaries, Wages, Sector, All Scale, Total, KRW, Ministry of Employment and Labor
NOK
-
Brent Forties Oseberg Month 1 Europe FOB - NOK
-
Norway, Producer Price Index, Total (Whole Economy), Statistics Norway, Index
-
Norway, Consumer Price Index, Statistics Norway, Index
-
NOK, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
NZD
-
Brent Forties Oseberg Month 1 Europe FOB - NZD
-
NZD, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
SEK
-
Brent Forties Oseberg Month 1 Europe FOB - SEK
-
Sweden, Producer Price Index, Total, Total, Statistics Sweden (SCB), Index
-
Sweden, Consumer Price Index, CPIF, Statistics Sweden (SCB), Index
-
Sweden wages composite
-
SEK, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
SGD
-
Brent Forties Oseberg Month 1 Europe FOB - SGD
-
Singapore, Manufactured Products Price Index, Total, Singapore Department of Statistics (SingStat), Index
-
Singapore, Consumer Price Index, Total, SA, Singapore Department of Statistics (SingStat), Index
-
SGD, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
USD
-
NYMEX - Light Crude Oil
-
United States, Producer Price Index, FD-ID, Final Demand, Overall, U.S. Bureau of Labor Statistics (BLS), Index
-
United States, Consumer Price Index, All Urban Consumers, U.S. City Average, All Items, SA, U.S. Bureau of Labor Statistics (BLS), Index
-
USD, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
-
United States, Earnings, Average Weekly Earnings, All Employees, Total Private, SA, USD, U.S. Bureau of Labor Statistics (BLS)
Broad output price trends - developing markets #
BRL
-
Brent Forties Oseberg Month 1 Europe FOB - BRL
-
Brazil, Producer Price Index, Total, Brazilian Institute of Geography & Statistics (IBGE), Index
-
Brazil, Consumer Price Index, Extended National, Total (IPCA), SA, Total,Brazilian Institute of Geography & Statistics (IBGE), Index
-
Brazil, OECD MEI, Labour Compensation, Earnings, All Activities, Monthly, BRL, OECD
-
BRL, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
CLP
-
Brent Forties Oseberg Month 1 Europe FOB - CLP
-
Chile, Producer Price Index, Total, Chilean National Statistics Institute (INE, Instituto Nacional de Estadistica), Index
-
Chile, Consumer Price Index, Total, Chilean National Statistics Institute (INE, Instituto Nacional de Estadistica), Index
-
Chile, Earnings, Total, Current Prices, CLP, Chilean National Statistics Institute (INE, Instituto Nacional de Estadistica)
-
CLP, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
CNY
-
Brent Forties Oseberg Month 1 Europe FOB - CNY
-
China, Consumer Price Index, National, All Areas, Total, China National Bureau of Statistics (NBS), Change P/P
-
China, Producer Price Index, National, By Commodity, Total ,Total, China National Bureau of Statistics (NBS), Change P/P
-
CNY, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
COP
-
Brent Forties Oseberg Month 1 Europe FOB - COP
-
Colombia, Producer Price Index, Production, National, Total, Colombian National Administrative Department of Statistics (DANE), Index
-
Colombia, Consumer Price Index, Total, Colombian National Administrative Department of Statistics (DANE), Index
-
Colombia, Earnings, Wage Index, Nominal, Retail Trade, Total, Index, Central Bank of Colombia
-
COP, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
CZK
-
Brent Forties Oseberg Month 1 Europe FOB - CZK
-
Czech Republic, Producer Price Index, Industry, Total, Czech Statistical Office, Index
-
Czech Republic, Consumer Price Index, Total, Czech Statistical Office, Index
-
Czech Republic, Wages & Salaries, Gross Wages, Average Monthly, Full-Time, Total, CZK, Czech Statistical Office
-
CZK, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
HUF
-
Brent Forties Oseberg Month 1 Europe FOB - HUF
-
Hungary, Producer Price Index, Total Economy, Total, Total Industry, Hungarian Central Statistical Office (HCSO), Index
-
Hungary, Consumer Price Index, Groups of Expenditure, All Items, Total, PP=100, Hungarian Central Statistical Office (HCSO), Index
-
Hungary, Earnings, Net Monthly, Full Time Employees, National Economy, Without Tax Benefits, Monthly Regular Earnings, Total, HUF, Hungarian Central Statistical Office (HCSO)
-
HUF, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
IDR
-
Brent Forties Oseberg Month 1 Europe FOB - IDR
-
Indonesia, Producer Price Index, Total, Statistics Indonesia (Badan Pusat Statistik, BPS), Index
-
Indonesia, Consumer Price Index, Total, General, Statistics Indonesia (Badan Pusat Statistik, BPS), Index
-
IDR, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
ILS
-
Brent Forties Oseberg Month 1 Europe FOB - ILS
-
Israel, Producer Price Index, Domestic, Total, Wholesale, Total, Israel Central Bureau of Statistics (CBS), Index
-
Israel, Consumer Price Index, Total, Israel Central Bureau of Statistics (CBS), Index
-
Isreal wages composite
-
ILS, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
INR
-
Brent Forties Oseberg Month 1 Europe FOB - INR
-
India, Wholesale Price Index, All Commodities, Indian Ministry of Statistics & Programme Implementation (MoS&PI), Index
-
India, Consumer Price Index, Urban & Rural Combined, Indian Ministry of Statistics & Programme Implementation (MoS&PI), Index
-
INR, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
MXN
-
Brent Forties Oseberg Month 1 Europe FOB - MXN
-
Mexico, Producer Price Index, Total, Including Oil & Services, Mexican National Institute of Geography & Statistics, Index
-
Mexico, Consumer Price Index, Total, Mexican National Institute of Geography & Statistics, Index
-
Mexico wages composite
-
MXN, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
MYR
-
Brent Forties Oseberg Month 1 Europe FOB - MYR
-
Malaysia, Producer Price Index, Total, Department of Statistics Malaysia (DOSM), Index
-
Malaysia, Consumer Price Index, Total, Department of Statistics Malaysia (DOSM), Index
-
Malaysia, Wages & Salaries, Manufacturing, MYR, Department of Statistics Malaysia (DOSM)
-
MYR, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
PEN
-
Brent Forties Oseberg Month 1 Europe FOB - PEN
-
Peru, Producer Price Index, National, Total, Peruvian National Institute of Statistics & Informatics (INEI), Index
-
Peru, Consumer Price Index, Lima, Total, Peruvian National Institute of Statistics & Informatics (INEI), Index
-
Peru, Monthly Average Income, Lima, Total, 3 Month Moving Average, PEN, Central Reserve Bank of Peru
-
PEN, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
PHP
-
Brent Forties Oseberg Month 1 Europe FOB - EURO
-
Philippines, Producer Price Index, Total Manufacturing, Philippine Statistics Authority, Index
-
Philippines, Consumer Price Index, Total, Total, Philippine Statistics Authority, Index
-
PHP, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
PLN
-
Brent Forties Oseberg Month 1 Europe FOB - PLN
-
Poland, Producer Price Index, Industry, Sold Production Price Index, Polish Central Statistical Office (GUS), Index
-
Poland, Harmonized CPI, Total, Polish Central Statistical Office (GUS), Index
-
Poland, Wages & Salaries, Enterprise Sector, Gross Monthly Average, Total, PLN, Polish Central Statistical Office (GUS)
-
PLN, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
RON
-
Brent Forties Oseberg Month 1 Europe FOB - RON
-
Romania, Producer Price Index, Total Market, Total, Romanian National Institute of Statistics, Index
-
Romania, Consumer Price Index, Total, PP=100, Romanian National Institute of Statistics, Index
-
Romania, Wages & Salaries, Monthly Gross Average, Current Prices, Per Employee, RON, Romanian National Institute of Statistics
-
RON, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
RUB
-
Brent Forties Oseberg Month 1 Europe FOB - RUB
-
Russia, Producer Price Index, Domestic Market, Total, Total, Russian Federal State Statistics Service (Rosstat), Index
-
Russia, Consumer Price Index, Total, PP=100, Russian Federal State Statistics Service (Rosstat), Index
-
Russia, Wages & Salaries, Nominal Wages, Average Monthly, Total, RUB, Russian Federal State Statistics Service (Rosstat
-
RUB, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
THB
-
Brent Forties Oseberg Month 1 Europe FOB - THB
-
Thailand, Producer Price Index, Total, Thailand Bureau of Trade & Economic Indices, Index
-
Thailand, Consumer Price Index, Total, Thailand Bureau of Trade & Economic Indices, Index
-
Thailand, Wages & Salaries, By Industry, Total, Total, THB, Bank of Thailand
-
THB, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
TRY
-
Brent Forties Oseberg Month 1 Europe FOB - TRY
-
Turkey, Producer Price Index, Domestic, Total, Index
-
Turkey, Consumer Price Index, Total, Index
-
TRY, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
TWD
-
Brent Forties Oseberg Month 1 Europe FOB - TWD
-
Taiwan, Producer Price Index, Total, Taiwan Directorate-General of Budget, Accounting & Statistics, Index
-
Taiwan, Consumer Price Index, Total, SA, Taiwan Directorate-General of Budget, Accounting & Statistics, Index
-
Taiwan, Monthly Average Income, Industry & Services, Total, TWD, TWD, Taiwan Directorate-General of Budget, Accounting & Statistics
-
TWD, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
ZAR
-
Brent Forties Oseberg Month 1 Europe FOB - ZAR
-
South Africa, Producer Price Index, Manufactured Goods, Final, Total, Total, South African Statistics (Stat SA), Index
-
South Africa, Consumer Price Index, All Country, All Items, South African Statistics (Stat SA), Index
-
ZAR, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
Broad output price trends- euro countries #
DEM
-
Brent Forties Oseberg Month 1 Europe FOB - EURO
-
Germany, Producer Price Index, Industrial Products, Total, German Federal Statistical Office (Statistisches Bundesamt), Index
-
Germany, Consumer Price Index, Total, German Federal Statistical Office (Statistisches Bundesamt), Index
-
German wages composite
-
EUR, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
ESP
-
Brent Forties Oseberg Month 1 Europe FOB - EURO
-
Spain, Producer Price Index, Industrial, Total, Spanish National Statistics Institute (INE), Index
-
Spain, Consumer Price Index, Total, Spanish National Statistics Institute (INE), Chained, Index
-
EUR, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
FRF
-
Brent Forties Oseberg Month 1 Europe FOB - EURO
-
France, Producer Price Index, Industry, Total, Overall Industry, Index, French National Institute of Statistics & Economic Studies (INSEE), Basic Prices
-
France, Consumer Price Index, All Items, SA,French National Institute of Statistics & Economic Studies (INSEE), Index
-
EUR, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
ITL
-
Brent Forties Oseberg Month 1 Europe FOB - EURO
-
Italy, Producer Price Index, Total, Total Industry Excluding Construction, Italian National Institute of Statistics (Istat), Index
-
Italy, Consumer Price Index, Total with Tobacco, Italian National Institute of Statistics (Istat), Index
-
Italy, Wages & Salaries, Wages, Hourly, Total, Index
-
EUR, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
NLG
-
Brent Forties Oseberg Month 1 Europe FOB - EURO
-
Netherlands, Producer Price Index, Manufactured Products, Total, Output Prices,Statistics Netherlands (CBS), Index
-
Netherlands, Consumer Price Index, Total,Statistics Netherlands (CBS), Index
-
Netherlands, Wages composite
-
EUR, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
Narrow output price trends - developed countries #
CAD
-
Canada, Producer Price Index, Industrial, Total, Statistics Canada, Index
-
Canada, Consumer Price Index, Total, SA, Statistics Canada, Index
-
Canada wages composite
CHF
-
Switzerland, Producer Price Index, Total, Swiss Federal Statistical Office (Bundesamt fuer Statistik), Index
-
Switzerland, Consumer Price Index, Total, Base Year 2015, Swiss Federal Statistical Office (Bundesamt fuer Statistik), Index
EUR
-
Euro Area 19, Producer Price Index, Domestic, Industrial Domestic Output Prices - Total Industry (excluding Construction), Eurostat, Index
-
Euro Area, ECB, Consumer Price Index (HICP), Institution Originating the Data: ECB, Eurostat, Overall Index
GBP
-
United Kingdom, Producer Price Index, Output, Manufactured Products for Domestic Market, U.K., Office for National Statistics (ONS), Index
-
New, Consumer Price Inflation, NOT seasonal adjusted, TCPI after, Previously RPI, U.K. Office for National Statistics (ONS), Inex
-
United Kingdom, Average Weekly Earnings, Total Economy, Total Pay, SA, GBP, Office for National Statistics (ONS)
JPY
-
Japan, Producer Price Index, Goods, Total, Japanese Statistics Bureau, Ministry of Internal Affairs & Communications, Index
-
Japan, Consumer Price Index, Total, All Japan, Japanese Statistics Bureau, Ministry of Internal Affairs & Communications, Index
-
Japan wages composite
KRW
-
South Korea, Producer Price Index, Total, Statistics Korea (KoSIS), Index
-
South Korea, Consumer Price Index, Total, Statistics Korea (KoSIS), Index
-
South Korea, Wages & Salaries, Wages, Sector, All Scale, Total, KRW, Ministry of Employment and Labor
NOK
-
Norway, Producer Price Index, Total (Whole Economy), Statistics Norway, Index
-
Norway, Consumer Price Index, Statistics Norway, Index
NZD
-
Brent Forties Oseberg Month 1 Europe FOB - NZD
-
NZD, Nominal effective exchange rate, JPMorgan
-
Export price index, based on commodity trade
SEK
-
Sweden, Producer Price Index, Total, Total, Statistics Sweden (SCB), Index
-
Sweden, Consumer Price Index, CPIF, Statistics Sweden (SCB), Index
-
Sweden wages composite
SGD
-
Singapore, Manufactured Products Price Index, Total, Singapore Department of Statistics (SingStat), Index
-
Singapore, Consumer Price Index, Total, SA, Singapore Department of Statistics (SingStat), Index
USD
-
United States, Producer Price Index, FD-ID, Final Demand, Overall, U.S. Bureau of Labor Statistics (BLS), Index
-
United States, Consumer Price Index, All Urban Consumers, U.S. City Average, All Items, SA, U.S. Bureau of Labor Statistics (BLS), Index
-
United States, Earnings, Average Weekly Earnings, All Employees, Total Private, SA, USD, U.S. Bureau of Labor Statistics (BLS)
Narrow output price trends - Developing countries #
BRL
-
Brazil, Producer Price Index, Total, Brazilian Institute of Geography & Statistics (IBGE), Index
-
Brazil, Consumer Price Index, Extended National, Total (IPCA), SA, Total,Brazilian Institute of Geography & Statistics (IBGE), Index
-
Brazil, OECD MEI, Labour Compensation, Earnings, All Activities, Monthly, BRL, OECD
CLP
-
Brent Forties Oseberg Month 1 Europe FOB - CLP
-
Chile, Producer Price Index, Total, Chilean National Statistics Institute (INE, Instituto Nacional de Estadistica), Index
-
Chile, Consumer Price Index, Total, Chilean National Statistics Institute (INE, Instituto Nacional de Estadistica), Index
-
Chile, Earnings, Total, Current Prices, CLP, Chilean National Statistics Institute (INE, Instituto Nacional de Estadistica)
CNY
-
China, Consumer Price Index, National, All Areas, Total, China National Bureau of Statistics (NBS), Change P/P
-
China, Consumer Price Index, National, All Areas, Total, China National Bureau of Statistics (NBS), Change P/P
COP
-
Colombia, Producer Price Index, Production, National, Total, Colombian National Administrative Department of Statistics (DANE), Index
-
Colombia, Consumer Price Index, Total, Colombian National Administrative Department of Statistics (DANE), Index
-
Colombia, Earnings, Wage Index, Nominal, Retail Trade, Total, Index, Central Bank of Colombia
CZK
-
Czech Republic, Producer Price Index, Industry, Total, Czech Statistical Office, Index
-
Czech Republic, Consumer Price Index, Total, Czech Statistical Office, Index
-
Czech Republic, Wages & Salaries, Gross Wages, Average Monthly, Full-Time, Total, CZK, Czech Statistical Office
HUF
-
Hungary, Producer Price Index, Total Economy, Total, Total Industry, Hungarian Central Statistical Office (HCSO), Index
-
Hungary, Consumer Price Index, Groups of Expenditure, All Items, Total, PP=100, Hungarian Central Statistical Office (HCSO), Index
-
Hungary, Earnings, Net Monthly, Full Time Employees, National Economy, Without Tax Benefits, Monthly Regular Earnings, Total, HUF, Hungarian Central Statistical Office (HCSO)
IDR
-
Indonesia, Producer Price Index, Total, Statistics Indonesia (Badan Pusat Statistik, BPS), Index
-
Indonesia, Consumer Price Index, Total, General, Statistics Indonesia (Badan Pusat Statistik, BPS), Index
ILS
-
Israel, Producer Price Index, Domestic, Total, Wholesale, Total, Israel Central Bureau of Statistics (CBS), Index
-
Israel, Consumer Price Index, Total, Israel Central Bureau of Statistics (CBS), Index
-
Isreal wages composite
INR
-
India, Wholesale Price Index, All Commodities, Indian Ministry of Statistics & Programme Implementation (MoS&PI), Index
-
India, Consumer Price Index, Urban & Rural Combined, Indian Ministry of Statistics & Programme Implementation (MoS&PI), Index
MXN
-
Mexico, Producer Price Index, Total, Including Oil & Services, Mexican National Institute of Geography & Statistics, Index
-
Mexico, Consumer Price Index, Total, Mexican National Institute of Geography & Statistics, Index
-
Mexico wages composite
MYR
-
Malaysia, Producer Price Index, Total, Department of Statistics Malaysia (DOSM), Index
-
Malaysia, Consumer Price Index, Total, Department of Statistics Malaysia (DOSM), Index
-
Malaysia, Wages & Salaries, Manufacturing, MYR, Department of Statistics Malaysia (DOSM)
PEN
-
Peru, Producer Price Index, National, Total, Peruvian National Institute of Statistics & Informatics (INEI), Index
-
Peru, Consumer Price Index, Lima, Total, Peruvian National Institute of Statistics & Informatics (INEI), Index
-
Peru, Monthly Average Income, Lima, Total, 3 Month Moving Average, PEN, Central Reserve Bank of Peru
PHP
-
Philippines, Producer Price Index, Total Manufacturing, Philippine Statistics Authority, Index
-
Philippines, Consumer Price Index, Total, Total, Philippine Statistics Authority, Index
PLN
-
Poland, Producer Price Index, Industry, Sold Production Price Index, Polish Central Statistical Office (GUS), Index
-
Poland, Harmonized CPI, Total, Polish Central Statistical Office (GUS), Index
-
Poland, Wages & Salaries, Enterprise Sector, Gross Monthly Average, Total, PLN, Polish Central Statistical Office (GUS)
RON
-
Romania, Producer Price Index, Total Market, Total, Romanian National Institute of Statistics, Index
-
Romania, Consumer Price Index, Total, PP=100, Romanian National Institute of Statistics, Index
-
Romania, Wages & Salaries, Monthly Gross Average, Current Prices, Per Employee, RON, Romanian National Institute of Statistics
RUB
-
Russia, Producer Price Index, Domestic Market, Total, Total, Russian Federal State Statistics Service (Rosstat), Index
-
Russia, Consumer Price Index, Total, PP=100, Russian Federal State Statistics Service (Rosstat), Index
-
Russia, Wages & Salaries, Nominal Wages, Average Monthly, Total, RUB
THB
-
Thailand, Producer Price Index, Total, Thailand Bureau of Trade & Economic Indices, Index
-
Thailand, Consumer Price Index, Total, Thailand Bureau of Trade & Economic Indices, Index
-
Thailand, Wages & Salaries, By Industry, Total, Total, THB, Bank of Thailand
TRY
-
Turkey, Producer Price Index, Domestic, Total, Index
-
Turkey, Consumer Price Index, Total, Index
TWD
-
Taiwan, Producer Price Index, Total, Taiwan Directorate-General of Budget, Accounting & Statistics, Index
-
Taiwan, Consumer Price Index, Total, SA, Taiwan Directorate-General of Budget, Accounting & Statistics, Index
-
Taiwan, Monthly Average Income, Industry & Services, Total, TWD, Taiwan Directorate-General of Budget, Accounting & Statistics
ZAR
-
South Africa, Producer Price Index, Manufactured Goods, Final, Total, Total, South African Statistics (Stat SA), Index
-
South Africa, Consumer Price Index, All Country, All Items, South African Statistics (Stat SA), Index
Narrow output price trends - Euro countries #
DEM
-
Germany, Producer Price Index, Industrial Products, Total, German Federal Statistical Office (Statistisches Bundesamt), Index
-
Germany, Consumer Price Index, Total, German Federal Statistical Office (Statistisches Bundesamt), Index
-
German wages composite
ESP
-
Spain, Producer Price Index, Industrial, Total, Spanish National Statistics Institute (INE), Index
-
Spain, Consumer Price Index, Total, Spanish National Statistics Institute (INE), Chained, Index
FRF
-
France, Producer Price Index, Industry, Total, Overall Industry, Index, French National Institute of Statistics & Economic Studies (INSEE), Basic Prices
-
France, Consumer Price Index, All Items, SA, French National Institute of Statistics & Economic Studies (INSEE), Index
ITL
-
Brent Forties Oseberg Month 1 Europe FOB - EURO
-
Italy, Producer Price Index, Total, Total Industry Excluding Construction, Italian National Institute of Statistics (Istat), Index
-
Italy, Consumer Price Index, Total with Tobacco, Italian National Institute of Statistics (Istat), Index
-
Italy, Wages & Salaries, Wages, Hourly, Total, Index, Italian National Institute of Statistics (Istat)
NLG
-
Netherlands, Producer Price Index, Manufactured Products, Total, Output Prices,Statistics Netherlands (CBS), Index
-
Netherlands, Consumer Price Index, Total,Statistics Netherlands (CBS), Index
-
Netherlands, Wages composite
Appendix 3: Feature selection #
def feat_dict_to_pd(feat_dict):
new_dict={}
for key in feat_dict:
new_dict[key] = eval(feat_dict[key])
feat_dict=new_dict
features = set()
for i in feat_dict.values():
features = features.union(i)
psf = {}
order = {}
feat_list = list(features)
for key in feat_dict:
order[key[0:4]]=[True if e in feat_dict[key] else False for e in feat_list]
df = pd.DataFrame(order,index=feat_list)
return df
features_broad=requests.get("https://feature-selection-broad-prod.s3.eu-west-2.amazonaws.com/feature_selection_broad.json").json()
features_narrow = requests.get("https://feature-selection-narrow-prod.s3.eu-west-2.amazonaws.com/feature_selection_narrow.json").json()
The above github gists have the feature selection information for each cross section and the function easily visualises it, download the notebook to look at each cross section.
The steps to do so are as follows, choose if you want narrow or broad output prices and which cross section you want to visualise. Create the data by calling the function feat_dict_to_pd, with the input ‘features_narrow[“CID”]’ or ‘features_broad[“CID”]’. Then finally use seaborn heatmap to visualise the dataframe.
df = feat_dict_to_pd(features_narrow["USD"])
fig=sns.heatmap(df,cbar=False,cmap=sns.light_palette("#79C"),linecolor='black',linewidths=1,vmin=0)
Appendix 4: 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).