Government borrowing requirements #

This category group focuses on real time metrics of government borrowing requirements as reported by official sources. They are ex-post records of net financing needs. Effectively, they measure the difference between cash arriving into government accounts and cash leaving, considering all financial activities, including acquisition of capital assets, loans, financial investments and advances. Thus, there is a relation to government budget deficits, but not necessarily a close one.

Government borrowing requirements are indicative of net public debt supply and the fiscal policy stance.

Net borrowing requirement ratios #

Ticker : GNBRGDP_NSA

Label : Government borrowing requirement, % of GDP

Definition : Government borrowing requirement, current period, official government estimate, as % of GDP

Notes :

  • Government borrowing requirements are generally defined as the financial needs of a government when calculated via a cash accounting basis. Unlike debt calculations, borrowing requirement figures are not harmonised at a European level. See here for more information.

  • A positive number indicates a net borrowing requirement, whilst a negative number indicates net lending.

  • In general, borrowing requirements are not equal to changes in public debt, because they can also be met by changing the cash balances with the treasury. Borrowing needs are obtained as the variation in debt, net of the use of liquidity by the government.

  • We calculate borrowing requirements as a ratio to nominal GDP. This means that the borrowing requirements are annualized for the reporting period and divided by the trailing one-year moving average of GDP.

  • Most countries report central government borrowing requirements. However, general government borrowing requirements are used when available in a timely fashion.

  • The central government is composed of the institutional units making up the central government plus those non-profit institutions that are controlled and mainly financed by the central government. The general government, on the other hand, is defined as the sum of central, state and local governments including the social security funds controlled by these units.

  • Sources for borrowing requirements are the government’s official publications. These come at different frequencies, mainly monthly. However, Australia, Malaysia and Singapore publish quarterly figures. Additionally, France and Taiwan publish yearly figures. Where explicit borrowing requirement data are missing, we use proxies. See Appendix 1 for country-specific information.

Ticker : GNBRGDP_NSA_3MMA / GNBRGDP_NSA_6MMA / GNBRGDP_NSA_12MMA / GNBRGDP_NSA_2QMA / GNBRGDP_NSA_4QMA

Label : Government borrowing requirement, % of GDP: 3-month moving average / 6-month moving average / 12-month moving average / 2-quarter moving average / 4-quarter moving average

Definition : Government borrowing requirement, current period, official government estimate, as % of GDP: 3-month moving average / 6-month moving average / 12-month moving average / 2-quarter moving average / 4-quarter moving average

Notes :

  • Whether quarterly or monthly averaging is chosen depends on the native frequency of the series.

  • See further the important notes above on GNBRGDP_NSA .

Government borrowing changes #

Ticker : GNBRGDP_NSA_D3M3ML12 / GNBRGDP_NSA_D6M6ML12 / GNBRGDP_NSA_D12M12ML12 / GNBRGDP_NSA_D1Q1QL4 / GNBRGDP_NSA_D2Q2QL4 / GNBRGDP_NSA_D4Q4QL4 / GNBRGDP_NSA_D1Y1YL1

Label : Government borrowing requirement, % of GDP, change: diff oya, 3mma / diff oya, 6mma / diff oya, 12mma / diff oya, quaterly / diff oya, 2qma / diff oya, 4qma / diff y/y

Definition : Government borrowing requirement, % of GDP, change: difference over a year ago, 3-month average / difference over a year ago, 6-month average / difference over a year ago, 12-month average / difference over a year ago, quarterly / difference over a year ago, 2-quarter moving average / difference over a year ago, 4-quarter moving average / difference year over previous year

Notes :

  • Whether annual, quarterly or monthly averaging is chosen depends on the native frequency of the series.

  • See further the important notes above on GNBRGDP_NSA .

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

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", "GBP", "SEK", "USD", "EUR"]  # DM currency areas
cids_dmec = ["DEM", "ESP", "FRF", "ITL"]  # DM euro area countries
cids_latm = ["CLP", "MXN", "PEN"]  # Latam countries
cids_emea = ["TRY", "ILS", "PLN", "RUB", "ZAR"]  # EMEA countries
cids_emas = ["IDR", "INR", "SGD", "THB", "TWD", "HKD", "MYR"]  # EM Asia countries

cids_dm = cids_dmca + cids_dmec
cids_em = cids_latm + cids_emea + cids_emas
cids = sorted(cids_dm + cids_em)

cids_fx = set(cids) - set(cids_dmec + ["EUR", "USD", "CNY"])

# Organise as well by frequency
cids_m = [
    "CAD",
    "CHF",
    "CLP",
    "DEM",
    "ESP",
    "INR",
    "IDR",
    "ILS",
    "ITL",
    "MXN",
    "NZD",
    "PEN",
    "PLN",
    "RUB",
    "SEK",
    "THB",
    "TRY",
    "GBP",
    "USD",
    "ZAR",
]

cids_bonds = ['ESP', 'ITL', 'DEM', 'USD', 'AUD', 'GBP'] # all available currencies for generic government bond returns
# Quantamental categories of interest

main = [
    "GNBRGDP_NSA",
    "GNBRGDP_NSA_3MMA",
    "GNBRGDP_NSA_6MMA",
    "GNBRGDP_NSA_12MMA",
    "GNBRGDP_NSA_D3M3ML12",
    "GNBRGDP_NSA_D6M6ML12",
    "GNBRGDP_NSA_D12M12ML12",
    "GNBRGDP_NSA_2QMA",
    "GNBRGDP_NSA_4QMA",
    "GNBRGDP_NSA_D1Q1QL4",
    "GNBRGDP_NSA_D2Q2QL4",
    "GNBRGDP_NSA_D4Q4QL4",
    "GNBRGDP_NSA_D1Y1YL1",
]

econ = ["GGOBGDPRATIO_NSA"]  # economic context
mark = [
    "DU02YXR_NSA",
    "DU02YXR_VT10",
    "DU05YXR_NSA",
    "DU05YXR_VT10",
    "GB01YXR_VT10",
    "GB05YXR_VT10",
    "GB01YXR_NSA",
    "GB05YXR_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:
    
    df = downloader.download(
        tickers=tickers,
        start_date=start_date,
        metrics=["all"],
        suppress_warning=True,
        show_progress=True,
    )
Maximum number of tickers is 572
Downloading data from JPMaQS.
Timestamp UTC:  2024-07-18 10:31:49
Connection successful!
Requesting data: 100%|██████████| 115/115 [00:26<00:00,  4.34it/s]
Downloading data: 100%|██████████| 115/115 [00:12<00:00,  9.13it/s]
Some expressions are missing from the downloaded data. Check logger output for complete list.
1088 out of 2288 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. 
2 out of 9016 dates are missing.

Availability #

cids_exp = sorted(list(set(cids)))  # cids expected in category panels
msm.missing_in_df(df, xcats=["GNBRGDP_NSA"], cids=cids_exp)
No missing XCATs across DataFrame.
Missing cids for GNBRGDP_NSA:  ['EUR']

Real-time data of government borrowing requirements is available by the mid-2000s for most developed markets and some emerging market categories. France and Canada are notable developed market late-starters. Most data have a native monthly frequency.

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

xcatx = main
cidx = cids_exp

dfx = msm.reduce_df(df, xcats=xcatx, cids=cidx)
dfs = msm.check_startyears(
    dfx,
)
msm.visual_paneldates(dfs, size=(18, 8))
https://macrosynergy.com/notebooks.build/themes/macroeconomic-balance-sheets/_images/cd47deba1d58a466508a645f685b1933eb65c082870492f3f5c141f5579a0243.png

Average vintage grading is on the low side across indicator categories and cross-sections.

xcatx = main
cidx = cids_exp

plot = msp.heatmap_grades(
    df,
    xcats=xcatx,
    cids=cidx,
    size=(18, 8),
    title=f"Average vintage grades from {start_date} onwards",
)
https://macrosynergy.com/notebooks.build/themes/macroeconomic-balance-sheets/_images/f1447eef3718b25bed8720941ad71765cd8a9b046287695bca9247e6a4056c32.png
# Grouping indicators for ease in creating lag boxplots
ratios = [
    "GNBRGDP_NSA",
    "GNBRGDP_NSA_3MMA",
    "GNBRGDP_NSA_6MMA",
    "GNBRGDP_NSA_12MMA",
    "GNBRGDP_NSA_2QMA",
    "GNBRGDP_NSA_4QMA",
]
changes = [
    "GNBRGDP_NSA_D3M3ML12",
    "GNBRGDP_NSA_D6M6ML12",
    "GNBRGDP_NSA_D12M12ML12",
    "GNBRGDP_NSA_D1Q1QL4",
    "GNBRGDP_NSA_D2Q2QL4",
    "GNBRGDP_NSA_D4Q4QL4",
    "GNBRGDP_NSA_D1Y1YL1",
]
msp.view_ranges(
    df,
    xcats=ratios,
    cids=cids_dm,
    val="eop_lag",
    title="End of observation period lags (ranges of time elapsed since end of observation period in days), net borrowing requirement ratios, developed markets",
    start=start_date,
    kind="box",
    size=(16, 4),
    legend_bbox_to_anchor = (0.2, -0.005),
    legend_loc = 'lower center'
   )
msp.view_ranges(
    df,
    xcats=ratios,
    cids=cids_em,
    val="eop_lag",
    title="End of observation period lags (ranges of time elapsed since end of observation period in days), net borrowing requirement ratios, emerging markets",
    start=start_date,
    kind="box",
    size=(16, 4),
     legend_bbox_to_anchor = (0.2, 0.5),
    legend_loc = 'lower center'
)

msp.view_ranges(
    df,
    xcats=ratios,
    cids=cids_dm,
    val="mop_lag",
    title="Median of observation period lags (ranges of time elapsed since end of observation period in days), net borrowing requirement ratios, developed markets",
    start=start_date,
    kind="box",
    size=(16, 4),
     legend_bbox_to_anchor = (0.2, -0.05),
     legend_loc = 'lower center'
)
msp.view_ranges(
    df,
    xcats=ratios,
    cids=cids_em,
    val="mop_lag",
    title="Median of observation period lags (ranges of time elapsed since end of observation period in days), net borrowing requirement ratios, emerging markets",
    start=start_date,
    kind="box",
    size=(16, 4),
    legend_bbox_to_anchor = (0.2, 0.5),
    legend_loc = 'lower center'
)
https://macrosynergy.com/notebooks.build/themes/macroeconomic-balance-sheets/_images/66e4d5c160165e5e8c6e8c2fcae692d4f1b23d8d9bd67dee622e5fafa46e4c38.png https://macrosynergy.com/notebooks.build/themes/macroeconomic-balance-sheets/_images/b7b8faafef5f5f3c62cd1f91966755a02ffa39cc7527023660b83c932a987c5c.png https://macrosynergy.com/notebooks.build/themes/macroeconomic-balance-sheets/_images/1f6d17125148de493629113b88ffbd4cf3109efd6e934db9d4851033f3f7ecf9.png https://macrosynergy.com/notebooks.build/themes/macroeconomic-balance-sheets/_images/b1e346478090aaf358de3ed013308acb3ba423310ca58241fdd4d0e75651b890.png

History #

Government borrowing requirement ratios #

Whilst borrowing requirements have displayed much monthly volatility, multi-month trends, particularly 12-month ratios show clear interpretable trends, related to major economic and financial events.

xcatx = ["GNBRGDP_NSA_3MMA", "GNBRGDP_NSA_6MMA", "GNBRGDP_NSA_12MMA"]
cidx = cids_exp

msp.view_ranges(
    df,
    xcats=xcatx,
    cids=cidx,
    sort_cids_by="mean",
    start="2000-01-01",
    kind="bar",
    title="Means and standard deviations of government borrowing requirement ratios, % of GDP, since 2000",
    xcat_labels=[
        "3-month moving average",
        "6-month moving average",
        "12-month moving average",
    ],
    size=(16, 8),
)
https://macrosynergy.com/notebooks.build/themes/macroeconomic-balance-sheets/_images/3d2a25ab1ecf5f08190f0f67a98abd91eb8c1456c338d6da9b70e890cbe38d03.png
xcatx = ["GNBRGDP_NSA_3MMA", "GNBRGDP_NSA_6MMA", "GNBRGDP_NSA_12MMA"]
cidx = cids_exp

msp.view_timelines(
    df,
    xcats=xcatx,
    cids=cidx,
    start=start_date,
    title="Government borrowing requirements, % of GDP",
    title_fontsize=27,
    legend_fontsize=17,
    xcat_labels=[
        "3-month moving average",
        "6-month moving average",
        "12-month moving average",
    ],
    ncol=4,
    same_y=False,
    size=(12, 7),
    all_xticks=True,
)
https://macrosynergy.com/notebooks.build/themes/macroeconomic-balance-sheets/_images/b5dc6ef853a6d8e11f1d04ede74ad2eefa7f0e018e0698615e1a9ec75a5d0b74.png

Borrowing requirement information states have mostly been positively correlated, reflecting common factors such as business cycles, financial crises, and the 2020-21 pandemic.

xcatx = "GNBRGDP_NSA_12MMA"
cidx = cids_m

msp.correl_matrix(
    df,
    xcats=xcatx,
    cids=cidx,
    start="2000-01-01",
    title="Cross-sectional correlations of government borrowing requirements, 12-month moving averages, since 2000",
    size=(20, 14),
)
https://macrosynergy.com/notebooks.build/themes/macroeconomic-balance-sheets/_images/e43d3b8493187710c4a99b10a4ee57966898a7c7bc1e14076e34fe41ca95cae4.png

Importance #

Empirical clues #

To streamline coding and analysis processes, we convert ticker names from monthly frequency to other frequencies and define blacklist periods for currencies. These periods denote times of illiquidity or non-tradeability.

dfx = df.copy()
olds = [
    "GNBRGDP_NSA_2QMA",
    "GNBRGDP_NSA_4QMA",
    "GNBRGDP_NSA_D1Q1QL4",
    "GNBRGDP_NSA_D2Q2QL4",
    "GNBRGDP_NSA_D4Q4QL4",
]
news = [
    "GNBRGDP_NSA_6MMA",
    "GNBRGDP_NSA_12MMA",
    "GNBRGDP_NSA_D3M3ML12",
    "GNBRGDP_NSA_D6M6ML12",
    "GNBRGDP_NSA_D12M12ML12",
]
dfx.replace(to_replace=olds, value=news, inplace=True)
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")
fxblack
{}

Government borrowing and short-dated government bond returns #

There has been strong evidence that point-in-time reported borrowing ratios have forward predictive power for government bond returns at the front end of the curve. The relations between government borrowing requirements (in 6-month and 12-month moving averages) and subsequent excess bond returns for 1-year maturity on a weekly, monthly, and quarterly basis have all been negative and highly significant. The predictive relationship has been dominated by the U.S., which has the strongest (negative) correlation. However, it has also been significant for a panel of six liquid developed markets (Australia, Germany, Spain, UK, Italy and the U.S.).

cidx = [cids_bonds, ["USD"]]
start_date = "2000-01-01"

cr = {}

for idx, cid in enumerate(cidx):
    cr_label = "all" if cid == cids_bonds else "USD"
    cr[cr_label] = msp.CategoryRelations(
        dfx,
        xcats=["GNBRGDP_NSA_6MMA", "GB01YXR_NSA"],
        cids=cid,
        freq="m",
        lag=1,
        xcat_aggs=["last", "sum"],
        start=start_date,
        blacklist=fxblack,
    )

#Labels for the scatter plots
easy_labels = {
    "all": "Major 6 developed bond markets",
    "USD": "U.S. market alone",
}

# Generate scatter plots
msv.multiple_reg_scatter(
    cat_rels=[cr[key] for key in easy_labels.keys()],
    title="Net borrowing requirement ratio and subsequent 1-year government bond excess returns since 2000",
    xlab="Government borrowing requirement, % of GDP: 6-month moving average",
    ylab="1-year govmt. bond excess returns, next month",
    ncol=2,
    nrow=1,
    figsize=(14, 8),
    prob_est="map",
    coef_box="upper left",
    subplot_titles=[f"{lab}" for lab in easy_labels.values()]

)
https://macrosynergy.com/notebooks.build/themes/macroeconomic-balance-sheets/_images/e1391a2597704b590f9dc667ec55c2f4c6da041ae1734f160b3b8385432e05fe.png

Indeed, U.S. borrowing requirements have predicted bond returns across all countries in our sample, testifying to the dominance of the U.S. Treasury market. The chart below verifies a notable negative correlation between U.S. government borrowing requirements and 1-year government bond returns across the 5 non-U.S. markets.

xcatx = [
    "GNBRGDP_NSA",
    "GNBRGDP_NSA_3MMA",
    "GNBRGDP_NSA_6MMA",
    "GNBRGDP_NSA_12MMA",
]

for xc in xcatx:
    calc = [f"{xc}iUSD = iUSD_{xc}"]

    dfa = msp.panel_calculator(
        dfx,
        calcs=calc,
        cids=cids_exp,
    )
    dfx = msm.update_df(dfx, dfa)

cids_bondsxUSD = [bond for bond in cids_bonds if bond != "USD"]

cr = msp.CategoryRelations(
    dfx,
    xcats=["GNBRGDP_NSA_12MMAiUSD", "GB01YXR_VT10"],
    cids=cids_bondsxUSD,
    freq="m",
    lag=1,
    xcat_aggs=["mean", "sum"],
    start="2000-01-01",
)

cr.reg_scatter(
    labels=False,
    title="U.S. net borrowing requirement ratio and subsequent 1-year bond returns since 2000 for non-U.S. markets",
    ylab="1-year govmt. bond excess returns, 10% vol target, next month",
    xlab="U.S. government borrowing requirement, % of GDP: 12-month moving average",
    coef_box="upper right",
    prob_est="map",
)
https://macrosynergy.com/notebooks.build/themes/macroeconomic-balance-sheets/_images/1fc32a9bd54b0eb129e47531e61b1679c9fb01ebe38047f607df009bbf53f674.png

Government borrowing and longer-dated government bond returns #

Predictive power of borrowing requirements has been weaker for longer-dated government bond returns. It has been signficant for the U.S, however.

cidx = [cids_bonds, ["USD"]]
start_date = "2000-01-01"

cr = {}

for idx, cid in enumerate(cidx):
    cr_label = "all" if cid == cids_bonds else "USD"
    cr[cr_label] = msp.CategoryRelations(
        dfx,
        xcats=["GNBRGDP_NSA_12MMA", "GB05YXR_NSA"],
        cids=cid,
        freq="q",
        lag=1,
        xcat_aggs=["last", "sum"],
        start=start_date,
        blacklist=fxblack,
        xcat_trims=[20, 20],
    )

# Labels for the scatter plots
easy_labels = {
    "all": "Major 6 developed bond markets",
    "USD": "U.S. market alone",
}

# Generate scatter plots
msv.multiple_reg_scatter(
    cat_rels=[cr[key] for key in easy_labels.keys()],
    title="Net borrowing requirement ratio and subsequent 5-year government bond excess returns since 2000",
    xlab="Government borrowing requirement, % of GDP: 6-month moving average",
    ylab="5-year govmt. bond excess returns, next quarter",
    ncol=2,
    nrow=1,
    figsize=(15, 6),
    prob_est="map",
    coef_box="upper left",
    subplot_titles=[f"{lab}" for lab in easy_labels.values()],
)
https://macrosynergy.com/notebooks.build/themes/macroeconomic-balance-sheets/_images/035deda4615e9ff73002fe97f0694320a4f522dd01b22c17fe9349914741c172.png

Government borrowing and vol-targeted bond returns versus IRS returns #

To enhance the predictive power of government borrowing requirements, we developed a straightforward, non-optimized linear composite indicator. This indicator is calculated as the simple average of the z-scores of two metrics: the government borrowing requirement ( GNBRGDP_NSA ) and the general government balance as a percentage of GDP ( GGOBGDPRATIO_NSA ).

As a first step, we map Euro IRS returns to the original Euro currencies (‘DEM’, ‘ESP’, ‘FRF’, ‘ITL’). This allows us to later calculate the difference between volatility-targeted bond returns and IRS returns for all available cross-sections, as generic government bond returns are available for these original Euro currencies, while IRS returs are available for Euro.

cidx = cids_dmec
xcatx = ["DU05YXR_VT10", "DU05YXR_NSA", "DU02YXR_NSA", "DU02YXR_VT10"]
calcs = [f"{xc}=  iEUR_{xc}" for xc in xcatx] # mapping Euro IRS returns to the Euro area countries
dfa = msp.panel_calculator(dfx, calcs=calcs, cids=cids_dmec)
dfx = msm.update_df(dfx, dfa)


cidx = cids_exp

# calculate z-scores for the net borrowing requirement ratios and the general government balance

for xc in ["GNBRGDP_NSA", "GGOBGDPRATIO_NSA"]:

    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)


# calculate the fund needs as a simple average of the z-scores of the net borrowing requirement ratios and the general government balance
# calculate the difference between vol-targeted 5-year government bond yields and the 5-year IRS returns

calcs = [
    "FUNDNEEDS_NSA = GNBRGDP_NSA_ZN * 0.5 + GGOBGDPRATIO_NSA_ZN * 0.5 ",
    "GB05YXR_VT10vsDU = GB05YXR_VT10 - DU05YXR_VT10",
    "GB05YXR_NSAvsDU = GB05YXR_NSA - DU05YXR_NSA",
]

dfa = msp.panel_calculator(dfx, calcs=calcs, cids=cids)
dfx = msm.update_df(dfx, dfa)
xcatx = ["FUNDNEEDS_NSA"]

for xc in xcatx:
    calc = [f"{xc}iUSD = iUSD_{xc}"]

    dfa = msp.panel_calculator(
        dfx,
        calcs=calc,
        cids=cids_exp,
    )
    dfx = msm.update_df(dfx, dfa)

xcatx=["FUNDNEEDS_NSAiUSD", "GB05YXR_NSAvsDU"]


cr = msp.CategoryRelations(
    dfx,
    xcats=xcatx,
    cids=cids_bonds,
    freq="m",
    lag=1,
    xcat_aggs=["mean", "sum"],
    start="2000-01-01",
    blacklist=fxblack,
)

cr.reg_scatter(
    labels=False,
    title="U.S. funding needs and subsequent difference between 5-year bond returns and IRS returns since 2000",
    ylab="Generic 5-Year government bond returns minus IRS returns, next month",
    xlab="US funding needs (50% net borrowing requirement ratio and 50% government debt ratios, both in z-scores)",
    coef_box="upper right",
    prob_est="map",
)
https://macrosynergy.com/notebooks.build/themes/macroeconomic-balance-sheets/_images/a5cd2c578acea333cd7af53f71f7958714e08f3bb8738cbece7bdefabbd1c90a.png

Appendices #

Appendix 1: Country-specific notes #

  • Australia publishes a quarterly update on general government statistics, which include general government net lending/borrowing, which we take as a proxy of their quarterly borrowing requirements.

  • Canada posts monthly borrowing requirement data for general government which they define as ‘net change in financing activities’ or ‘financial source/requirement’. They define this as ‘cash coming in to the government and cash coming out’. More information on their methology can be found here .

  • Chile posts monthly borrowing requirements for central government in line with our definition on their government website (financing needs after having considered treasury cash balance).

  • France doesn’t publish monthly borrowing requirements. They publish yearly borrowing requirements, which get updated throughout the year and these correspond to their yearly expected public debt issuance.

  • Germany publishes federal budget monthly statements which include net borrowing numbers in accordance with our general definition: net borrowing is what comes after use of their cash resources, seigniorage and movements in reserves.

  • Hong Kong publishes provisional deficit financing numbers for the Hong Kong Federal Special Administrative region, which agree with our general definition of borrowing requirements (financing after use of cash).

  • India does not publish monthly borrowing requirement numbers. As a proxy, we take the sum between domestic and external financing which they publish monthly in their government statistics bulletin. This data is for the Union Government.

  • Indonesia publishes central government monthly figures for net financing.

  • Israel does not publish net borrowing requirement figures so we use a proxy by summing net domestic financing and net foreign financing for the central government.

  • Italy has good central government borrowing requirement data which they publish each month.

  • Mexico does not publish borrowing requirements so we take a proxy: we use public debt for the federal government, which comes in stock form, and we convert it into a monthly flow figure.

  • Peru publishes central government net financing numbers on a monthly basis.

  • Poland does not publish borrowing requirements according to our definition so instead we use what they define as Net Cash Inflows from financing activities as a proxy (calculated as inflows from financing activities minus net liabilities).

  • Russia publishes a monthly record of ‘sources of financing the deficit’ which is in line with our definition (financing needs after having considered treasury cash balance).

  • Singapore does not publish borrowing requirements so we take quarterly government debt numbers as a proxy.

  • South Africa publishes monthly data fully in line with our definition of borrowing requirements on their treasury website (financing needs after having considered treasury cash balance).

  • Spain, Sweden and Switzerland publish monthly borrowing requirements in line with our definition (financing needs after having considered treasury cash balance). Spain’s figures are for the general state administration, while Sweden and Switzerland’s are for the central government.

  • Taiwan does not publish borrowing requirements, instead we use ‘financing net borrowing’ as a proxy, which they report annually for the central government.

  • Thailand publish monthly figures for central government ‘Net lending / Net borrowing’ which we take as a proxy for borrowing requirements. The figures are calculated as “revenues - expenditures - transactions in non financial assets”.

  • Turkey publishes monthly ‘net borrowing’ numbers for the central government which are in line with our definition of borrowing requirements (financing needs after having considered treasury cash balance).

  • The UK present ‘central government net cash requirements (CGNCR)’ on a monthly basis, defined as the cash needed immediately for the UK government to meet its obligations. This is fully in line with our definition of borrowing requirements. See here for further details.

  • The US doesn’t publish borrowing requirements in line with our definition, so we take the monthly figures they provide for ‘borrowing from the public’ for the federal government. See here for further details.

  • Colombia, Japan, Norway, Romania and South Korea do not publish borrowing requirements.

Appendix 2: Currency symbols #

The word ‘cross-section’ refers to currencies, currency areas or economic areas. In alphabetical order, these are AUD (Australian dollar), BRL (Brazilian real), CAD (Canadian dollar), CHF (Swiss franc), CLP (Chilean peso), CNY (Chinese yuan renminbi), COP (Colombian peso), CZK (Czech Republic koruna), DEM (German mark), ESP (Spanish peseta), EUR (Euro), FRF (French franc), GBP (British pound), HKD (Hong Kong dollar), HUF (Hungarian forint), IDR (Indonesian rupiah), ITL (Italian lira), JPY (Japanese yen), KRW (Korean won), MXN (Mexican peso), MYR (Malaysian ringgit), NLG (Dutch guilder), NOK (Norwegian krone), NZD (New Zealand dollar), PEN (Peruvian sol), PHP (Phillipine peso), PLN (Polish zloty), RON (Romanian leu), RUB (Russian ruble), SEK (Swedish krona), SGD (Singaporean dollar), THB (Thai baht), TRY (Turkish lira), TWD (Taiwanese dollar), USD (U.S. dollar), ZAR (South African rand).