Перейти к основному содержимому

Мониторинг отраслевых финансовых потоков (ЦБ РФ)

ПризнакЗначение
Уровень и охватФедеральный; агрегированные рублёвые платежи участников, прошедшие через платёжную систему Банка России, в разрезе отраслей (методика и классификаторы — в 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.xlsxXLSX
Отдельный выпуск мониторингассылки вида https://cbr.ru/Collection/Collection/File/<id>/finflows_YYYYMMDD.pdf со страницы раздела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; сравнивайте их с предыдущим манифестом. Так фиксируются новые коды, новые недели/месяцы и смена структуры, а ретроспективные изменения существующих ячеек ловятся сравнением значений, а не только списка периодов.