Календарь публикаций ЕЦБ, 2016–2025: воспроизведение исследования B

Источник исходных данных: ECB statistics. Оба исходных файла получены
7 октября 2026 года; точное время, URL, размер и SHA-256 указаны в
provenance.json. Это исторические снимки, а не новая загрузка данных.

Требования: Python 3.10 или новее; только стандартная библиотека.
Распакуйте ZIP в отдельную папку и выполните из нее:
    python reproduce.py
Программа ничего не загружает из сети, не отправляет заявки и не меняет
исходные файлы. Успех: PASS, 2560 совпавших наблюдений XML/CSV,
3653 дневные строки, 10 годовых строк, 49 закрытых будних дней TARGET,
0 пропусков в ожидаемые дни публикации. Несовпадение SHA или данных
завершает проверку с ошибкой, в том числе при запуске python -O.

sources/ecb-eurofxref-hist.xml — неизмененный официальный XML целиком.
sources/ecb-api-usd-2016-2025.csv — неизмененный официальный CSV API.
Не подменяйте эти файлы свежими выгрузками: будущие ревизии могут изменить
содержимое. Для нового снимка нужно отдельно документировать источник,
хеши и пересчет; положительный результат этого пакета на него не переносится.

daily-calendar.csv и yearly-calendar.csv — наши производные таблицы.
Английские имена полей оставлены для машинного сравнения:
date — дата; weekday — понедельник–пятница; target_closure_reason —
причина закрытия TARGET; usd_reference_published — наличие наблюдения;
usd_per_eur — USD за 1 EUR; classification — наша классификация.
published = наблюдение есть; weekend = суббота или воскресенье;
scheduled TARGET closure = плановое закрытие TARGET в будний день.
New Year = 1 января; Good Friday = Страстная пятница; Easter Monday =
Пасхальный понедельник по григорианскому календарю; Labour Day = 1 мая;
Christmas Day = 25 декабря; 26 December = 26 декабря. Если праздник
попал на выходной, он не считается повторно как отсутствие в будний день.
В годовой таблице maximum_interval_calendar_days — разность двух дат
соседних публикаций, а не количество пропущенных наблюдений между ними.
При равном максимуме показан первый по времени интервал данного года.

results.json содержит только исследование B. Раздел hypothetical_case —
явное упражнение: запись 22.04.2025 в действительных данных присутствует.
Лишь мысленное удаление этой записи дает 1/2 = 50% ожидаемых публикаций
или ошибочные 1/4 = 25%, если брать все будние дни без календаря TARGET.

Правила повторного использования статистики ЕЦБ:
https://www.ecb.europa.eu/stats/ecb_statistics/governance_and_quality_framework/html/usage_policy.en.html
Указывайте источник ECB statistics и сохраняйте исходную статистику вместе
с метаданными без изменения; к данным третьих сторон эта политика сама
по себе не дает разрешения. Классификация, итоги и код здесь — работа
редакции, не официальные расчеты или одобрение ЕЦБ. Файлов NBP и
результатов исследования A в этом пакете нет.

Ограничения: проверяется полнота конкретного снимка за 2016–2025 годы.
Не проверяются доступность сайта в прошлом, время первой публикации,
исходная версия до возможных пересмотров, внутридневные цены, OHLC,
спред, тики, срабатывание стоп-лосса или исполнение сделки. Дневной
справочный курс не является исполнимой торговой котировкой. Код и
публикация подготовлены с помощью ИИ; тесты не заменяют независимую
экспертизу данных и методологии.
