For 2016–2025, the downloaded snapshot contains 2560 EUR/USD reference publications across 2609 Monday-to-Friday dates. All 49 weekdays without an observation coincide with scheduled TARGET closures. There are 2560 observations on scheduled-open weekdays and zero unexpected gaps. This checks completeness of this snapshot, not historical website uptime or first-release timeliness.
Method and findings
We select one official XML observation of USD per EUR per publication date, from 1 January 2016 through 31 December 2025. A separate official API CSV agrees on all 2560 dates and values. Our independently constructed calendar excludes weekends and the TARGET closures: 1 January, Good Friday, Easter Monday, 1 May, 25 and 26 December. Holidays falling on weekends are not counted again as unpublished weekdays.
Annual publications, in year order, are 257, 255, 255, 255, 257, 258, 257, 255, 256 and 255. Unpublished weekdays are 4, 5, 6, 6, 5, 3, 3, 5, 6 and 6. Annual and daily calendar CSVs expose every classification.
Each year has a maximum interval of five calendar days between consecutive publication dates. In 2025, one such interval is 17–22 April. Four calendar dates intervene: two TARGET closure days and a weekend. This does not mean five missing observations.
What a daily reference rate cannot show
A single reference observation supplies no open, high, low, close, spread, volume or tick path. It cannot establish whether an intraday stop-loss was touched or reproduce trade execution. Forward filling a holiday creates an imputed value, not an observed market quote; keep that distinction explicit.
Publication time was not uniform throughout the period: from 1 July 2016 ECB moved it from around 14:30 to 16:00 CET. This study reconstructs neither intraday prices nor historical first-release times.
Source: ECB statistics. Snapshots downloaded 7 October 2026; results and classifications are our calculations. source and SHA manifest records source hashes; research.py and finalize.py use the Python standard library. Reuse conditions are included in the reproduction package. Future exports may be revised.
Open the full chart ↗
Results table
| Year | Mon–Fri dates | Publications | TARGET closures | Unexpected gaps |
|---|---|---|---|---|
| 2016 | 261 | 257 | 4 | 0 |
| 2017 | 260 | 255 | 5 | 0 |
| 2018 | 261 | 255 | 6 | 0 |
| 2019 | 261 | 255 | 6 | 0 |
| 2020 | 262 | 257 | 5 | 0 |
| 2021 | 261 | 258 | 3 | 0 |
| 2022 | 260 | 257 | 3 | 0 |
| 2023 | 260 | 255 | 5 | 0 |
| 2024 | 262 | 256 | 6 | 0 |
| 2025 | 261 | 255 | 6 | 0 |
Reproduce the calculations
- Annual calendar (CSV)
- Daily calendar (CSV)
- Code, ECB snapshots and instructions (ZIP)
- Full results (JSON)
- Sources, retrieval times and SHA
The NBP/ECB package uses only the Python standard library. It fetches NBP originals locally from the official API; no NBP raw database is included. Pinned SHA checks stop the calculation if inputs change.
Source data: ECB statistics; study A also uses NBP. Calculations, classifications and charts are ours. The underlying ECB information is freely available; no ECB endorsement is implied. Source-use conditions are included in the code packages. AI tools assisted calculations and publication; code and data checks are not an independent expert review.