Cross-border claims / Methodology
Methodology
Everything in this layer comes from one table, the BIS Locational Banking Statistics, on one measure. This page states the selection, the vintage, and four ways the table will mislead a reader who does not filter it.
The selection
- Dataset
- BIS Locational Banking Statistics, public core cut (WS_LBS_D_PUB), from the BIS Data Portal at data.bis.org. Free to use with attribution to BIS.
- Measure
- Cross-border claims, amounts outstanding (measure_code = C). The table also carries cross-border liabilities (L) in the same rows and columns. The two are never summed, and no figure in this layer uses L.
- Basis
- Residence, not nationality. A position is attributed to the country where the reporting bank office is located, so a US-owned bank booking a loan in London is a United Kingdom claim. This is the opposite convention from the consolidated statistics.
- Fixed dimensions
- Cross-border position type (N), all instruments (A), all currencies (TO1), all currency types (A), all parent nationalities (5J), all reporting-bank types (A), all counterparty sectors (A). Free dimensions: measure, reporter, counterparty, quarter. Nothing here is a currency or sector slice.
- Unit
- USD millions, nominal (unit_mult = 6 in every row of the file). Never deflated, never exchange-rate adjusted. Displayed here compacted to billions and trillions.
- Coverage
- Quarterly, Q4 1977 to Q4 2025. 48 reporting systems appear across the history, 46 in the final quarter, against 219 counterparty countries.
- Benchmark quarter
- Q1 2008. Every peak-to-now comparison in this layer is cut at it. It is derived, not chosen: it is the quarter of the maximum of the all-reporters series before 2011-Q1, read from the file at build time, so no query in this layer can be cut at a quarter that does not exist in the data.
- Vintage
- The parquet in this repo ends at Q4 2025. BIS revises the locational statistics routinely and back quarters do move, so figures here are as of this vintage and are not guaranteed to match a later BIS download.
Four traps, and what this layer does about them
1. Two measures live in one file
bis_lbs mixes cross-border claims (C) and cross-border liabilities (L) in the same columns, distinguished only by measure_code. Aggregating without filtering adds an asset stock to a liability stock. Every query in this layer filters measure_code = ‘C’ explicitly. Both are amounts outstanding: this cut contains no flow measure and no exchange-rate-adjusted change, which is why nothing here is described as a flow.
2. BIS aggregates sit in the country columns
The reporter column carries 5A, “All reporting countries”. The counterparty column carries 5J (“All countries”), 4T (emerging market and developing economies), 5C (euro area), 5R (advanced economies), a set of “Unallocated” buckets, and defunct states including the USSR, Yugoslavia and Czechoslovakia. Summing countries and aggregates together double counts. Every aggregate has a null iso3 and every real country has a three-letter one, across the whole file, so iso3 IS NOT NULL cleanly separates them. Rankings and bilateral cells here use named countries only, and the world total is read from the BIS 5A x 5J row rather than summed. The two are cross-checked at build time: in Q4 2025 the 5A x 5J row and the sum of the 46 individual reporters’ own totals differ by less than one USD million, the unit of the file, and the build fails if they ever differ by more.
3. NOT IN against a nullable column silently returns nothing
The rows for reporter 5A have a null rep_iso3. A subquery that selects rep_iso3 without guarding for null puts a null into the set, and every NOT IN against it evaluates to unknown, returning an empty result rather than an error. In drafting this layer that bug reported zero systems withholding a counterparty breakdown; the figure is 15. It is recorded here because a silent empty set is the failure mode most likely to reach a published page.
4. Bilateral cells do not add up to the reporter’s total
Summing a reporting system’s named counterparty cells does not reproduce its published all-countries total. Across the whole table in Q4 2025 the difference is $5.60T, 12.2% of the $45.97T total, and it has two parts. $4.30T is the books of the 15 systems that publish no country cells at all. The other $1.30T is what is left inside the 31 systems that do publish a split: their published totals less the sum of their named country cells. This layer attributes that residual to no borrower. It never reconstructs a total by summing counterparties either: it reads the published total and reports the coverage ratio alongside it.
Which pages exist
The set of reporter pages is generated from the data, not from a country list. Every system with a cross-border claims total in bis_lbs gets a page: 48 of them, being the 46 reporting in Q4 2025 plus the 2 that have stopped reporting (Russia, last reported Q4 2021; Curaçao, last reported Q2 2017), whose pages are frozen at their final quarter and labelled. Nothing else gets a page. Of the 46 active systems, 31 publish a counterparty breakdown and 15 publish a total only; the latter get a page carrying their total and their history, and a statement that the breakdown does not exist, rather than an empty table or an imputed one.
Relationship to the cross-border layer
This layer and cross-border exposure read the same BIS table from opposite ends. /claims is the creditor view, one page per reporting system, asking what it lends. /crossborder is the borrower view, one page per counterparty country, asking who funds it, and it additionally reads the consolidated statistics (bis_cbs) for the bank-nationality lens. The dyad level, one page per lender-borrower pair, is not built.
Source: BIS Locational Banking Statistics (WS_LBS_D_PUB), BIS Data Portal. Free to use with attribution to BIS.