forex-centuries
Exchange rates, precious metals, interest rates, commodity prices, inflation, GDP, real wages and sovereign debt, from 1 CE to 2026, assembled from 26 sources into one reproducible build.
- Snapshot
f79a85b- Committed
- 26 February 2026
- Code license
- MIT (code and compilation)
- Data terms
- Each source keeps its own — see Provenance
forex-centuries is a long-run monetary and economic dataset: exchange rates from 1106, gold from 1257, commodity prices from 1260, real interest rates from 1311, GDP per capita from the year 1, and sovereign debt and crisis indices from 1800. Twenty-three automated fetchers and three manually maintained sources feed an eight-step build that normalizes everything into unified yearly and daily panels.
The point of the collection is duration. Modern exchange-rate theory is fitted on samples that begin in 1971, occasionally 1900, in a world where currency systems are a thousand years old. Most of the interesting behaviour — regime collapse, debasement, the end of a reserve currency — is outside the window.
Status
This page documents the repository snapshot committed on 26 February 2026.
Observation dates vary by source; the commit date does not establish data
freshness. Cite the snapshot rather than the branch: main moves, and a
citation pointing at a moving branch does not identify what anyone used.
The repository runs a scheduled Weekly Data Update. Every run recorded in the GitHub Actions history has failed — thirty of thirty, most recently on 21 September 2026, at the “Update sources” step. That is the observed state of the refresh job. It says nothing either way about whether the committed data is sound, and it does mean no automated refresh has landed since the last manual commit.
The repository currently has no DOI, and no tags or releases, so the citation below pins a commit hash. Minting a DOI through Zenodo would give a stable identifier per release; a hash is the substitute until then.
Coverage
| Category | What | Countries / series | Period |
|---|---|---|---|
| GDP per capita | Real GDP per person | 178 countries | 1 CE – 2022 |
| Exchange rates | Bilateral FX vs USD, GBP, and cross rates | ~243 countries | 1106 – 2026 |
| Gold | Gold prices in GBP and USD | Global | 1257 – 2025 |
| Silver | Silver prices and the gold/silver ratio | Global | 1687 – 2025 |
| Commodity prices | 973 historical plus ~70 modern series | European and Asian cities, then global | 1260 – 2026 |
| Interest rates | Real and nominal, short and long term | 8 countries historical; UK and US nominal | 1311 – 2025 |
| Inflation / CPI | Consumer price indices | ~180 countries | 1500 – 2025 |
| Real wages | Labourers’ real wage in subsistence ratios | ~40 countries | 1820 – 2000+ |
| Sovereign debt | Public debt-to-GDP | 191 countries | 1800 – 2016 |
| FX regimes and crises | Peg/float classifications; banking, currency and debt crisis indices | ~190 countries | 1800 – 2021 |
| Real effective exchange rates | Trade-weighted, CPI-deflated | 178 countries | 1960s – 2026 |
| Swedish historical macro | FX, CPI, wages, GDP, money supply, stocks, bonds | Sweden | 1277 – 2026 |
| Historical financial statistics | Official and market FX, rates, money supply, central bank balance sheets | Various | ~1500 – 1950 |
| Macroeconomic panel | 59 variables across FX, CPI, rates, GDP, credit, housing, equities | 18 advanced economies | 1870 – 2017 |
End dates are the last observation in the provider’s file at this commit, not the provider’s current coverage — World Bank exchange rates stop at 2024 here and World Bank commodity prices at January 2026, both of which have moved on upstream since.
Depth by series: 2,000+ years for GDP (Maddison, from 1 CE), 900 for medieval exchange rates (MEMDB, 1106), 768 for gold (MeasuringWorth, 1257), 707 for real interest rates (Schmelzing, 1311), 654 for commodity prices (Allen-Unger, 1260), 526 for exchange-rate panels (Clio Infra, 1500), 55 for daily FX (FRED, 1971).
Provenance
Raw files land in data/sources/<provider>/ untouched, exactly as the provider
published them, and build.py derives the panels from there. Nothing in
data/derived/ is hand-edited, so any number can be traced back to a provider
file and re-derived from it.
Licensing is two separate questions. The repository’s LICENSE is MIT, and
it covers the code and the compilation — the fetchers, the build, the structure.
It does not and cannot relicense the underlying data. Each provider below sets
its own terms, and they differ: some are open, some require attribution, some
restrict redistribution or commercial use, and a few are gated. Check the terms
of any source you rely on, and cite that source in addition to this dataset.
Automated
| Source | Data | Period |
|---|---|---|
| FRED | 23 daily FX pairs, 2 USD indices | 1971 – 2025 |
| IMF IFS via Code for IATI | 173 currencies vs USD, monthly | 1955 – 2025 |
| BIS | Bilateral and effective rates, ~190 economies | 1957 – 2026 |
| Sveriges Riksbank | 53 SEK bilateral series, daily | 1900 – 2026 |
| World Bank FX | Official rates, all members | 1960 – 2024 |
| World Bank Commodities | ~70 commodity prices | 1960 – Jan 2026 |
| JST Macrohistory | 18 economies, 59 variables | 1870 – 2017 |
| Penn World Table | 185 countries, FX and PPP | 1950 – 2023 |
| MeasuringWorth | FX, gold, interest rates, US CPI | 1257 – 2025 |
| Clio Infra | FX, inflation, bonds, debt, GDP, real wages | 1500 – 2016 |
| FreeGoldAPI | Gold, silver, gold/silver ratio | 1258 – 2025 |
| LBMA | Daily gold and silver, USD/GBP/EUR | 1968 – 2025 |
| DataHub Gold | Monthly gold, USD | 1833 – 2025 |
| IRR (Ilzetzki–Reinhart–Rogoff) | De facto FX regime classifications | 1940 – 2021 |
| Bank of England | Millennium dataset: $/£, rates, prices, GDP | 1791 – 2016 |
| Schmelzing (BoE) | Real interest rates, 8 countries | 1311 – 2018 |
| Maddison Project | GDP per capita, 178 countries | 1 CE – 2022 |
| Allen-Unger GCPD | 973 commodity price series | 1260 – 1914 |
| Bruegel / Darvas REER | Real effective exchange rates, 178 countries | 1960s – 2026 |
| IMF HPDD | Sovereign debt-to-GDP, 191 countries | 1800 – 2015 |
| CFS Historical Financial Statistics | FX, rates, money supply, central bank balance sheets | ~1500 – 1950 |
| Riksbank Historical Monetary Statistics | Swedish FX, CPI, wages, GDP, money, securities | 1277 – 2020 |
| Reinhart–Rogoff | Regimes, debt/GDP, inflation, crisis indices | 1800 – 2016 |
Manual
Committed to the repository because the provider offers no programmatic export.
| Source | Data | Period | Why manual |
|---|---|---|---|
| MEMDB Spufford | 13,197 medieval exchange quotations, 521 places | 1106 – 1500 | No export API |
| MEMDB Metz | 50,559 records, Lower Rhine and comparisons | 1350 – 1800 | No export API |
| Global Macro Database | 243 countries, USD FX and REER | 1960 – 2024 | Email-gated |
Downloads
Both archives are the pinned snapshot, not the current branch:
The built panels sit in data/derived/normalized/:
yearly_unified_panel.csv (long, ~24,700 observations across 243 countries,
1500–2025), yearly_unified_wide.csv, fred_daily_normalized.csv (13,802 dates
× 23 currencies) and its wide form.
Loading it
Clone at the pinned commit, so the files match this page:
git clone https://github.com/unbalancedparentheses/forex-centuries
cd forex-centuries
git checkout f79a85bf6ae0dbad8d79ea56902caef43c7bd947
The yearly panel is long-format with four columns — year, country,
rate_per_usd, source — and needs no dependencies to read:
import csv
from collections import defaultdict
series = defaultdict(list)
with open("data/derived/normalized/yearly_unified_panel.csv") as f:
for row in csv.DictReader(f):
series[row["country"]].append((int(row["year"]), float(row["rate_per_usd"])))
gb = sorted(series["United Kingdom"])
print(f"{len(gb)} years, {gb[0][0]}–{gb[-1][0]}")
Or with pandas, taking one country’s series:
import pandas as pd
panel = pd.read_csv("data/derived/normalized/yearly_unified_panel.csv")
gb = panel[panel.country == "United Kingdom"].set_index("year").rate_per_usd
print(gb.describe())
The source column records which provider supplied each observation, so a
series assembled from more than one source can be split back apart — worth doing
before drawing conclusions from a join, since providers disagree about the same
year more often than you would like.
Citing it
No DOI yet, so cite the snapshot by hash:
@misc{forex-centuries,
author = {Federico Carrone},
title = {forex-centuries: Twenty Centuries of Exchange Rate, Gold,
Silver, Interest Rate, and Commodity Price Data (1 CE--2026)},
year = {2026},
howpublished = {\url{https://github.com/unbalancedparentheses/forex-centuries/tree/f79a85bf6ae0dbad8d79ea56902caef43c7bd947}},
note = {Snapshot f79a85bf6ae0dbad8d79ea56902caef43c7bd947,
committed 2026-02-26}
}
Federico Carrone, forex-centuries: Twenty Centuries of Exchange Rate, Gold,
Silver, Interest Rate, and Commodity Price Data (1 CE–2026), 2026. Snapshot
f79a85b, committed 26 February 2026.
https://github.com/unbalancedparentheses/forex-centuries/tree/f79a85bf6ae0dbad8d79ea56902caef43c7bd947
Cite the underlying providers too. The compilation is a convenience; the measurements are theirs.
Written from this data
- Twenty Centuries of Financial Data — what 240 countries and 2,000 years show about fat tails, pegs, and currencies against gold.
- Detecting Crashes with Fat-Tail Statistics — estimating tail indices on the long panels.