Мониторинг отраслевых финансовых потоков (ЦБ РФ)
| Признак | Значение |
|---|---|
| Уровень и охват | Федеральный; агрегированные рублёвые платежи участников, прошедшие через платёжную систему Банка России, в разрезе отраслей (методика и классификаторы — в PDF-выпусках и сопроводительных материалах на странице) |
| Тип доступа | Смешанный: HTML-оглавление выпусков, PDF по ссылкам с датой в имени файла, XLSX «статистического приложения» по постоянному пути |
| Основные форматы | HTML, PDF, XLSX |
| Оператор | Банк России |
| Режим доступа | Открытый для перечисленных публичных материалов |
Коротко: мониторинг отраслевых финансовых потоков — аналитические PDF-выпуски (по календарю на странице — как правило ежемесячно) и Excel-приложение по устойчивому URL, куда добавляются новые периоды по мере выхода материалов. Удобно для отраслевой структуры платежей и динамики в терминах ЦБ; не заменяет казначейское исполнение или налоговую отчётность.
Описание
Карточка описывает раздел Мониторинг отраслевых финансовых потоков на cbr.ru: краткое описание предмета (обобщённая информация по рублёвым платежам через ПС Банка России), архив нумерованных выпусков в PDF по годам и блок статистического приложения в формате XLSX. В объём не входят внутренние регламентные отчёты кредитных организаций и прочие закрытые контуры надзора.
Оператор
Банк России — каноническая страница мониторинга: https://cbr.ru/analytics/finflows/
- Карточка ИС: Сайт Банка России — портал-оператор; ограничения по стабильности URL и составу разделов см. там же.
URL и точки доступа
| Тип доступа | URL | Формат |
|---|---|---|
| Оглавление мониторинга (выпуски по годам, ссылки на PDF) | https://cbr.ru/analytics/finflows/ | HTML |
| Статистическое приложение (обновляемая книга Excel) | https://cbr.ru/vfs/analytics/finflows/stat_finflows.xlsx | XLSX |
| Отдельный выпуск мониторинга | ссылки вида https://cbr.ru/Collection/Collection/File/<id>/finflows_YYYYMMDD.pdf со страницы раздела |
Имена и числовые id в путях к PDF меняются от выпуска к выпуску; для автоматизации выпусков ориентируйтесь на парсинг HTML страницы раздела или ручное обновление списка URL. Файл stat_finflows.xlsx публикуется по фиксированному адресу: при выходе новых данных книга перезаписывается (типичный сценарий — добавление листов/рядов без смены URL).
Структура файлов и состав данных
Ниже описана фактически скачанная редакция на 18.07.2026. Ответ на прямой URL stat_finflows.xlsx имел Last-Modified: Mon, 13 Jul 2026 10:51:51 GMT, размер 3 974 043 байта и SHA-256 cc76ddf2eba6df4d1c93162c02b195ab79a07dd1f2c7025a6b0102312399f597. Свойство modified внутри книги — 2026-07-13 10:14:58. Эти значения идентифицируют именно проверенную редакцию, а не постоянный URL: при следующем выпуске они могут измениться.
A. stat_finflows.xlsx: машиночитаемый контур
Книга двуязычная: русская шапка обычно находится в первой строке таблицы, английская — во второй. В openpyxl все подписи периодов прочитались как строки, а не как datetime, включая визуально датированные янв.20 и недельные интервалы. Значения показателей и весов — числовые float с Excel-форматом 0.0% или 0.00%: в парсере это доли единицы, поэтому 0.057 означает отображаемые Excel 5,7 %. Рублёвых сумм, млн рублей и отдельного поля валюты в текущей книге нет.
| Реальное имя листа | Состав на дату проверки |
|---|---|
Содержание | Русское оглавление: назначение листов 1–7, частота обновления и примечания о пересмотре недельных оценок и границ винзоризации. |
Contents | Английская версия того же оглавления. |
1 | Региональная месячная таблица изменений входящих потоков: раздел ОКВЭД2 × федеральный округ × месяц. |
2 | Недельные отклонения сезонно сглаженного среднего дневного входящего потока по классам ОКВЭД2 от среднего предыдущего квартала. |
3 | Недельные отклонения того же входящего потока от среднего уровня 2019 года. |
4 | Месячные отклонения входящего потока по классам ОКВЭД2 от среднего предыдущего квартала. |
5 | Месячные отклонения входящего потока от среднего уровня 2019 года. |
6 | Доли валового регионального продукта по разделам ОКВЭД2 для РФ и федеральных округов. |
7 | Расчётные доли валовой добавленной стоимости по классам ОКВЭД2 для сводных групп и экономики в целом. |
| `Исторический ряд | legacy data ->` |
1a, 2a, 3a, 4a, 5a, 6a, 7a | Отдельный legacy-блок с теми же семью типами таблиц. Не присоединяйте его к листам без суффикса a по имени листа: это не добавочный хвост периода, а отдельная историческая версия данных. |
Шапки и типы данных текущего блока 1–7. Номерные листы — реальные имена, поэтому не заменяйте их предполагаемыми названиями вроде «Откл входящих…»: такие названия даны в Содержании, а не в имени листа.
| Лист | Строки шапки и колонки | Гранулярность и единица |
|---|---|---|
1 | Строки 1–2. A «Месяц» / Month — строка вида Январь 20; B «Раздел» / Section — строковый код (1, 2, 3, A–S); C и D — русское и английское названия раздела; E/F — русский и английский код ФО (ЦФО / CFD); G/H — русское и английское название ФО; I — «Изменение входящих за месяц, % к предыдущему кварталу*», float; J содержит только текстовое примечание в шапке. | Одна содержательная строка: месяц × раздел × ФО; измерение в I — процентное изменение. На 18.07.2026: 78 месячных меток, от Январь 20 до Июнь 26; в данных представлены восемь кодов ФО. |
2 и 3 | Строки 1–2. A «Класс ОКВЭД2» / OKVED 2 code — обычно целое число; B/C — краткое русское/английское название деятельности; D:LM — недельные интервалы строками, например 30 мар. – 3 апр. 2020. Ячейки значений — float в процентном формате. | Широкий формат: строка — класс ОКВЭД2 либо сводная группа, столбец — неделя. После melt ключ — класс × неделя. В 2 показатель сравнивается с предыдущим кварталом, в 3 — со средним 2019 года. На дату проверки 322 недельных столбца: от 30 мар. – 3 апр. 2020 до 6 – 10 июл. 2026. |
4 и 5 | Та же структура A:C, что у 2 и 3; D:CC — месячные подписи-строки, например янв.20, фев.20, май26; значения — float в процентном формате. | Широкий формат: класс/сводная группа × месяц. В 4 — сравнение с предыдущим кварталом, в 5 — со средним 2019 года. На дату проверки 78 месячных столбцов: от янв.20 до июн.26. |
6 | Заголовок в строках 2–3; шапка в строках 4–5. A — раздел ОКВЭД2 (строка A–T); B/C — русское/английское название; D:L — РФ, ЦФО, СЗФО, ЮФО, СКФО, ПФО, УФО, СФО, ДФО; значения — float в процентном формате. | Статическая таблица весов: раздел ОКВЭД2 × РФ/ФО. В заголовке листа всё ещё написано «2018 год», а его примечание фиксирует обновление весов в июле 2023 года; не выводите базовый год только из названия файла или листа. |
7 | Заголовок в строках 1–2; шапка в строках 3–4. A — числовой класс ОКВЭД2; B/C — краткие русское/английское названия; D:K — «Всего по ВДС», «Без добычи и нефтепродуктов», «Без добычи и нефтепродуктов, госуправления», «Расходы домашних хозяйств на конечное потребление», «Промежуточное потребление», «Валовое накопление», «Государственный спрос», «Экспорт». Все веса — float в процентном формате. | Статическая матрица: класс ОКВЭД2 × сводная группа. Последняя строка Итого/Total не имеет кода класса и даёт суммы весов около 1; это контроль, а не отдельная отрасль. |
В 2–5 первые строки со сводными показателями имеют пустой A и текст в B/C; после обычных классов есть текстовые сноски в A. Для отраслевой детализации фильтруйте A как числовой ОКВЭД2, а сводные строки и сноски обрабатывайте отдельно. У листа 3 технический openpyxl.max_row равен 2654 из-за оформления, хотя содержательные строки в проверенной книге заканчиваются на 103-й: границу данных определяйте по числовому коду и непустым значениям, а не только по max_row.
Классификаторы, периоды и обновление. Отдельного листа-справочника ОКВЭД2 или направления платежа нет. Расшифровка классов уже находится в B/C листов 2–5 и 7, а названия разделов — в C/D листа 1 и B/C листа 6. Направление не является колонкой: все пять динамических листов описывают входящие потоки, а смысл сравнения задаёт сам лист. Числовые коды классов в XLSX хранятся как 1, 2, …, 97; в PDF тот же класс может быть напечатан с ведущим нулём, например 01. Если для связи с внешним ОКВЭД создаётся строковый ключ, сохраняйте исходное числовое значение и отдельно документируйте нормализацию до двух знаков.
Оглавление книги указывает обновление 1, 4, 5 раз в месяц, 2, 3 — еженедельно с последующим уточнением при месячном выпуске; 6 и 7 помечены как не обновляемые. По гранулярности один новый период — один месячный столбец/набор строк для 1, 4, 5 либо один недельный интервал для 2, 3; конкретная перезапись книги может содержать несколько таких периодов и ретропересмотр. Поэтому при каждом скачивании сравнивайте множества подписей периодов, список sheetnames, строки шапки и контрольную сумму, а не ожидайте «ровно N новых столбцов». PDF методически подтверждает, что исторические оценки могут пересматриваться, в том числе из-за сезонной корректировки и пересмотра границ винзоризации. Не полагайтесь на неизменность номерных названий листов или на добавление только новых строк справа.
B. PDF-выпуск мониторинга: аналитический контур
Проверен выпуск № 7 (112) от 09.07.2026, на который ведёт актуальная на дату проверки ссылка со страницы мониторинга: 74 страницы. В нём есть текстовый вывод по месяцу, сводные и отраслевые таблицы, графики входящих и исходящих потоков, таблица месячных отклонений по классам ОКВЭД2, а в конце — раздел «Методологические комментарии». Он объясняет охват платежей ПС Банка России, привязку входящего платежа к основному ОКВЭД2 получателя, сезонное сглаживание, винзоризацию, базу сравнения и расчёт весов. Эти пояснения нужны, чтобы правильно трактовать числа из XLSX и сводные группы листа 7.
PDF не является первичным машинным рядом: на странице раздела опубликованы файлы, а не API; числовой <id> в URL PDF меняется по выпускам. В проверенном выпуске есть текстовый слой, но таблицы и графики имеют печатную вёрстку, поэтому для их извлечения нужен координатный/table-разбор; OCR требуется только для конкретного выпуска без пригодного текстового слоя. Для регулярной загрузки уровней и динамики используйте XLSX, а для смысла показателя, состава сводных групп, формул агрегации и даты аналитического выпуска — соответствующий PDF.
Объекты данных и показатели
- Строка наблюдения в
1—месяц × раздел ОКВЭД2 × федеральный округ, значение — процентное изменение входящих потоков к предыдущему кварталу. В2–5строка XLSX — класс ОКВЭД2 или агрегированная группа, а наблюдение временного ряда получается только после разворота периода из столбца в строку:класс/группа × неделялибокласс/группа × месяц. - Веса, а не новый временной ряд —
6связывает раздел ОКВЭД2 с РФ/ФО через долю ВРП;7связывает класс ОКВЭД2 с восемью сводными группами через долю ВДС. Они нужны для воспроизводимого понимания агрегации, но не содержат даты каждого наблюдения. - Ключи связки — для детальных листов это числовой класс ОКВЭД2 и период; для регионального
1добавляются код ФО и раздел. Связки с внешними рядами допустимы через ОКВЭД, период и собственную аналитическую таблицу соответствий, но не через КБК: в книге нет КБК, ИНН, ОКТМО, платёжного поручения или идентификатора бюджетной операции. - Направление платежа не используйте как ключевую колонку: в текущем XLSX оно фиксировано семантикой листов как «входящие». PDF показывает также исходящие потоки на графиках, однако в проверенной XLSX-книге колонки или листа с названием исходящего потока нет.
Пробелы и подводные камни: нет отдельного машиночитаемого словаря кодов и сводных групп; русские/английские подписи распределены между B/C, а иногда между двумя строками шапки. Не смешивайте проценты динамики (1–5) с процентными весами (6, 7), не принимайте строку Итого за отрасль и не склеивайте current- и legacy-блоки. Звёздочки в заголовках периодов и текстовые сноски — часть исходного содержания, их следует сохранить в raw-слое и очищать только в производном поле периода.
Периодичность обновления
- PDF-выпуски мониторинга — по календарю на странице раздела; на практике выходит ежемесячный выпуск (номер и дата указаны в заголовке ссылки).
- Файл
stat_finflows.xlsx— обновляется при выходе статистического приложения (дата обновления страницы и блока приложения сверяйте на https://cbr.ru/analytics/finflows/); URL файла постоянный, содержимое заменяется новой редакцией.
Ограничения и особенности
- Предмет данных — платежи через ПС Банка России, а не полный оборот экономики и не кассовое исполнение бюджета.
- Условия использования: публикации регулятора; при переработке обычно требуется указание источника (формулировки — в пользовательских документах
cbr.ru). - Автоматизация: для PDF нет единого API; XLSX доступен по постоянному URL, но это изменяемый объект. Храните исходную книгу, HTTP
Last-Modified/ETag(если сервер его вернул), размер иSHA-256; это позволяет отличить новую редакцию от уже обработанной и воспроизвести расчёт. - Пересмотры: сезонная корректировка, винзоризация, состав отраслей и веса могут изменить исторические ячейки, даже если период уже был в предыдущей версии. Инкрементальная загрузка только «последнего столбца» недостаточна: после нового хеша повторно проверяйте весь ряд или как минимум контролируйте различия по всем периодам.
Примеры доступа
1. Скачать актуальное статистическое приложение. Команда проверена 18.07.2026 на постоянном URL ЦБ:
curl -fL -o stat_finflows.xlsx "https://cbr.ru/vfs/analytics/finflows/stat_finflows.xlsx"
Для фиксации проверяемой версии сохраните также HTTP-заголовки и контрольную сумму:
curl -fL -D stat_finflows.headers -o stat_finflows.xlsx \
"https://cbr.ru/vfs/analytics/finflows/stat_finflows.xlsx"
shasum -a 256 stat_finflows.xlsx
На дату проверки получены Last-Modified: Mon, 13 Jul 2026 10:51:51 GMT и SHA-256 cc76ddf2eba6df4d1c93162c02b195ab79a07dd1f2c7025a6b0102312399f597. Не используйте эти значения как ожидаемые для следующего запуска: файл перезаписывается по тому же URL.
2. Открыть книгу, перечислить реальные листы и проверить шапку. Код использует openpyxl для структуры книги и pandas для табличной обработки; он исполнен на файле выше.
from pathlib import Path
from openpyxl import load_workbook
import pandas as pd
book = Path("stat_finflows.xlsx")
wb = load_workbook(book, read_only=True, data_only=True)
print(wb.sheetnames)
# ['Содержание', 'Contents', '1', ..., 'Исторический ряд|legacy data ->', '1a', ..., '7a']
# Шапка листа «4»: строки 1–2 — русский/английский вариант.
ws = wb["4"]
print([ws.cell(1, column).value for column in range(1, 8)])
# ['Класс ОКВЭД2', 'Краткие названия видов деятельности', None,
# 'янв.20', 'фев.20', 'мар.20', 'апр.20']
# header=None сохраняет две строки двуязычной шапки как данные, а не имена pandas-колонок.
raw = pd.read_excel(book, sheet_name="4", header=None, engine="openpyxl")
print(raw.iloc[:3, :7])
3. Привести лист 4 из широкого формата к длинному. В книге даты периодов записаны русскими строками, поэтому ниже они разбираются явно; to_numeric(..., errors="coerce") исключает агрегаты и текстовые примечания из детального ряда. В проверенной редакции результат содержит 6 708 наблюдений: 86 классов × 78 месяцев, от 2020-01-01 до 2026-06-01.
from pathlib import Path
import re
import pandas as pd
book = Path("stat_finflows.xlsx")
raw = pd.read_excel(book, sheet_name="4", header=None, engine="openpyxl")
# Строка 1 XLSX (индекс 0) — русские подписи; данные начинаются с индекса 2.
wide = raw.iloc[2:].copy()
wide.columns = ["okved_class", "activity_ru", "activity_en", *raw.iloc[0, 3:].tolist()]
wide["okved_class"] = pd.to_numeric(wide["okved_class"], errors="coerce").astype("Int64")
wide = wide.dropna(subset=["okved_class"])
period_columns = list(wide.columns[3:])
long = wide.melt(
id_vars=["okved_class", "activity_ru", "activity_en"],
value_vars=period_columns,
var_name="period_label",
value_name="value",
)
months_ru = {
"янв": 1, "фев": 2, "мар": 3, "апр": 4, "май": 5, "июн": 6,
"июл": 7, "авг": 8, "сен": 9, "окт": 10, "ноя": 11, "дек": 12,
}
def parse_month_label(value: object) -> pd.Timestamp:
cleaned = str(value).strip().replace("*", "").replace(".", "")
match = re.fullmatch(r"([а-я]+)(\d{2})", cleaned, flags=re.IGNORECASE)
if not match:
return pd.NaT
return pd.Timestamp(2000 + int(match.group(2)), months_ru[match.group(1).lower()], 1)
long["period"] = long["period_label"].map(parse_month_label)
long["value"] = pd.to_numeric(long["value"], errors="coerce")
long = long.dropna(subset=["period", "value"])
print(long.dtypes)
print(long[["okved_class", "period", "value"]].head())
Для 2 и 3 применяется та же схема melt, но period_label — недельный диапазон, а не календарный месяц. Не преобразуйте его в одну дату без правила: сохраните исходную строку и, если нужен ключ, отдельно извлеките согласованную дату начала/конца интервала. Для 1 разворот не нужен: это уже длинная таблица; месяц в A также нужно нормализовать из русской строковой подписи.
4. Кэшировать обновления без повторного скачивания. ЦБ вернул Last-Modified, но не вернул ETag в проверенном ответе. Скрипт ниже использует оба заголовка, когда они есть, и сохраняет SHA-256 как версионный идентификатор. Первый запуск скачивает книгу; повторный запуск на неизменной версии 18.07.2026 вернул HTTP 304 и не скачал тело файла.
from __future__ import annotations
import hashlib
import json
from pathlib import Path
from urllib.error import HTTPError
from urllib.request import Request, urlopen
url = "https://cbr.ru/vfs/analytics/finflows/stat_finflows.xlsx"
cache_dir = Path("cache/cbr-finflows")
cache_dir.mkdir(parents=True, exist_ok=True)
file_path = cache_dir / "stat_finflows.xlsx"
meta_path = cache_dir / "stat_finflows.meta.json"
old = json.loads(meta_path.read_text()) if meta_path.exists() else {}
headers = {"User-Agent": "Mozilla/5.0"}
if old.get("etag"):
headers["If-None-Match"] = old["etag"]
if old.get("last_modified"):
headers["If-Modified-Since"] = old["last_modified"]
try:
with urlopen(Request(url, headers=headers), timeout=90) as response:
body = response.read()
received = dict(response.headers.items())
except HTTPError as error:
if error.code == 304:
print("unchanged: HTTP 304; cached file is current")
raise SystemExit(0)
raise
sha256 = hashlib.sha256(body).hexdigest()
part_path = file_path.with_suffix(".xlsx.part")
part_path.write_bytes(body)
part_path.replace(file_path)
meta_path.write_text(json.dumps({
"url": url,
"etag": received.get("ETag"),
"last_modified": received.get("Last-Modified"),
"sha256": sha256,
"bytes": len(body),
}, ensure_ascii=False, indent=2) + "\n")
print(f"downloaded: bytes={len(body)} sha256={sha256}")
Связанные страницы wiki
- Сайт Банка России — карточка портала и смежных подсистем.
- Статистика Банка России — основной контур временных рядов, базы показателей и API; мониторинг финпотоков — отдельная аналитическая линейка, не сводимая к одному показателю в
hd_base. - Банк России — оператор и правовой статус публикаций.
- Открытые данные и наборы «Электронного бюджета» — бюджетные сведения с собственной моделью классификации; нужны для сопоставления контекста, но не образуют строковое соединение с показателями мониторинга.
- Казначейская отчётность — отчётность об исполнении бюджетов; отличается от отраслевых входящих платежей ЦБ и использует бюджетные классификаторы.
Не путать с
- Статистика Банка России — общий вход в макроряды, банковскую и денежную статистику, API и базу показателей; мониторинг финпотоков узко про отраслевые платежные потоки в формате выпусков + XLSX-приложения.
Сводка для машинной обработки
primary_url: "https://cbr.ru/vfs/analytics/finflows/stat_finflows.xlsx"
landing_page: "https://cbr.ru/analytics/finflows/"
formats: ["xlsx", "pdf"]
update_cadence: "лист 1, 4 и 5 — ежемесячно; 2 и 3 — еженедельно с уточнением при месячном выпуске; книга перезаписывается по фиксированному URL"
url_stability: "URL XLSX постоянный; содержимое перезаписывается; PDF URL содержит изменяемый числовой id"
checked_at: "2026-07-18"
workbook_last_modified: "Mon, 13 Jul 2026 10:51:51 GMT"
workbook_sha256: "cc76ddf2eba6df4d1c93162c02b195ab79a07dd1f2c7025a6b0102312399f597"
sheets: ["Содержание", "Contents", "1", "2", "3", "4", "5", "6", "7", "Исторический ряд|legacy data ->", "1a", "2a", "3a", "4a", "5a", "6a", "7a"]
current_sheets: ["1", "2", "3", "4", "5", "6", "7"]
legacy_sheets: ["1a", "2a", "3a", "4a", "5a", "6a", "7a"]
join_keys:
- "лист 1: month_label + section + fd_code_ru (или fd_code_en)"
- "листы 2–5 после melt: okved_class + period_label"
- "лист 6: okved_section + federal_district"
- "лист 7: okved_class + aggregate_group"
period_grain: "sheet 1/4/5 = month; sheet 2/3 = week interval; sheet 6/7 = static weights"
units: ["процентное изменение (листы 1–5; float с Excel-форматом %)", "доля/вес в процентах (листы 6–7; float с Excel-форматом %)"]
parse_notes:
- "Шапки двуязычные: русский в первой строке, английский во второй; у 6 шапка 4–5, у 7 — 3–4."
- "Подписи периодов — строки, а не Excel datetime; сохранять raw period_label."
- "В 2–5 фильтровать числовой okved_class: пустые коды обозначают сводные группы, текстовые — сноски."
- "Не склеивать current sheets и legacy sheets только по совпадающему имени без/с суффиксом a."
- "При смене SHA-256 сравнивать sheetnames, строки шапки, периодные столбцы и исторические значения; возможны ретропересмотры."
Частые вопросы
В: Чем показатели XLSX отличаются от текста и таблиц PDF?
О: XLSX хранит регулярные процентные ряды входящих потоков и веса в ячейках, пригодных для pandas после учёта двуязычной шапки и широкого формата. PDF — выпуск с интерпретацией текущего периода, печатными таблицами, графиками входящих и исходящих потоков и методикой. Он объясняет происхождение и агрегацию показателей, но не заменяет XLSX как источник ряда.
В: Почему эти данные нельзя сопоставить 1-в-1 с исполнением бюджета по КБК?
О: Наблюдение мониторинга — агрегированный входящий платёж в ПС Банка России, привязанный к основному ОКВЭД2 получателя; в книге нет КБК, реквизитов бюджета или идентификатора операции. Бюджетные ряды следует сопоставлять с ним только через период, аналитическую модель и явно заданное соответствие отраслей, а не через прямой join.
В: Как автоматически заметить новую отрасль, период или лист?
О: После каждого отличающегося SHA-256 загружайте список sheetnames, строки шапки, множество числовых okved_class и множество period_label; сравнивайте их с предыдущим манифестом. Так фиксируются новые коды, новые недели/месяцы и смена структуры, а ретроспективные изменения существующих ячеек ловятся сравнением значений, а не только списка периодов.