Critical Materials Atlas
Working note · June 2026

Share-faithful reconstruction of bilateral trade from raw UN Comtrade — and a pre-registered nowcast for critical materials

Varcolacus · independent research · public data only · comtrade-reconcile · interactive atlas

Version 2026-06-29 · cite the dated revision in the commit history · trade years 2002–2024 (BACI HS02 + HS17, V202601)

⬇ Download PDF The finding, interactive →
In plain terms. I rebuild who really trades 32 critical raw materials from raw UN Comtrade, check it against the official CEPII BACI data, and find that in 18 of 32 the country that exports the most isn’t the one that mines the most — so standard import statistics misread where supply is concentrated. I extend the series back to 2002, test the trends rather than just plotting them, and pre-register the forecast. Everything is public and reproduces from the committed code, no API key.
Full abstract

I reconstruct bilateral trade in 32 critical raw materials from raw UN Comtrade using a Gaulier–Zignago-style mirror reconciliation (reliability-weighted inverse-variance averaging of exporter and importer reports), and validate it against the official CEPII BACI dataset on the statistics that matter for supply-concentration analysis: top exporters, trade shares, and Herfindahl concentration. On 2024 the reconstruction recovers the top exporter in 25 of 30 materials with a share mean-absolute-error of 3.5pp and an HHI correlation of 0.92 (importer side: 22/30, 4.2pp, 0.97). I then (i) document an origin gap — in 18 of 32 materials the top exporter is not the top miner, so import-origin statistics systematically overstate the geographic diversification of supply — and (ii) build a provisional 2025 nowcast and a directional 2026 scenario whose shared assumption (share persistence) I test out-of-sample (85% year-over-year top-exporter persistence; a leader's annual share move has P50 3.5pp / P90 8.7pp) and whose accuracy I pre-register against the next BACI release. All inputs are public; the raw Comtrade is committed, so all code and fixtures reproduce the reconciliation and validation end-to-end with no API key. Finally I extend the reconciled series back to 2002 and, rather than merely plotting concentration as the literature does, test it: 9 of 32 materials show a statistically significant rising export-concentration trend (Mann–Kendall, FDR-corrected), with structural breaks clustering in 2012–2016.

1.The question

Under customs rules, refining and substantial transformation confer "origin": when a country imports an ore, processes it and re-exports, the traded good takes the processor's nationality and the customs record stops there. Trade statistics therefore measure where a material was last shipped from, not where it came out of the ground. For critical-material supply-risk analysis — where the policy question is genuine geographic concentration of the upstream — this is a systematic blind spot. This note builds the data to measure it and quantifies how large the gap is.

2.Data and vintages

Table 1 — sources and exact vintages. All public.
LayerSourceVintage / coverage
Reconciled bilateral trade (reference)CEPII BACIHS17 release V202601 (Jan 2026), years 2018–2024
Raw bilateral trade (reconstruction input)UN Comtrade APIannual + monthly, reporter×partner, pulled 2025–26
Mine production sharesUSGS Mineral Commodity Summarieslatest published (approx.)
Refining / processing sharesIEA Critical Minerals Outlooklatest published (approx.)
ReservesUSGS Mineral Commodity Summarieseconomically recoverable (approx.)
Gravity covariates (CIF/FOB)CEPII dist_cepiidistance, contiguity
Commodity prices (2026 tilt)World Bank Pink Sheetmonthly, Q1-2026 vs Q1-2025

The 32 materials are mapped to HS6 product codes; three of them — gallium, germanium and hafnium — share a single HS6 code (811292) and so carry identical trade columns that cannot be separated. This is flagged wherever those materials appear.

3.Reconciliation method

For each product and country pair (i, j) two reports exist: the exporter's free-on-board value xij and the importer's cost-insurance-freight value mji. Following Gaulier & Zignago (2010), I (a) strip an estimated CIF/FOB markup from import values, (b) weight each reporter by an estimate of its reliability, and (c) average the two reports as an inverse-variance weighted mean in logs.

CIF/FOB markup

The markup is recovered from the within-product mirror ratio. On the 32-material slice a gravity regression of log(m/x) on distance and contiguity is not identified (R² ≈ 0.01) — BACI estimates this on the full ~5,000-product universe — so I fall back to a robust per-product median markup, the same quantity in reduced form.

Reliability weights (variance components)

Let dij = log xij − log mji be the mirror discrepancy. Modelling it as the sum of a reporter-i and reporter-j error, an OLS regression of d² on reporter dummies yields each reporter's error variance vi (a variance-components estimator). The reconciled value averages the two reports with weights inversely proportional to those variances:

log tij  =  ( wi·log xij  +  wj·log m̃ji ) / ( wi + wj ),    wi = 1 / vi

where is the import value after removing the CIF/FOB markup. The result is a single reconciled bilateral matrix per product per year — the same object BACI produces, built here from the raw reports.

4.Validation against BACI

The reconstruction is validated on the statistics the atlas actually uses — shares, ranks, concentration — not on absolute levels.

Table 2 — reconstruction vs official BACI, both sides of the market.
Year · sideTop-1 exporter/importer correctShare MAEHHI correlation
2024 · exporter25 / 303.5 pp0.92
2024 · importer22 / 304.2 pp0.97
2022 · exporter22 / 303.9 pp0.89

On levels. Reconstructed totals run ~1.5–1.8× BACI. This is not a reconciliation artefact: current raw Comtrade already sits ~1.8–1.9× above BACI's published snapshot before any reconciliation (Comtrade absorbs continuous revisions; BACI applies additional outlier/quality filtering this note does not replicate), and the reconstruction sits between the two raw mirror reports. A settled year (2022) still shows ~1.5×, so the offset is partly persistent filtering, not only vintage. The claim is therefore explicitly share-faithful, not level-faithful — which is the relevant property for concentration analysis.

5.Nowcast and pre-registration

BACI lags ~18 months. For the years it has not released I extend the series:

Both rest on one assumption — that last year's trade structure predicts this year's. I test it directly on the measured 2018–2024 series, scoring year T−1's shares as a nowcast for year T:

Table 3 — out-of-sample persistence (192 material-years, 2018–2024).
MetricValue
Top-exporter unchanged year-over-year85%
Mean share MAE across exporters0.37 pp
Leader's annual share move — median (P50)3.5 pp
Leader's annual share move — P908.7 pp

The P50/P90 are the nowcast's empirical uncertainty band, shown on the interactive year slider. Most-predictable materials: magnets, coking coal, manganese, niobium; least: arsenic, beryllium, hafnium, gallium, germanium, fluorspar (thin or non-reporting-producer markets).

Pre-registration. Before BACI 2025 exists, I have committed (PREREGISTRATION.md, in git history at the relevant commit) to how the frozen flows_2025.json will be scored when it releases — validate.py 2025, same metrics — with numeric thresholds (≥ 22/30 top-1, ≤ 5pp share MAE, ≥ 0.88 HHI correlation; scored on the 30 validatable materials) and a commitment to publish the result pass or fail. The bet is written down first; the test is falsifiable on a fixed date by one command.

6.Finding: the origin gap

With reconciled trade and the mine-production layer side by side, define, per material in a given year:

origin gap  =  (top exporter's share of world trade)  −  (that same country's share of world mine output)

A large positive gap means a country sells far more than it mines — it processes or trans-ships someone else's ore. The headline result, on 2024: in 18 of 32 materials the top exporter is not the top miner; in 4 of 32 a country mining under 5% of world supply exports more than a quarter of it.

Table 4 — largest origin gaps, 2024 (where exporter ≠ miner).
MaterialTop exporterexportsit minesgapLead miner
Beryllium, unwroughtKazakhstan89%0%+89United States (58%)
Strontium carbonateGermany60%0%+60Iran (38%)
Lithium carbonateChile75%24%+51Australia (48%)
Aluminium ores / bauxiteGuinea72%24%+48Australia (24%)
PhosphorusVietnam47%1%+46China (41%)
Cobalt oxides & hydroxidesFinland29%0%+29DR Congo (74%)
Tantalum, unwroughtUnited States22%0%+22DR Congo (41%)
Nickel, unwroughtNorway18%0%+18Indonesia (50%)

The twist. The intuitive story is "China hides behind refineries." The data only half-supports it: for many materials China is both the lead miner and the lead exporter — its position is largely genuine, not an artefact. The materials where exporter and miner diverge are instead fronted by industrial refiners and entrepôts — Finland for Congolese cobalt, Japan for largely Chinese-mined titanium, Germany for Iranian strontium, Norway for Indonesian nickel. The corrective therefore cuts both ways: it deflates apparent dependence on refiner countries, and it reveals that genuinely concentrated upstreams (Congo cobalt, Indonesian nickel) are more concentrated than the diversified-looking trade ledger suggests.

7.Trends, breaks and tested concentration (2002–2024)

The reconciled series is extended back to 2002 using CEPII BACI's HS2002 release, spliced to HS17 from 2017. The 32 materials' HS6 codes are stable across that window with two documented exceptions: boron, whose code was merged in HS2012 (recovered by summing its two predecessor codes), and hafnium, pooled inside 811292 before HS2022 (as gallium and germanium remain). This yields a continuous 22-year, share-faithful panel — long enough to test, not merely plot, how concentration evolved. Most critical-minerals work stops at plotting Herfindahl trajectories; here each material's export-HHI, China-share and origin-gap series is put through standard trend statistics:

The result: 9 of 32 materials show a statistically significant rising export-concentration trend (FDR<0.05); their structural breaks cluster in 2012–2016, the period in which export-control measures and critical-minerals-security policy intensified. The steepest are beryllium, tungsten, bauxite and rare-earth magnets. The aggregate origin gap — averaged across materials — is wide and somewhat higher at the end of the period (~15→~18pp), but the index steps at the 2017 HS-vintage join, so this is read as trade-side drift, not a clean trend — an HS17-only confirmation is the proper test — now carried out on the robustness page (autocorrelation-robust Mann–Kendall plus the HS02-vs-HS17 sub-period check). Because USGS mine shares enter as a current fixed reference, this isolates how the trade map drifted from today's mining geography; it is a trade-side, not a geological, trend. I did not find a peer-reviewed study applying this combined Mann–Kendall / Theil–Sen / Pettitt screening to critical-material export-concentration panels; formal trend and change-point inference on these series appears uncommon in the policy literature. The contribution is the testing, not the plotting.

8.Further analytical layers

Four additional lenses are built on the same reconciled trade, each deliberately framed as a screening indicator, not a structural claim:

9.Limitations and non-claims

10.Reproducibility

Two public repositories, no API key required to reproduce the pipeline end-to-end: the interactive atlas (Varcolacus/critical-materials-atlas) and the reconciliation engine (Varcolacus/comtrade-reconcile, CI green). The raw 2024 Comtrade is committed (gzipped) under fixtures/raw/, so the reconciliation regenerates from raw rather than from a pre-computed file. On a fresh clone of the engine: pip install -r requirements.txt, then ATLAS_ROOT=fixtures python reconcile.py 2024 (regenerates the reconciliation), … validate.py 2024 (Table 2), python backtest.py (Table 3), python findings.py (Table 4). CI runs the reconcile → validate chain on every push. The Comtrade key is needed only for the initial network pull and is read from the environment, never committed.

References

Data.

Methods.

Recent critical-mineral trade-network & criticality (context).