# Как устроены текущие Excel-файлы ДРРК Разобрано по файлам «Отчет по портфелю Андеррайтинга_2026_19.02.2026.xlsm» (UW) и «Отчет по портфелю Продаж_2026_19.02.2026.xlsm» (SALES), состояние на дату отчёта 17.02.2026. Макросы в обоих файлах **идентичны** (исходники — `docs/vba/`). Формулы отличаются в деталях, отмеченных ниже. Это описание текущей реализации, а не требования. Требования — в ТЗ аналитика; где они расходятся с Excel — см. открытые вопросы в `project.md`. ## Листы | Лист | Назначение | |---|---| | SUMMARY | Итог портфеля на дату отчёта: блок «на дату размещения», блок «на дату отчёта», итоги | | INPUTS | Сделки (копия выгрузки QUIK + ручные строки: купоны, перенос позиции на 01.01) | | SECURITIES INFO | Параметры бумаг + рыночные данные на дату отчёта | | CALC | Расчёт: строки сделок (кол. B–M) и сводка по бумаге (кол. P–AD) | | FUNDING | Календарь накопленного фондирования на 1 бумагу по дням года + таблицы ставок | | FX_RATES | Курсы CNY по датам (ЦБ) | | SUMMARY_T-1 | Копия SUMMARY значениями на прошлую дату — для «изм. за день» | | RES_HISTORY | Архив итогов по дням с 2020 года | | DEALS | Сделки, сгруппированные для отчёта | | moex_tmp | Технический буфер загрузки | | control | Список праздников (до 12.06.2023!), пример формата даты | | РЕПО (только SALES) | Отдельный расчёт овернайт-РЕПО, в итог не входит — не переносим | ## Дата отчёта `REP_DT = WORKDAY.INTL(TODAY(), -1, 1, control!U2:U100)` — предыдущий рабочий день. Список праздников заканчивается 12.06.2023, поэтому после праздников 2024–2026 дата считается неверно. ## Макросы ### «Добавить бумагу» (Module2, Button2_Click) InputBox по очереди: краткое название, ISIN, объём покупки (шт), цена покупки, дата размещения, валюта (RUB/CNY), номинал, ставка купона, доходность выпуска. Пишет: - SECURITIES INFO: A=ISIN, B=название, C=цена покупки, I=номинал, J=валюта, L=дата размещения, M=кол-во, N=купон, O=доходность покупки; - INPUTS: строку Buy (дата = дата размещения, J и K = цена × кол-во × номинал / 100); - FUNDING: строку бумаги с копией формул; - SUMMARY: строку с копией формул. ### «Обновить котировки» (Module1, upd_quotes) Для каждой строки SECURITIES INFO, где **ISIN в колонке A не пуст и дата отчёта > даты размещения (L)**: `GET https://iss.moex.com/iss/history/engines/stock/markets/bonds/securities/{ISIN}/?from={REP_DT}&limit=1` (XML, без указания борда — берётся первая строка ответа). - D (дюрация, лет) = DURATION / 365 - E (доходность) = YIELDATWAP, если пусто — YIELDCLOSE - F (чистая цена) = WAPRICE, если пусто — MARKETPRICE3 - H (НКД) = ACCINT Иначе (ISIN пуст или бумага не размещена): D = (L − сегодня)/365, E = O (доходность покупки), F = 100, H = 0. **Практика пользователей:** у закрытых позиций ISIN переносят из колонки A в колонку P — так бумага перестаёт обновляться. Затем вызывает сортировку SUMMARY и обновление курсов. ### Курсы (Module4, UpdFxRates) HTML-страница `cbr.ru/currency_base/dynamics` по R01375 (CNY) с (последняя дата в FX_RATES + 1) по REP_DT. Курс = значение / номинал. Дописывает строки в FX_RATES. Колонка USD есть, но не заполняется. ### «Создать отчёт» (Module3, Button3_Click) Копирует SUMMARY значениями + DEALS в новую книгу, применяет тему оформления с сетевого диска `F:\_DCM\03 - GENERAL\CORP STYLE\RSHB.xml`. ### «Архивировать» (Module3, Button4_Click) SUMMARY → SUMMARY_T-1 значениями; в RES_HISTORY дописывает строку из ячеек SUMMARY B4, B6, B7, B9, B10, B11, B13. **Баг:** после изменения вёрстки SUMMARY эти адреса указывают не туда. В последних строках: колонка «Переоценка» содержит MTM, «Фондирование» — дюрацию, «Купонный доход» и «Итого объём» пустые, само фондирование не архивируется. История в RES_HISTORY за последние периоды семантически неверна. ### «Купон» (Module5, Button5_Click) Недописан: открывает выбор бумаги и ничего не делает. Купоны вводятся вручную строкой `cpn` в INPUTS. ## CALC — строки сделок (кол. B–M, по одной на строку INPUTS) Обозначения: FX = 1 для RUB, курс CNY на дату сделки (VLOOKUP по FX_RATES, приблизительный поиск) для CNY. | Кол. | Смысл | Формула | |---|---|---| | B–I | Дата, бумага, операция, валюта, кол-во, цена, сумма без НКД, сумма с НКД | из INPUTS | | J | НКД/КД | Buy: −(с НКД − без НКД) × FX; иначе (с НКД − без НКД) × FX | | K | Реализованная переоценка | Buy или Cpn: 0; иначе **(цена − цена покупки) × 10 × FX × кол-во** — номинал 1000 захардкожен | | L | Фондирование | Sell или Val: −кол-во × накопленное фондирование на 1 бумагу из FUNDING на **дату сделки − 1**; иначе 0 | | M | Cash flow | Buy: −сумма с НКД; иначе +сумма с НКД | Операции, встречающиеся в данных и формулах: `Buy`, `Sell`, `cpn`, `nom`, `Val`. В данных 2026 года — только Buy, Sell, cpn. ## CALC — сводка по бумаге (кол. P–AD, по одной на бумагу) | Кол. | Смысл | Формула | |---|---|---| | R | Куплено | SECURITIES INFO M | | S | Остаток | Σ кол-во Buy − Σ кол-во Sell | | T, U, V | Чистая цена, грязная цена, цена покупки | SECURITIES INFO F, G, C; грязная G = F + H / (номинал / 100) | | Z | Реализованный (без фондирования) | Σ J(sell) + Σ K(sell) + Σ J(cpn) + Σ J(Buy) × (R − S) / R. **Только в первой строке (РЭО-02) добавлено + Σ K(nom)** | | AB | Нереализованная переоценка | (T − V) × S × номинал / 100 × FX_последний | | AC | Нереализованный КД | (U − T) × S × FX_последний × номинал / 100 + Σ J(Buy) × S / R | | AD | Нереализованное фондирование | −S × накопленное фондирование на 1 бумагу на REP_DT | | AA | Нереализованный | AB + AC | | W, X, Y | Переоценка, КД, фондирование итого | Σ по сделкам + соответствующий нереализованный | Номинал в AB/AC берётся из SECURITIES INFO (фактический), в K — 1000. Для амортизируемых бумаг (РЭО-02, номинал 750,02 в феврале, 645,19 в октябре) это расходится — открытый вопрос. ## FUNDING - Строка 1: даты с 01.01 года REP_DT по 31.12 (366 колонок C…ND). - Строки 2–4: ставка RUB / CNY / USD на дату — VLOOKUP по таблице ставок B77:E… (дата начала действия, RUB, CNY, USD; вводится вручную). - Строка 5: индивидуальная ставка РЭО-02 из таблицы L88:O… = ключевая ставка (вводится вручную) + спред КУАП 2,42. - Строки 7+: по бумаге — **накопленное фондирование на 1 бумагу**: в каждый день, когда дата < REP_DT и до этой даты была хотя бы одна покупка, прибавляется номинал × ставка валюты / 100 / 365. Для РЭО-02 вместо ставки валюты — строка 5. - Фондирование считается от **номинала**, а не от цены покупки. - Календарь начинается с 01.01 — поэтому каждый год новый файл, а переходящие позиции заводятся покупкой 01.01 (РЭО-02: 01.01.2026, Buy, 2 834 360 шт по 97,97, комментарий `/trde`; в сводном файле пометка «цена входа в 2026: 102,57 → 97,97»). ## SUMMARY (по бумаге) - Блок «на дату размещения»: дата размещения, валюта, объём покупки, купон, цена покупки, YTW покупки — из SECURITIES INFO. - Блок «на дату отчёта»: дюрация; объём, млн р = остаток × FX × номинал / 1000; YTW; чистая цена; P/L реализ = Z / 10⁶; P/L нереализ = AA / 10⁶; стоимость фондирования = Y / 10⁶; P/L (Net) = P/L + фондирование; «изм. за день» — разница с SUMMARY_T-1 (для YTW × 100, в б.п.). - «Продать до»: UW = дата размещения + 729 − 365 (= +364); SALES = дата размещения + 28. - Итоги: ЧОД, реализованный, нереализованный, фондирование, MTM, дюрация (средневзвешенная по объёму), «Комиссии МБ» = Σ INPUTS!R («Комиссия ТС») / 10⁶. ## Сводный файл (DCM_сводый …_17.02.26) Собирается вручную из итогов обоих портфелей. Содержит историю ЧОД по дням, трансфертную ставку, ставку ЦБ, спред, разбивку ПИБО на флоатер/фикс и **третий портфель «AFS Портфель из ДУ»** (скоуп не определён). ## Качество данных в файлах - Числа текстом с запятой в SECURITIES INFO («18,97»). - НКД T-1/T0 у РЭО-02 — формулы, вбитые руками с номиналом 750,02. - Формулы в разных строках CALC различаются (Z у РЭО-02).