# Producer price inflation

## Contents

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