docs: состояние фазы 2 после аллокации, API и экранов портфеля

Плюс два ограничения, которые стоили времени: AssetClass нельзя выставлять наружу
енумом из-за значения index, и сектор не заполнен ни у одного инструмента — его нет
в ответе GetInstrumentBy, нужны потиповые Shares/Bonds.
This commit is contained in:
Dmitry
2026-09-18 14:21:06 +03:00
parent 1d7769ffbf
commit 400d9922bb
2 changed files with 25 additions and 8 deletions
+14 -4
View File
@@ -49,7 +49,10 @@ just revision "msg" # новая alembic-миграция из изме
- **Аналитика читает только `event.status = confirmed`.** Snapshot-таблицы — для сверки.
- **Сырые данные (`raw_*`) append-only и идемпотентны** по стабильному id источника.
- `openapi/openapi.json` и `app/packages/api_client` — генерируются, но коммитятся;
после изменения роутов запускай `just gen-client`.
после изменения роутов запускай `just gen-client`. В схемах API не выставляй наружу
`AssetClass`: одно из его значений — `index`, а Dart-енум не может иметь члена с таким
именем (конфликт с `Enum.index`), и сгенерированный клиент перестаёт компилироваться.
Стабильные ключи (`asset_class`, `price_status`, `bucket`, `period`) идут строками.
- Секреты только в `.env``.gitignore`). Реальные отчёты брокеров — в
`backend/tests/fixtures/reports/raw/``.gitignore`); в git только обезличенные фикстуры.
- Коммиты — Conventional Commits на русском (`feat(ledger): …`), автор — только пользователь.
@@ -68,9 +71,14 @@ just revision "msg" # новая alembic-миграция из изме
- `analytics/valuation` — дневная серия стоимости и холдинги по scope (`all`, `account:<id>`,
`portfolio:<id>`), сверка со снапшотами брокера; `analytics/returns` — XIRR и TWR по
периодам (`1m 3m 6m ytd 1y 3y all`) плюс XIRR на инструмент; `pricing/prices.py` — цена на
дату с протяжкой вперёд и порогом устаревания 10 дн.
дату с протяжкой вперёд и порогом устаревания 10 дн.;
- `analytics/allocation` — разрезы по классу актива, сектору, стране и валюте; каждый
покрывает один и тот же итог (бумаги + кэш), поэтому веса любого из них дают единицу;
- API `/analytics/*`, `/events`, `/instruments/{id}` и экраны «Портфель» (позиции +
аллокация) и карточка инструмента.
Осталось: `analytics/allocation`, корпоративные действия, API и экраны позиций.
Осталось: `ledger/matching.py` + `account_link`, корпоративные действия, бэкфилл истории
цен MOEX.
Известные расхождения derived vs брокерский снапшот по позициям (5 шт, не ошибки разбора):
редомициляция FIVE→X5, MGNT, HEAD, внебиржевая SIBN6P4. Без цен два инструмента — `SIBN6P4`
@@ -78,4 +86,6 @@ just revision "msg" # новая alembic-миграция из изме
счетах 46, 48 и 52 (+6313, +56447, +146 ₽) — это неполнота леджера T-Invest, а не оценки:
счёт 51 сходится точно. История цен тонкая (большинство облигаций — только с апреля 2026,
TBRU@ — с 14.09.2026), поэтому TWR пропускает 32 дня и сообщает об этом в
`metric_data_quality`. План фаз — в `docs/ai/plan.md`.
`metric_data_quality`. Сектор не заполнен ни у одного инструмента: `sources/tinvest` читает
`GetInstrumentBy`, в ответе которого этого поля нет — нужны потиповые `Shares`/`Bonds`.
План фаз — в `docs/ai/plan.md`.