119 lines
12 KiB
Markdown
119 lines
12 KiB
Markdown
# Как устроены текущие 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).
|