Lab · macro-forecast-lab-latam
I forecast growth for 20 Latin American economies, and prove what every forecast is worth.
2026–2027 forecasts for every economy, with 80 and 95 % confidence bands and their hit rate measured in the backtest, year by year. Behind them, a lab that pitted thirteen models —from an AR(1) to an LSTM— against the naive forecast, with every gain put to its test. Filter it, compare it and play against it.
Python · statsmodels · scikit-learn · PyTorch · rolling origin · Diebold-Mariano, Holm and Wilcoxon
v1.1.0 · September 2026 · code and results public
- 20economies under one protocol
19 with annual series since 1961, and eight quarterly
- 0.86AR(1) error relative to naive, in calm
median of 19 annual economies · Wilcoxon p < 0.001
- 0 of 27per-economy best models that survive Holm
across the 27 LATAM series, quarterly and annual
- 17 of 20economies without a single year holding all 33 variables
the frontier is measured before modelling
Overview
Twenty economies, sixty-five years and their forecast, on one dashboard
Pick economies, a metric and a period: every chart moves with the filter, and with no filter you see the whole region. The markers flag the shocks behind the falls —the corralito, the Tequila crisis, the hyperinflations— and the shaded zone on the right is the 2026–2027 forecast with its bands.
Loading the lab's series…
You against naive
Before you read the result, try to beat it yourself
I show you an economy up to some year. Drag the amber dot to where you think next period's growth will land, then reveal. Naive just repeats the last value. Play a few rounds, and try 2020.
Loading the lab's series…
Rolling origin
How to evaluate without cheating: one origin at a time
Each model is retrained on what existed up to the origin, forecasts one step, logs its error and moves on. It never sees the value it forecasts. Move the origin or press play, and watch the order between models flip the moment 2020 comes in.
Loading the lab's series…
The region
The whole region, one verdict that holds
Each dot is an economy: its error divided by naive's. Left of the line, the model wins. The test that matters is not each economy's, but whether they all push the same way: that is the Wilcoxon column.
Loading the lab's series…
Frequency
The same LSTM wins or loses with the frequency. It is not the network
In Colombia's break the LSTM lost to naive on monthly data and won on quarterly data. An experiment with predictions registered before running it separated frequency, adjustment and source. Switch the frequency and watch which bar moves.
Loading the lab's series…
Multiple comparisons
Test 18 models at 5 % and one will win by chance
Calm periods in Colombia's monthly ISE are where the most models seem to beat naive. Turn on Holm's correction, which asks more of anyone tested alongside many others, and count how many stars survive.
Loading the lab's series…
Verdict
What stands, and what does not
In calm times, a one-parameter AR(1) beats naive across the region. Nothing else holds region-wide.
0.861 · p < 0.001 · 19 economies
That is the median of the AR(1) error divided by naive's across the 19 annual economies, and they all push the same way. The eight quarterly economies show the same thing, all eight of them. Within each economy, the best model fails the correction for multiple comparisons in all 27 series. The exception is Colombia's monthly calm, with 246 months: there four models do withstand it.
Established
- 1In calm times, the AR(1) beats naive across the region: 8 of 8 quarterly economies and a median of 0.861 across the 19 annual ones.
- 2The coverage frontier is regional: in 17 of 20 economies there is not one year holding all 33 variables.
- 3The regime combination that worked on Colombia's ISE does not replicate outside it.
- 4Colombia's apparent reversal across frequencies comes from the benchmark: naive is far harder to beat one month ahead than one quarter ahead.
Not established
- 1A ranking of models within any LATAM economy: after Holm, no best model is left standing in the 27 series.
- 2Anything about skill in the annual break: two observations per economy and a naive that loses by construction.
- 3Whether networks help in the quarterly break: they win in 5 of 8 economies and no win is significant.
Protocol
The rules that make a number count
Nothing sees the future
Rolling origin with an expanding window: every model is retrained at every origin on what existed up to it. Scalers fit on the training span only, and networks stop early against a validation cut from their own training data.
No frequency is filled in
An annual variable stays annual. And a series never skips years: the longest contiguous span is used, because a lag model would treat 1985 → 1987 as a single year.
A failure is not a win
A model that fails to forecast at more than 10 % of the origins is dropped from the ranking. Once, a model looked like the winner because it had only competed on the easy origins.
No gain without its test
Diebold-Mariano against naive, with the p adjusted by Holm. Across economies, Wilcoxon. An error difference without a p cannot tell an improvement from noise.
The regime follows what is forecast
Calm and break are defined by the forecast period, not the origin. Version 0.1.0 had it backwards and the 2020 crash landed in the calm: the audit caught it.
What was chosen by looking is a hypothesis
The 2020–2021 break was chosen after seeing the data, so everything that depends on it is published as a hypothesis. The frequency experiment's predictions were written down before it ran.
Reproduce
Everything runs offline, from the repository
uv syncThe exact environment from uv.lock, torch included.
uv run python -m macro_lab.lab_latamTracks C and D: 8 quarterly and 20 annual economies.
uv run python -m macro_lab.lab_frecuenciaThe frequency, adjustment and source experiment, with its pre-registered rule.
uv run python -m macro_lab.exportar_webThe JSON this page reads. Nothing is recomputed here: it is read.
World Bank and IMF data are versioned in the repository. The IMF quarterly series are seasonally adjusted, because the IFS does not publish the unadjusted version for those economies, and that is stated. The errors found and their causes are in the repository's log.
Status
A closed experiment, published with what did not work
- 1v1.1.0 released: four tracks, a pre-registered frequency experiment and 17 protocol tests in CI.
- 2The v1.0.0 audit fixed eight errors, and two headlines from the previous version did not survive. It is all in the log.
- 3Out of scope, and said so: horizons beyond one step, a fixed 50/50 combination, and real-time vintages for the annual variables.
Stop choosing between the one who reads the business and the one who builds the data.
If your team needs someone who reads the P&L and builds the pipeline that feeds it, let's talk this week. I reply within one business day.