Imports #

Only the standard Python data science packages and the specialized macrosynergy package are needed.

import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns


import macrosynergy.management as msm
import macrosynergy.panel as msp
import macrosynergy.signal as mss
import macrosynergy.pnl as msn
import macrosynergy.visuals as msv

from macrosynergy.download import JPMaQSDownload

import warnings

warnings.simplefilter("ignore")
c:\Users\RSueppel\AppData\Local\anaconda3\envs\py311\Lib\site-packages\tqdm\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
  from .autonotebook import tqdm as notebook_tqdm

The JPMaQS indicators we consider are downloaded using the J.P. Morgan DataQuery API interface within the macrosynergy package. This is done by specifying ticker strings , formed by appending an indicator category code <category> to a currency area code <cross_section> . These constitute the main part of a full quantamental indicator ticker, taking the form DB(JPMAQS,<cross_section>_<category>,<info>) , where <info> denotes the time series of information for the given cross-section and category.

The following types of information are available:

  • value giving the latest available values for the indicator

  • eop_lag referring to days elapsed since the end of the observation period

  • mop_lag referring to the number of days elapsed since the mean observation period

  • grade denoting a grade of the observation, giving a metric of real time information quality.

After instantiating the JPMaQSDownload class within the macrosynergy.download module, one can use the download(tickers, start_date, metrics) method to obtain the data. Here tickers is an array of ticker strings, start_date is the first release date to be considered and metrics denotes the types of information requested.

# Cross-sections of interest
cids_dmca = [
    "AUD",
    "CAD",
    "CHF",
    "EUR",
    "GBP",
    "JPY",
    "NOK",
    "NZD",
    "SEK",
    "USD",
]  # DM currency areas
cids_dmec = ["DEM", "ESP", "FRF", "ITL", "NLG"]  # DM euro area countries
cids_latm = ["BRL", "COP", "CLP", "MXN", "PEN"]  # LatAm countries
cids_emea = ["CZK", "HUF", "ILS", "PLN", "RON", "RUB", "TRY", "ZAR"]  # EMEA countries
cids_emas = [
    "CNY",
    "IDR",
    "INR",
    "KRW",
    "MYR",
    "PHP",
    "SGD",
    "THB",
    "TWD",
]  # EM Asia countries (without "HKD")

cids_dm = cids_dmca + cids_dmec
cids_em = cids_latm + cids_emea + cids_emas

cids_cr = [
    "EIG",
    "EHY",
    "UIG",
    "UHY",
]  # High yield and investment grade USD and EUR corporate bonds
cids = sorted(cids_dm + cids_em + cids_cr)

cids_exp = sorted(
    list(set(cids) - set(cids_dmec) - set(cids_cr))
)  # cids expected in category panels excluding high yield and investment grade returns

# For FX analysis:
cids_nofx = ["USD", "EUR", "CNY", "SGD", "HKD", "EIG", "EHY", "UIG", "UHY"]
cids_dmfx = list(set(cids_dmca) - set(cids_nofx))  # DM currencies excluding USD, EUR
cids_emfx = list(set(cids_em) - set(cids_nofx))
cids_fx = sorted(list(set(cids_exp) - set(cids_nofx)))
# Quantamental categories of interest
main = [
    # Merchandise Trade Balances:
    "MTBGDPRATIO_NSA_12MMA_D1M1ML3",
    "MTBGDPRATIO_SA_3MMA_D1M1ML3",
    "MTBGDPRATIO_SA_6MMA_D1M1ML6",
    "MTBGDPRATIO_SA_3MMAv24MMA",
    "MTBGDPRATIO_SA_3MMAv60MMA",
    "MTBGDPRATIO_SA_3MMAv120MMA",
    "MTB_SA_3MMAvEWMAZ",
    # Basic External balances:
    "BXBGDPRATIO_NSA_12MMA_D1M1ML3",
    "BXBGDPRATIO_NSA_12MMAv60MMA",
    "BXBGDPRATIO_NSA_12MMAv120MMA",
    # Seasonally adjusted current account balances:
    "CABGDPRATIO_SA_3MMA_D1M1ML3",
    "CABGDPRATIO_SA_6MMA_D1M1ML6",
    "CABGDPRATIO_SA_3MMAv60MMA",
    "CABGDPRATIO_SA_1QMA_D1Q1QL1",
    "CABGDPRATIO_SA_2QMA_D1Q1QL2",
    "CABGDPRATIO_SA_1QMAv20QMA",
]

# economic context
econ = [
    "INTRGDP_NSA_P1M1ML12_3MMA",
    "EXMOPENNESS_NSA_1YMA",
]

# market links
mark = [
    "FXXR_NSA",
    "FXXR_VT10",
    "FXXRHvGDRB_NSA",
    "DU02YXR_VT10",
    "DU05YXR_VT10",
    "CDS05YXR_NSA",
    "CDS05YXR_VT10",
    "FXTARGETED_NSA",
    "FXUNTRADABLE_NSA",
    "CRXR_NSA",
    "CRXR_VT10",
]

xcats = main + econ + mark
# Download series from J.P. Morgan DataQuery by tickers
start_date = "1995-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 dq:
    df = dq.download(
        tickers=tickers,
        start_date=start_date,
        suppress_warning=True,
        metrics=["all"],
        show_progress=True,
    )
Maximum number of tickers is 1189
Downloading data from JPMaQS.
Timestamp UTC:  2024-07-04 15:30:47
Connection successful!
Requesting data: 100%|██████████| 238/238 [00:52<00:00,  4.53it/s]
Downloading data: 100%|██████████| 238/238 [00:33<00:00,  7.04it/s]  
Some expressions are missing from the downloaded data. Check logger output for complete list.
1704 out of 4756 expressions are missing. To download the catalogue of all available expressions and filter the unavailable expressions, set `get_catalogue=True` in the call to `JPMaQSDownload.download()`.
Some dates are missing from the downloaded data. 
7701 out of 7701 dates are missing.

Availability #

msm.missing_in_df(df, xcats=main, cids=cids_exp)
No missing XCATs across DataFrame.
Missing cids for BXBGDPRATIO_NSA_12MMA_D1M1ML3:  []
Missing cids for BXBGDPRATIO_NSA_12MMAv120MMA:   []
Missing cids for BXBGDPRATIO_NSA_12MMAv60MMA:    []
Missing cids for CABGDPRATIO_SA_1QMA_D1Q1QL1:    ['BRL', 'CZK', 'EUR', 'GBP', 'JPY', 'KRW', 'PHP', 'PLN', 'RON', 'THB', 'TRY']
Missing cids for CABGDPRATIO_SA_1QMAv20QMA:      ['BRL', 'CZK', 'EUR', 'GBP', 'JPY', 'KRW', 'PHP', 'PLN', 'RON', 'THB', 'TRY']
Missing cids for CABGDPRATIO_SA_2QMA_D1Q1QL2:    ['BRL', 'CZK', 'EUR', 'GBP', 'JPY', 'KRW', 'PHP', 'PLN', 'RON', 'THB', 'TRY']
Missing cids for CABGDPRATIO_SA_3MMA_D1M1ML3:    ['AUD', 'CAD', 'CHF', 'CLP', 'CNY', 'COP', 'HUF', 'IDR', 'ILS', 'INR', 'MXN', 'MYR', 'NOK', 'NZD', 'PEN', 'RON', 'RUB', 'SEK', 'SGD', 'TWD', 'USD', 'ZAR']
Missing cids for CABGDPRATIO_SA_3MMAv60MMA:      ['AUD', 'CAD', 'CHF', 'CLP', 'CNY', 'COP', 'HUF', 'IDR', 'ILS', 'INR', 'MXN', 'MYR', 'NOK', 'NZD', 'PEN', 'RON', 'RUB', 'SEK', 'SGD', 'TWD', 'USD', 'ZAR']
Missing cids for CABGDPRATIO_SA_6MMA_D1M1ML6:    ['AUD', 'CAD', 'CHF', 'CLP', 'CNY', 'COP', 'HUF', 'IDR', 'ILS', 'INR', 'MXN', 'MYR', 'NOK', 'NZD', 'PEN', 'RON', 'RUB', 'SEK', 'SGD', 'TWD', 'USD', 'ZAR']
Missing cids for MTBGDPRATIO_NSA_12MMA_D1M1ML3:  []
Missing cids for MTBGDPRATIO_SA_3MMA_D1M1ML3:    []
Missing cids for MTBGDPRATIO_SA_3MMAv120MMA:     []
Missing cids for MTBGDPRATIO_SA_3MMAv24MMA:      []
Missing cids for MTBGDPRATIO_SA_3MMAv60MMA:      []
Missing cids for MTBGDPRATIO_SA_6MMA_D1M1ML6:    []
Missing cids for MTB_SA_3MMAvEWMAZ:              []

Real-time quantamental indicators of external ratios are available back to the 1990s for most developed countries and the early 2000s for some emerging economies.

For the explanation of currency symbols, which are related to currency areas or countries for which categories are available, please view Appendix 3 .

xcatx = main
cidx = cids_exp

dfx = msm.reduce_df(df, xcats=xcatx, cids=cidx)
dfs = msm.check_startyears(dfx)
msm.visual_paneldates(dfs, size=(18, 8))
https://macrosynergy.com/notebooks.build/themes/economic-trends/_images/d9800c12967c766a36a74c8b9e2d86e173bf9423995940818e05350008f1b79e.png
plot = msm.check_availability(
    df, xcats=xcatx, cids=cidx, start_size=(18, 8), start_years=False, start=start_date
)
https://macrosynergy.com/notebooks.build/themes/economic-trends/_images/71626d65a961e39166f0bab3311dec1c785739a1dcc650922f64dcbc547f6f94.png

Vintage grades are mixed, with developed markets on average recording better grades than EM countries. The higher grades of seasonally-adjusted series reflect the sequential seasonal adjustment that allows deriving a good proxy of real-time data even from non-original vintages.

plot = msp.heatmap_grades(
    df,
    xcats=xcatx,
    cids=cidx,
    start=start_date,
    size=(18, 8),
    title=f"Average vintage grades, from {start_date} onwards",
)
https://macrosynergy.com/notebooks.build/themes/economic-trends/_images/7929789778e6850e3bea5e39ec0e91675eee3a7e47782ee2fff7802752eb5274.png
mtbs = [
    "MTBGDPRATIO_NSA_12MMA_D1M1ML3",
    "MTBGDPRATIO_SA_3MMA_D1M1ML3",
    "MTB_SA_3MMAvEWMAZ",
]
msp.view_ranges(
    df,
    xcats=mtbs,
    cids=cids_exp,
    val="eop_lag",
    title="End of observation period lags (ranges of time elapsed since end of observation period in days)",
    start="2000-01-01",
    kind="box",
    size=(16, 4),
)
msp.view_ranges(
    df,
    xcats=mtbs,
    cids=cids_exp,
    val="mop_lag",
    title="Median of observation period lags (ranges of time elapsed since middle of observation period in days)",
    start="2000-01-01",
    kind="box",
    size=(16, 4),
)
https://macrosynergy.com/notebooks.build/themes/economic-trends/_images/9c5749ae94799f7d5ba687f4a9cde413c5838d9bfadd8370ca20510e9a4ecc06.png https://macrosynergy.com/notebooks.build/themes/economic-trends/_images/078a23b4ce001f16675eae2ec52405130ce6caf77e11ce6bfa18f62e3cbc9372.png
cabs = [
    "CABGDPRATIO_SA_3MMA_D1M1ML3",
    "CABGDPRATIO_SA_6MMA_D1M1ML6",
    "CABGDPRATIO_SA_3MMAv60MMA",
    "CABGDPRATIO_SA_1QMA_D1Q1QL1",
    "CABGDPRATIO_SA_2QMA_D1Q1QL2",
    "CABGDPRATIO_SA_1QMAv20QMA",
]
msp.view_ranges(
    df,
    xcats=cabs,
    cids=cids_exp,
    val="eop_lag",
    title="End of observation period lags (ranges of time elapsed since end of observation period in days)",
    start="2000-01-01",
    kind="box",
    size=(16, 4),
)
msp.view_ranges(
    df,
    xcats=cabs,
    cids=cids_exp,
    val="mop_lag",
    title="Median of observation period lags (ranges of time elapsed since middle of observation period in days)",
    start="2000-01-01",
    kind="box",
    size=(16, 4),
)
https://macrosynergy.com/notebooks.build/themes/economic-trends/_images/887949b4a8eb9435c71decd9ccc9c42c6a1300a2e1897ac4b903baa6a6f5198c.png https://macrosynergy.com/notebooks.build/themes/economic-trends/_images/3a7dd1b6dab1ac16b6216de66d8d617512c8fb01321d477f268462b608f02543.png
xbbs = [
    "BXBGDPRATIO_NSA_12MMA_D1M1ML3",
    "BXBGDPRATIO_NSA_12MMAv60MMA",
    "BXBGDPRATIO_NSA_12MMAv120MMA",
]
msp.view_ranges(
    df,
    xcats=xbbs,
    cids=cids_exp,
    val="eop_lag",
    title="End of observation period lags (ranges of time elapsed since end of observation period in days)",
    start="2000-01-01",
    kind="box",
    size=(16, 4),
)
msp.view_ranges(
    df,
    xcats=xbbs,
    cids=cids_exp,
    val="mop_lag",
    title="Median of observation period lags (ranges of time elapsed since middle of observation period in days)",
    start="2000-01-01",
    kind="box",
    size=(16, 4),
)
https://macrosynergy.com/notebooks.build/themes/economic-trends/_images/69a555a346d5533f969ed9c6fca9da33612060e2dd47deb8e90a6917caf496e4.png https://macrosynergy.com/notebooks.build/themes/economic-trends/_images/366d98ea51cf5504eb18a2e063fc1dbb6143bd064eafc4b4c47763357197a9d9.png

For the purpose of the below presentation, we have renamed quarterly-frequency indicators to approximate monthly equivalents in order to have a full panel of similar measures across most countries. The two series’ are not identical but are close substitutes.

# Renaming extended categories for ease of subsequent analysis
rename_dict = {
    "CABGDPRATIO_SA_1QMA_D1Q1QL1": "CABGDPRATIO_SA_3MMA_D1M1ML3",
    "CABGDPRATIO_SA_2QMA_D1Q1QL2": "CABGDPRATIO_SA_6MMA_D1M1ML6",
    "CABGDPRATIO_SA_1QMAv20QMA": "CABGDPRATIO_SA_3MMAv60MMA",
}
dfx = df.copy()
dfx["xcat"] = df["xcat"].map(lambda x: rename_dict.get(x, x))

History #

Importance #

Empirical clues #

Identifying and isolating periods characterized by official exchange rate targets, illiquidity, or convertibility-related distortions in FX markets is crucial for testing any FX-based hypothesis. These periods can significantly influence the behavior and dynamics of currency markets, and neglecting to account for them can result in inaccurate or misleading conclusions. Therefore, we compile a blacklist of such periods for all cross-sections to ensure accurate analysis.

# Blacklist periods of FX targeting or illiquidity

dfb = dfx[dfx["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"
)  # dictionary of periods of FX targeting or illiquidity

External ratios and FX forward returns #

Panel regression has shown a signficant positive relation between end-of-month information states of medium term external ratios and subsequent weekly, monthly and quarterly hedged FX returns . The relation is quite seasonal, however, and requires episodes of balance of payments crises and recoveries to manifest.

Hedged return here means that the FX forward position is combined with a position in a global directional risk basket. The global directional risk basket contains equal volatility-weights in equity index futures, CDS indices and FX forwards. See also the notes on the ‘directional risk basket returns’ category DRBXR_NSA here .

cr = msp.CategoryRelations(
    dfx,
    xcats=["MTBGDPRATIO_NSA_12MMA_D1M1ML3", "FXXRHvGDRB_NSA"],
    cids=cids_fx,
    freq="q",
    lag=1,
    xcat_aggs=["last", "sum"],
    start="1998-01-01",
    blacklist=fxblack,
)

cr.reg_scatter(
    title="Medium-term trade balance trends and subsequent FX returns, 28 DM/EM currencies, since 1998",
    xlab="Merchandise trade balance ratio, % of GDP, 1-yma, change over past three months",
    ylab="Next quarter's fx forward returns, hedged for exposure to directional risk, %",
    prob_est="map",
    coef_box="lower right",
    size=(10, 7),
)

cr.reg_scatter(
    title="Medium-term trade balance trend and subsequent FX returns, 28 DM/EM currencies, since 1998",
    xlab="Merchandise trade balance ratio, % of GDP, 1-yma, change over past three months",
    ylab="Next quarter's fx forward returns, hedged for exposure to directional risk, %",
    prob_est="map",
    coef_box="lower right",
    separator=2012,
    size=(10, 7),
)
https://macrosynergy.com/notebooks.build/themes/economic-trends/_images/a914ce3eaae28e3aa7cd0dc8a739edaa248723ebf39344f4b8d66e790d6e4344.png https://macrosynergy.com/notebooks.build/themes/economic-trends/_images/14612270b1708fe31489ec59a95b57175e8a8e20d5dc6aa7400d1b8405e569bd.png

External ratio changes and interest rate swap returns #

Plausibly, there should a a positive relationships between external ratio trends and the local currency IRS returns, both directional and relative to USD IRS returns. That is because improving external balances increase the chances of unsterilized FX interventions with increasing local liquidity while they reduce the risk of overvaluation and sudden stops in capital flows. The latter is particularly important for emerging markets economies that rely on foreign funding.

To simplify the analysis we calculate a composite of different external balance dynamics, using with euqal weights [i] 3-month changes in 12-month basic external balances ratios, [ii] 3-month changes in 12-month merchandise trade balances ratio, and [iii] short-term changes in monthly seasonally-adjusted merchanidse trade balances (3m/3m and 6m/6m).

# Calculate a composite score for external balance dynamics

xcatx = [
    "BXBGDPRATIO_NSA_12MMA_D1M1ML3",
    "MTBGDPRATIO_NSA_12MMA_D1M1ML3",
    "MTBGDPRATIO_SA_3MMA_D1M1ML3",
    "MTBGDPRATIO_SA_6MMA_D1M1ML6",
]  # shorter term dynamics
cidx = cids_exp


dfa = pd.DataFrame(columns=dfx.columns)


for xc in xcatx:

    dfaa = msp.make_zn_scores(
        dfx,
        xcat=xc,
        cids=cidx,
        sequential=True,
        min_obs=522,  # oos scaling after 2 years of panel data
        est_freq="m",
        neutral="zero",
        pan_weight=1,
        thresh=3,
        postfix="_ZN",

    )

    dfa = msm.update_df(dfa, dfaa)

dfx = msm.update_df(dfx, dfa)


dix = {
    "BXBGDPRATIO_NSA_12MMA_D1M1ML3_ZN": 1 / 3,
    "MTBGDPRATIO_NSA_12MMA_D1M1ML3_ZN": 1 / 3,
    "MTBGDPRATIO_SA_3MMA_D1M1ML3_ZN": 1 / 6,
    "MTBGDPRATIO_SA_6MMA_D1M1ML6_ZN": 1 / 6,
}


dfa = msp.linear_composite(
    dfx,
    xcats=list(dix.keys()),
    weights=list(dix.values()),
    cids=cidx,
    complete_xcats=False,
    new_xcat="XBDYNZ_AVG",
)

dfx = msm.update_df(dfx, dfa)

# Calculate relative returns versus the U.S.


targs = ["DU05YXR_VT10"]


dfa = msp.make_relative_value(
    dfx, xcats=targs, cids=cids, basket=["USD"], postfix="vUSD"
)


dfx = msm.update_df(dfx, dfa)

There is pervasive evidence of a positive relation between external balances changes and subsequent local currency IRS returns in emerging markets since 1998. The relationship has been signficant for both relative and directional returns, as well as for simple trade balance changes and the composite external balance change score.

Since is important, since currrency areas with strong relative and growth and high real carry often display deteriorating external balances. The empirical relevance of the latter advices to include external balance dynamics in carry trade signals.

# Define the target categories
targ_dict = {
    "DU05YXR_VT10": "5-year vol-targeted IRS returns",
    "DU05YXR_VT10vUSD": "5-year relative vol-targeted IRS returns",
}

# Define easy-to-read labels for the signals
xlab_dict = {
    "MTBGDPRATIO_NSA_12MMA_D1M1ML3": "Merchandise trade balance change over 3 months",
    "XBDYNZ_AVG": "Composite external balance change score",
}

cids_emexp = list(
    set(cids_em) - set(["BRL", "PEN", "PHP", "RON", "INR", "SGD", "TWD"])
)  # all emerging markets that trade IRS

# Initialize the dictionary to store CategoryRelations instances
cr = {}

# Loop through the signals and target categories
for sig in xlab_dict.keys():
    for targ in targ_dict.keys():
        cr[f"cr_{sig}_{targ}"] = msp.CategoryRelations(
            dfx,
            xcats=[sig, targ],
            cids=cids_emexp,
            freq="Q",
            lag=1,
            xcat_aggs=["last", "sum"],
            start="1998-01-01",
            blacklist=fxblack,
        )

# Combine all CategoryRelations instances for plotting
all_cr_instances = [
    cr[f"cr_{sig}_{targ}"] for sig in xlab_dict.keys() for targ in targ_dict.keys()
]

# Define all labels for the subplot titles
all_labels = [
    f"{sig} vs {targ}" for sig in xlab_dict.values() for targ in targ_dict.values()
]

# Plotting the results
msv.multiple_reg_scatter(
    cat_rels=all_cr_instances,
    title="External ratio trends and subsequent IRS receiver returns in EM countries, ",
    ylab="Next quarter's 5-year IRS receiver returns, vol targeted",
    ncol=2,
    nrow=len(all_labels) // 2,  # Adjust the number of rows based on the number of plots
    figsize=(15, 12),
    prob_est="map",
    coef_box="upper right",
    subplot_titles=all_labels,
)
https://macrosynergy.com/notebooks.build/themes/economic-trends/_images/cc27162ff6b13719c7ba5f63dc97a96cf2c45c5c3276162d58193e5af0cb5f9e.png

Appendices #

Appendix 1: Seasonal adjustment procedure #

We deploy the state-of-the-art US Census X-13 algorithm to handle seasonality in economic series. There are two characteristics of the model worth noting in connection to the point-in-time estimation JPMaQS is delivering:

  1. The underlying econometric model is a seasonal ARIMA model leveraging a two-sided filter. As both the earliest and latest observations are included in the historical seasonal component estimation, JPMaQS forces the model (and seasonal component) to being re-estimated for each release date’s time-series. This ensures that only information available at a given point-in-time is used, avoiding leakage of future information.

  2. The algorithm has an embedded endogenous model specification using an Akaike Information Criteria, ensuring the parameters are dynamically chosen using only information available at each point-in-time.

For our seasonally adjustment of the Merchandise Trade Balances , we sequentially apply the multiplicative method of the U.S. Census X-13 algorithm to the levels of imports and exports respectively for each of their vintages. We then subtract the imports from the exports to get the seasonally adjusted merchandise trade balances, and take ratios to nominal GDP at the end. This contrast with the Current Account Balances , were we first take the ratio to GDP to deal deal with non-stationarity in the data, and then apply the additive X-13 method to these ratios for each release date. As current account balances can be both in surplus and deficit, we cannot use the multiplicative method to deal with the non-stationarity of the data.

Appendix 2: Notes on OECD data integration #

Some indicators in this notebook are constructed using vintages provided by the OECD’s Revision Analysis Dataset in addition to national sources series’. The integration of the OECD datasets follows the following rules:

  1. The following priority order is applied for combining vintages. First, JPMaQS uses seasonally and calendar adjusted original vintages from national sources. Beyond that JPMaQS uses OECD vintages.

  2. OECD vintages inform on the month of release but not the exact date. Actual release dates for these vintages are estimated based on release days of subsequent vintages.

  3. Inconsistencies, data errors and missing values in the OECD vintages have been corrected for JPMaQS.

OECD data is seasonally adjusted and denominated in native currency. No such consistency is found in national sources. Often figures are stated in a foreign denomination (EUR or USD) and no seasonal adjustment has been applied. To integrate these two data sources we first currency convert national sources into their native currency and then apply seasonal adjustment.

Appendix 3: 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 (Philippine 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).