Debt servicing ratios #
This category group contains information states of key real-time measures of household and corporate debt servicing ratios, i.e. interest spending, as a percentage of concurrent nominal GDP.
Household sector debt servicing ratios #
Ticker : HHINTGROSSGDP_SA / _D1M1ML12 / _D1Q1QL4 / _D1Y1YL1
Label : Households’ gross debt servicing as % of GDP: sa / diff oya (monthly) / sa diff oya (quarterly) / sadiff oya (yearly)
Definition : Private households’ gross debt servicing as percentage of nominal GDP: seasonally adjusted / seasonally adjusted difference over a year ago (monthly) / seasonally adjusted difference over a year ago (quarterly) / seasonally adjusted difference over a year ago (yearly)
Notes :
-
Data on private households’ debt servicing is taken from national accounts and comes from the source in various formats:
-
monthly and seasonally adjusted data (USD),
-
quarterly and seasonally adjusted (AUD, CAD, GBP),
-
quarterly without adjustment (CZK, DEM, ESP, EUR, FRF, ITL, NLG, NOK, PLN, RON, SEK), and
-
annual (CHF, JPY, KRW, NZD, THB).
-
-
Quarterly debt servicing data that are not adjusted by the source are seasonally adjusted by JPMaQS, sequentially and on a vintage basis.
-
The denominator of the ratio is nominal GDP, which is taken as a 1-year moving average.
Ticker : HHINTNETGDP_SA / _D1M1ML12 / _D1Q1QL4 / _D1Y1YL1
Label : Households’ net debt servicing as % of GDP: sa / sa diff oya (monthly) / sa diff oya (quarterly) / sa diff oya (yearly)
Definition : Private households’ net debt servicing as percentage of nominal GDP: seasonally adjusted / seasonally adjusted difference over a year ago (monthly) / seasonally adjusted difference over a year ago (quarterly) / seasonally adjusted difference over a year ago (yearly)
Notes :
-
Net debt servicing is defined as gross interest payments minus interest received by households.
-
Data on private households’ debt servicing is taken from national accounts and comes from the source in various formats:
-
monthly and seasonally adjusted data (USD),
-
quarterly and seasonally adjusted (AUD, CAD, GBP),
-
quarterly without adjustment (CZK, DEM, ESP, EUR, FRF, ITL, NLG, NOK, PLN, RON, SEK), and
-
annual (CHF, JPY, KRW, NZD, THB).
-
-
Quarterly debt servicing data that are not adjusted by the source are seasonally adjusted by JPMaQS, sequentially and on a vintage basis. For net debt servicing, the seasonal adjustment is applied separately to gross interest payments and interest receipts.
-
The denominator of the ratio is nominal GDP, which is taken as a 1-year moving average.
Corporate sector debt servicing ratios #
Ticker : CORPINTGROSSGDP_SA / _D1Q1QL4 / _D1Y1YL1
Label : Corporate gross debt servicing as % of GDP: sa / sa diff oya (quarterly) / sa diff oya (yearly)
Definition : Corporate gross debt servicing as percentage of nominal GDP: seasonally adjusted / seasonally adjusted difference over a year ago (quarterly) / seasonally adjusted difference over a year ago (yearly)
Notes :
-
The term “corporate” here refers to non-financial corporations.
-
Data on corporate debt servicing is taken from national accounts and comes from the source in various formats:
-
quarterly and seasonally adjusted (AUD, CAD, GBP),
-
quarterly without adjustment (CZK, DEM, ESP, EUR, FRF, ITL, NLG, NOK, PLN, RON, SEK), and
-
annual (CHF, JPY, KRW, NZD).
-
-
There are no U.S. data for gross corporate interest spending, only for net interest spending.
-
Quarterly debt servicing data that are not adjusted by the source are seasonally adjusted by JPMaQS, sequentially and on a vintage basis.
-
The denominator of the ratio is nominal GDP, which is taken as a 1-year moving average.
Ticker : CORPINTNETGDP_SA / _D1Q1QL4 / _D1Y1YL1
Label : Corporate net debt servicing as % of GDP: sa / sa diff oya (quarterly) / sa diff oya (yearly)
Definition : Corporate net debt servicing as percentage of nominal GDP: seasonally adjusted / seasonally adjusted difference over a year ago (quarterly) / ratio difference over a year ago (yearly)
Notes :
-
Net debt servicing is defined as gross interest payments minus interest recieved.
-
Data on corporate debt servicing is taken from national accounts and comes from the source in various formats:
-
quarterly and seasonally adjusted (AUD, CAD, GBP, USD),
-
quarterly without adjustment (CZK, DEM, ESP, EUR, FRF, ITL, NLG, NOK, PLN, RON, SEK), and
-
annual (CHF, JPY, KRW, NZD).
-
-
Quarterly debt servicing data that are not adjusted by the source are seasonally adjusted by JPMaQS, sequentially and on a vintage basis. For net debt servicing, the seasonal adjustment is applied separately to gross interest payments and interest receipts
-
The denominator of the ratio is nominal GDP, which is taken as a 1-year moving average.
Overall private sector debt servicing ratios #
Ticker : PRIVINTGROSSGDP_SA / _D1Q1QL4 / _D1Y1YL1
Label : Private sector gross debt servicing as % of GDP: sa / sa diff oya (quarterly) / sa diff oya (yearly)
Definition : Private sector gross debt servicing as percentage of nominal GDP, seasonally adjusted: ratio / ratio difference over a year ago (quarterly) / ratio difference over a year ago (yearly)
Notes :
-
Private debt servicing is defined as the sum of private housheolds’ and corporates’ debt servicing.
-
Data on corporate debt servicing is taken from national accounts and comes from the source in various formats:
-
quarterly and seasonally adjusted (AUD, CAD, GBP),
-
quarterly without adjustment (CZK, DEM, ESP, EUR, FRF, ITL, NLG, NOK, PLN, RON, SEK), and
-
annual (CHF, JPY, KRW, NZD, THB).
-
-
Quarterly debt servicing data that are not adjusted by the source are seasonally adjusted by JPMaQS, sequentially and on a vintage basis.
-
The denominator of the ratio is nominal GDP, which is taken as a 1-year moving average.
Ticker : PRIVINTNETGDP_SA / _D1Q1QL4 / _D1Y1YL1
Label : Private sector net debt servicing as % of GDP: sa / sa diff oya (quarterly) / sa diff oya (yearly)
Definition : Private sector net debt servicing as percentage of nominal GDP: seasonally adjusted / seasonally adjusted difference over a year ago (quarterly) / seasonally adjusted difference over a year ago (yearly)
Notes :
-
Net interest is defined as gross interest payments minus interest received.
-
Data on corporate debt servicing is taken from national accounts and comes from the source in various formats:
-
quarterly and seasonally adjusted (AUD, CAD, GBP, USD),
-
quarterly without adjustment (CZK, DEM, ESP, EUR, FRF, ITL, NLG, NOK, PLN, RON, SEK), and
-
annual (CHF, JPY, KRW, NZD, THB).
-
-
Quarterly debt servicing data that are not adjusted by the source are seasonally adjusted by JPMaQS, sequentially and on a vintage basis. For net debt servicing, the seasonal adjustment is applied separately to gross interest payments and interest receipts
-
The denominator of the ratio is nominal GDP, which is taken as a 1-year moving average.
Imports #
Only the standard Python data science packages and the specialized
macrosynergy
package are needed.
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import math
import json
import macrosynergy.management as msm
import macrosynergy.panel as msp
import macrosynergy.signal as mss
import macrosynergy.pnl as msn
from macrosynergy.download import JPMaQSDownload
from timeit import default_timer as timer
from datetime import timedelta, date, datetime
import warnings
warnings.simplefilter("ignore")
The
JPMaQS
indicators we consider are downloaded using the J.P. Morgan Dataquery API interface within the
macrosynergy
package. This is done by specifying
ticker strings
, formed by appending an indicator category code
<category>
to a currency area code
<cross_section>
. These constitute the main part of a full quantamental indicator ticker, taking the form
DB(JPMAQS,<cross_section>_<category>,<info>)
, where
<info>
denotes the time series of information for the given cross-section and category. The following types of information are available:
-
value
giving the latest available values for the indicator -
eop_lag
referring to days elapsed since the end of the observation period -
mop_lag
referring to the number of days elapsed since the mean observation period -
grade
denoting a grade of the observation, giving a metric of real time information quality.
After instantiating the
JPMaQSDownload
class within the
macrosynergy.download
module, one can use the
download(tickers,start_date,metrics)
method to 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.
cids_exp = [
"AUD",
"CAD",
"CHF",
"CZK",
"DEM",
"ESP",
"EUR",
"FRF",
"GBP",
"ITL",
"JPY",
"KRW",
"NLG",
"NOK",
"NZD",
"PLN",
"RON",
"USD",
]
cids_cr = ["EIG","EHY","UIG","UHY"]
cids = cids_exp+cids_cr
# Quantamental categories of interest
main = [
"HHINTGROSSGDP_SA",
"HHINTGROSSGDP_SA_D1M1ML12",
"HHINTGROSSGDP_SA_D1Q1QL4",
"HHINTGROSSGDP_SA_D1Y1YL1",
"HHINTNETGDP_SA",
"HHINTNETGDP_SA_D1M1ML12",
"HHINTNETGDP_SA_D1Q1QL4",
"HHINTNETGDP_SA_D1Y1YL1",
"CORPINTGROSSGDP_SA",
"CORPINTGROSSGDP_SA_D1Q1QL4",
"CORPINTGORSSGDP_SA_D1Y1YL1",
"CORPINTNETGDP_SA",
"CORPINTNETGDP_SA_D1Q1QL4",
"CORPINTNETGDP_SA_D1Y1YL1",
"PRIVINTGROSSGDP_SA",
"PRIVINTGROSSGDP_SA_D1Q1QL4",
"PRIVINTGROSSGDP_SA_D1Y1YL1",
"PRIVINTNETGDP_SA",
"PRIVINTNETGDP_SA_D1Q1QL4",
"PRIVINTNETGDP_SA_D1Y1YL1",
]
econ = [] # economic context
mark = [
"EQCRY_NSA",
"RIR_NSA",
"CRXR_NSA",
"CRXR_VT10",
"DU05YXR_NSA",
"DU05YXR_VT10",
"EQXR_NSA",
"EQXR_VT10"
] # 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()
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 616
Downloading data from JPMaQS.
Timestamp UTC: 2024-05-28 11:16:56
Connection successful!
Requesting data: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 124/124 [00:26<00:00, 4.75it/s]
Downloading data: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 124/124 [01:23<00:00, 1.48it/s]
Some expressions are missing from the downloaded data. Check logger output for complete list.
1284 out of 2464 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.
3 out of 8979 dates are missing.
Download time from DQ: 0:01:55.140199
Availability #
Most series are available from the late 1990s. USA and GBP data go back to the early 1990s. However, the U.S. has not published gross debt servicing data for the corporate and overall private sector. Korean data have only been available from 2011.
xcatx = [
"HHINTGROSSGDP_SA",
"CORPINTGROSSGDP_SA",
"PRIVINTGROSSGDP_SA",
"HHINTNETGDP_SA",
"CORPINTNETGDP_SA",
"PRIVINTNETGDP_SA",
]
cidx = cids
dfx = msm.reduce_df(dfd, xcats=xcatx, cids=cidx)
dfs = msm.check_startyears(
dfx,
)
msm.visual_paneldates(dfs, size=(18, 6))
print("Last updated:", date.today())
Last updated: 2024-05-28
Vintage quality has been very different across countries. For most countries JPMaQS has only a few recent years of original vintages. This includes Switzerland, the UK, and the U.S. (for household debt services).
plot = msp.heatmap_grades(
dfd,
xcats=[
"HHINTGROSSGDP_SA",
"CORPINTGROSSGDP_SA",
"PRIVINTGROSSGDP_SA",
"HHINTNETGDP_SA",
"CORPINTNETGDP_SA",
"PRIVINTNETGDP_SA",
],
cids=cids_exp,
size=(20, 6),
title=f"Average debt servicing ratio vintage grades from {start_date} onwards",
)
Lags between observation periods and publications have been very different, due mainly to differences in data frequency. For household debt servicing, U.S. data stand out in form of timeliness.
cidx = cids_exp
categories = [
"HHINTGROSSGDP_SA",
]
msp.view_ranges(
dfd,
xcats=categories,
cids=cids,
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, 4),
)
msp.view_ranges(
dfd,
xcats=categories,
cids=cids,
val="mop_lag",
title="Median of observation period lags (ranges of time elapsed since end of observation period in days)",
start=start_date,
kind="box",
size=(16, 4),
)
History #
Household sector debt servicing-to-GDP ratios #
For efficient graphical representation, it is helpful to rename some yearly and monthly dynamics into an equivalent quarterly dynamics.
dfd = dfd.copy()
dict_repl = {
"HHINTGROSSGDP_SA_D1M1ML12": "HHINTGROSSGDP_SA_D1Q1QL4",
"HHINTGROSSGDP_SA_D1Y1YL1": "HHINTGROSSGDP_SA_D1Q1QL4",
"HHINTNETGDP_SA_D1M1ML12": "HHINTNETGDP_SA_D1Q1QL4",
"HHINTNETGDP_SA_D1Y1YL1": "HHINTNETGDP_SA_D1Q1QL4",
"PRIVINTGROSSGDP_SA_D1Y1YL1": "PRIVINTGROSSGDP_SA_D1Q1QL4",
"PRIVINTNETGDP_SA_D1Y1YL1": "PRIVINTNETGDP_SA_D1Q1QL4",
"CORPINTGROSSGDP_SA_D1Y1YL1": "CORPINTGROSSGDP_SA_D1Q1QL4",
"CORPINTNETGDP_SA_D1Y1YL1": "CORPINTNETGDP_SA_D1Q1QL4",
}
for key, value in dict_repl.items():
dfd["xcat"] = dfd["xcat"].str.replace(key, value)
Households’ average gross debt servicing ratios since 2000 have ranged from below 1% to 5% of GDP. Net debt servicing ratios have been a lot more diverse, with the U.S. showing households being large net receivers of interest.
xcatx = ["HHINTGROSSGDP_SA","HHINTNETGDP_SA"]
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 Household sector debt servicing-to-GDP ratios since 2000",
xcat_labels=["Household gross debt servicing payments","Household net debt servicing payments"],
kind="bar",
size=(16, 8),
)
Debt servicing ratios show both cyclical fluctuations and medium-term trends. When households are net receivers of interest, gross and net debt servicing payments can go in opposite directions when market interest rates are moving.
xcatx = ["HHINTGROSSGDP_SA","HHINTNETGDP_SA"]
cidx = cids_exp
msp.view_timelines(
dfd,
xcats=xcatx,
cids=cidx,
start=start_date,
title="Household sector debt servicing ratios, % of GDP",
title_fontsize=28,
legend_fontsize=20,
xcat_labels=["Gross interest payments","Net interest payments"],
ncol=3,
same_y=False,
size=(16, 8),
aspect=1.7,
all_xticks=True,
)
Information states of gross household debt servicing payment ratios have been positively correlated across countries.
cidx = cids_exp
msp.correl_matrix(
dfd,
xcats="HHINTGROSSGDP_SA",
cids=cidx,
size=(10, 7),
start="2000-01-01",
title="Cross correlations for household gross debt servicing ratios since 2000",
)
The cross-country correlation of net debt servicing ratios is mixed. This reflects that countries where households are net receivers of interest have a different dynamic than countries where households are net payers of interest.
cidx = cids_exp
msp.correl_matrix(
dfd,
xcats="HHINTNETGDP_SA",
cids=cidx,
size=(10, 7),
start="2000-01-01",
title="Cross correlations for household net debt servicing ratios since 2000",
)
Corporate sector debt servicing-to-GDP ratios #
Corporate sector debt servicing ratios display cyclical fluctuations and long-term trends. Net debt servicing of coporrate sectors has nearly always been positive.
xcatx = ["CORPINTGROSSGDP_SA","CORPINTNETGDP_SA"]
cidx = cids_exp
msp.view_timelines(
dfd,
xcats=xcatx,
cids=cidx,
start=start_date,
title="Corporate sector debt servicing ratios, % of GDP",
title_fontsize=28,
legend_fontsize=20,
xcat_labels=["Gross interest payments","Net interest payments"],
ncol=3,
same_y=False,
size=(16, 8),
aspect=1.7,
all_xticks=True,
)
Private sector debt servicing-to-GDP ratios #
Cycles and trends are also visible in overall private sector debt servicing ratios. The U.S. stands out with a private sector that is a large net receiver of interest.
xcatx = ["PRIVINTGROSSGDP_SA","PRIVINTNETGDP_SA"]
cidx = cids_exp
msp.view_timelines(
dfd,
xcats=xcatx,
cids=cidx,
start=start_date,
title="Private sector debt servicing ratios, % of GDP",
title_fontsize=28,
legend_fontsize=20,
xcat_labels=["Gross interest payments","Net interest payments"],
ncol=3,
same_y=False,
size=(16, 8),
aspect=1.7,
all_xticks=True,
)
Importance #
Research links #
Debt overhang from credit booms is an important feature of the business cycle and that it is associated with deeper and longer lasting recessions. Macrosynergy .
Empirical clues #
There is a clear positive relation between real short-term interest rates and subsequent provate sector gross debt servicing ratios. This suggests that future debt servicing ratios should be partly predictable.
cr = msp.CategoryRelations(
dfd,
xcats=["RIR_NSA", "PRIVINTGROSSGDP_SA"],
cids=cids_exp,
freq="A",
lag=1,
xcat_aggs=["mean", "last"],
fwin=1,
start="2000-01-01",
years=None,
)
cr.reg_scatter(
title="Average real interest rate and subsequent private gross debt servicing ratios, annual since 2000",
labels=True,
ylab="Private gross debt servicing, % of GDP, next year (end-year information state)",
xlab="Real short-term interest rate, annual average",
coef_box="lower right",
prob_est="map",
)
RIR_NSA misses: ['DEM', 'ESP', 'FRF', 'ITL', 'NLG'].
PRIVINTGROSSGDP_SA misses: ['USD'].
dfd_1 = dfd[dfd["cid"].isin(cids_cr)]
dfd_2 = dfd.replace({"^EUR":"EIG", "^USD":"UIG"},regex=True)
dfd_3 = dfd.replace({"^EUR":"EHY", "^USD":"UHY"},regex=True)
dfd_cr = pd.concat([dfd_1,dfd_2,dfd_3])
In the U.S. increases in corporate debt-servicing ratios have displayed significant negative correlations with subsequent returns on credit default swap index returns, both in the high-yield and investment-grade sectors. The negative predictive relation has been particularly strong for the investment grade segment.
cr = msp.CategoryRelations(
dfd_cr,
xcats=["CORPINTNETGDP_SA_D1Q1QL4", "CRXR_VT10"],
cids=["UIG", "UHY"],
freq="Q",
lag=1,
xcat_aggs=["last", "sum"],
fwin=1,
start="2000-01-01",
years=None,
)
cr.reg_scatter(
title="U.S. corporate debt servicing ratio change and subsequent CDS index returns, high-yield and investment grade, since 2002",
ylab="CDS index returns, %, next quarter",
xlab="Corporate net debt servicing ratio, increase over a year ago, % of GDP, end-of-quarter information state",
coef_box="lower right",
prob_est="map",
)
U.S. gross interest spending ratios for the household sector have positively predicted subsequent IRS fixed receiver returns, plausibly because increase in debt servicing dampens credit growth and argue, by themselves, for more supportive monetary policy.
cr = msp.CategoryRelations(
dfd,
xcats=["HHINTGROSSGDP_SA", "DU05YXR_NSA"],
cids=["USD"],
freq="M",
lag=1,
xcat_aggs=["last", "sum"],
fwin=1,
start="2000-01-01",
years=None,
)
cr.reg_scatter(
title="U.S. household gross debt servicing ratio and subsequent IRS receiver returns, since 2000",
ylab="5-year interest rate swaps fixed receiver returns, %, next month",
xlab="Household gross debt servicing ratio, % of GDP, end-of-quarter information state",
coef_box="lower right",
prob_est="map",
)
Appendices #
Appendix 1: 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).