From c666ca0053f4d21177625c612d0b6a6d640f63d5 Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Sun, 1 Nov 2026 12:24:39 +0300 Subject: [PATCH] docs: describe concentration tab and stored instrument classification (WealthLedger/main#48) --- README.md | 2 +- ...y-reads-and-online-instrument-reference.md | 5 +- adr/022-stored-instrument-classification.md | 56 +++++++++++++ adr/README.md | 1 + architecture/containers.md | 7 +- architecture/cross-cutting/data-freshness.md | 13 ++- domains/portfolio/concentration.md | 81 +++++++++++++++++++ domains/portfolio/data-reference.md | 4 + domains/portfolio/flows/portfolio-loading.md | 25 +++++- domains/portfolio/overview.md | 4 + glossary.md | 40 +++++++++ integrations/tbank.md | 13 ++- overview.md | 1 + 13 files changed, 242 insertions(+), 10 deletions(-) create mode 100644 adr/022-stored-instrument-classification.md create mode 100644 domains/portfolio/concentration.md diff --git a/README.md b/README.md index a639f07..fac9b82 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ WealthLedger помогает частному инвестору понимат | [Аутентификация](domains/authentication/overview.md) | Регистрация, вход, восстановление и завершение сессии | | [Счета](domains/accounts/overview.md) | Доступные счета, сводки и состояния каждого счёта | | [Банковские карты](domains/cards/overview.md) | Ручные остатки, операции, категории, возвраты, месячные сводки и исправления | -| [Портфель](domains/portfolio/overview.md) | Позиции, остатки, суммы, структура и свежесть | +| [Портфель](domains/portfolio/overview.md) | Позиции, остатки, суммы, структура, [концентрация](domains/portfolio/concentration.md) и свежесть | | [Все счета](domains/portfolio/all-accounts.md) | Общий портфель, происхождение строк и сводные разделы | | [Операции](domains/operations/overview.md) | Исполненные операции, фильтры и пагинация | | [Доход](domains/income/overview.md) | Полученные купоны и дивиденды, периоды и состав расчёта | diff --git a/adr/019-hourly-reads-and-online-instrument-reference.md b/adr/019-hourly-reads-and-online-instrument-reference.md index 7ec7f9e..9286a7c 100644 --- a/adr/019-hourly-reads-and-online-instrument-reference.md +++ b/adr/019-hourly-reads-and-online-instrument-reference.md @@ -2,7 +2,10 @@ **Status:** Accepted. Заменяет request-driven, manual-refresh и no-periodic-walk части [ADR 017](017-local-tbank-reads-and-background-sync.md) -и дополняет [ADR 018](018-minimal-runtime-coordination.md). +и дополняет [ADR 018](018-minimal-runtime-coordination.md). Правило «справочные +сведения запрашиваются онлайн» дополнено исключением для сектора и бренда +актива позиции — [ADR +022](022-stored-instrument-classification.md). ## Decision diff --git a/adr/022-stored-instrument-classification.md b/adr/022-stored-instrument-classification.md new file mode 100644 index 0000000..809d485 --- /dev/null +++ b/adr/022-stored-instrument-classification.md @@ -0,0 +1,56 @@ +# 022. Хранимая классификация инструментов T-Bank + +**Status:** Accepted. Дополняет [ADR +019](019-hourly-reads-and-online-instrument-reference.md) исключением из +правила «справочные сведения запрашиваются онлайн». Решение утверждено +владельцем в [Issue +WealthLedger/main#48](https://git.personal.ksv741.ru/WealthLedger/main/issues/48). + +## Context + +ADR 019 установил, что справочные сведения инструментов (detail, lookup, +каталоги) запрашиваются онлайн и не сохраняются как долговременный справочник: +«старые справочные строки не являются источником актуальности». Вкладка +«Концентрация» требует для каждой позиции её сектора и эмитента — бренда +актива по данным T-Bank. Сектор есть только в описаниях отдельных типов +инструментов (`share`, `bond`, `etf`), а эмитент — в описании актива по +`asset_uid` инструмента; из названия, тикера, ISIN или `logoName` его вывести +нельзя. Запрашивать эти поля онлайн при каждом открытии экрана нельзя: +ответ Portfolio не ждёт T-Bank, а разрезы должны считаться по уже сохранённому +снимку. + +Существующий metadata-кэш (`TbankInstrument`) не подходит: общий ответ +`GetInstrumentBy` не содержит `sector`, а его `brand` — данные логотипа, +а не `{uid, name}` бренда актива. + +## Decision + +- Сектор и бренд актива позиции хранятся как последнее известное значение в + глобальной таблице `TbankInstrumentClassification` (провайдер, ключ + инструмента, сектор и время его получения, uid актива и uid/название бренда + с временем получения). Данные публичные, без привязки к пользователю или + подключению; ограждение по connection revision к ним не применяется, публикация + Snapshot ограждается как прежде. +- Каждое поле обновляется в часовом обходе при его первой попытке, начавшейся + не ранее чем через 24 часа после последнего успешного получения этого поля; + пока значение не получено, попытка повторяется в каждом обходе. Сектор и + бренд обновляются независимо. +- Неуспешное получение не мешает публикации Portfolio Snapshot и не влияет на + его свежесть; сохранённое значение остаётся доступным. Отказ token + обрабатывается как отказ token при обходе Portfolio. Ответ «инструмент не + найден» сохраняет прежнее значение и перезапускает отсчёт 24 часов. +- Классификация не входит в `meta.dependencies` Portfolio и не меняет + `isStale` и `lastSuccessfulAt`. + +## Consequences + +- Это первый долговременный справочник T-Bank в системе: ADR 019 теряет + характер «только онлайн» для этой области и дополняется, а не заменяется. +- Разрезы концентрации считаются по снимку без обращений к T-Bank; число + вызовов растёт ограниченно — не более одной попытки на поле в сутки на + позицию, при первом обходе после выката возможен разовый всплеск, сглаженный + общим лимитером и очередью. +- Значение может быть устаревшим до 24 часов; это приемлемо для группировки + позиций, но классификация не является источником актуальных данных брокера. +- Второй потребитель хранимой классификации — условие пересмотра решения + (выделение независимого процесса обновления, отдельные сроки). diff --git a/adr/README.md b/adr/README.md index 433e4a1..6cac8d9 100644 --- a/adr/README.md +++ b/adr/README.md @@ -26,3 +26,4 @@ - [019 — Часовой обход и онлайн-справочник инструментов](019-hourly-reads-and-online-instrument-reference.md) - [020 — Evidence for hourly sync read boundaries](020-hourly-sync-verification-evidence.md) - [021 — Тихое чтение и редкие подтверждения](021-quiet-reading-and-rare-confirmations.md) +- [022 — Хранимая классификация инструментов T-Bank](022-stored-instrument-classification.md) diff --git a/architecture/containers.md b/architecture/containers.md index ac28a4a..eaa31c6 100644 --- a/architecture/containers.md +++ b/architecture/containers.md @@ -141,13 +141,18 @@ membership текущей revision перед каждым финансовым SQLite хранит полный последний portfolio, операции и их подтверждённые диапазоны, private прогнозы, сохранённые точки истории оценки, общие -instrument/market sources и intent/staging. +instrument/market sources, классификацию инструментов (сектор и бренд актива +как последнее известное значение с временем каждого получения, +`TbankInstrumentClassification`) и intent/staging. Нормализованные финансовые значения сохраняются decimal-строками. Полнота отделена от свежести и пагинации. Ответ не ждёт внешних RPC; обновлением личных данных владеет часовой обход в том же backend process через существующий лимитер, недостающие общие источники он же ставит в фоновую очередь. На startup обход начинает следующую попытку по обычному часовому сроку; после нового подключения первая попытка начинается сразу. +Классификация — публичные данные без привязки к пользователю и подключению; +её поля обновляются в том же обходе не чаще раза в сутки +([ADR 022](../adr/022-stored-instrument-classification.md)). Подробности — [модель свежести](cross-cutting/data-freshness.md). PUT подключения сначала проверяет token у T-Bank, затем одной транзакцией diff --git a/architecture/cross-cutting/data-freshness.md b/architecture/cross-cutting/data-freshness.md index 905cfbc..8fdc9d3 100644 --- a/architecture/cross-cutting/data-freshness.md +++ b/architecture/cross-cutting/data-freshness.md @@ -8,8 +8,12 @@ T-Bank. Нормальным владельцем обновления служ простоя выполняется не более одна актуальная попытка, а перекрывающийся срок пропускается, не ставится в очередь. Общие справочные данные инструментов запрашиваются онлайн, когда это требуется карточке; финансовый HTTP-ответ не -ждёт T-Bank. Модель принята в -[ADR 019](../../adr/019-hourly-reads-and-online-instrument-reference.md). +ждёт T-Bank. Единственное исключение — сектор и бренд актива позиции, которые +хранятся как последнее известное значение с обновлением не чаще раза в сутки; +свежесть и полнота Portfolio от них не зависят. Модель принята в +[ADR 019](../../adr/019-hourly-reads-and-online-instrument-reference.md), +исключение — в +[ADR 022](../../adr/022-stored-instrument-classification.md). ## Клиентский и серверный снимки @@ -18,7 +22,10 @@ T-Bank. Нормальным владельцем обновления служ HTTP-перечитывания в той же границе доступа. Это не серверный fallback и не состояние часового обхода. SQLite независимо от браузера хранит membership, последний полный portfolio, исполненные операции, прогнозы, общие сведения об -инструментах, котировки, свечи и календари. +инструментах и классификацию инструментов (сектор и бренд актива как +последнее известное значение, [ADR +022](../../adr/022-stored-instrument-classification.md)), котировки, свечи и +календари. [Полнота периода](../../glossary.md#полнота-истории-счёта) и свежесть различаются. Успешно проверенный пустой результат полон и доступен; последняя страница diff --git a/domains/portfolio/concentration.md b/domains/portfolio/concentration.md new file mode 100644 index 0000000..eed9b9c --- /dev/null +++ b/domains/portfolio/concentration.md @@ -0,0 +1,81 @@ +# Концентрация портфеля + +Вкладка «Концентрация» на странице счёта `/accounts/:accountId` показывает, +какие акции, облигации, секторы и эмитенты занимают наибольшую часть текущей +оценки Portfolio. Она отвечает на вопрос «где сконцентрированы деньги», +который не решают карточки позиций и [структура +активов](overview.md#как-читать-экран). Точный смысл полей и долей — в +[справочнике данных](data-reference.md). + +## Вкладка и разрезы + +Вкладка есть только у отдельного счёта: в режиме [«Все счета»](all-accounts.md) +её нет. Появление вкладки не меняет вкладку, открытую по умолчанию («Позиции»), +и содержание остальных вкладок. Пока Portfolio загружается, при его ошибке или +штатном пустом составе вкладки нет; при Portfolio хотя бы с одной позицией или +денежным остатком вкладка показывается. + +Вкладка содержит четыре разреза и показывает один из них одновременно: + +| Разрез | Что ранжирует | Типы позиций | +| --- | --- | --- | +| «Акции» | Пять крупнейших позиций акций | `STOCK` | +| «Облигации» | Пять крупнейших позиций облигаций | `BOND` | +| «Секторы» | Пять крупнейших секторов по данным T-Bank | `STOCK`, `BOND`, `FUND` | +| «Эмитенты» | Пять крупнейших эмитентов (брендов актива) | `STOCK`, `BOND` | + +Фонды участвуют только в разрезе «Секторы»: их эмитент — управляющая компания, +а не компания внутри фонда. Позиции типов `CURRENCY`, `FUTURE`, `OPTION`, +`STRUCTURED_NOTE`, `DIGITAL_FINANCIAL_ASSET` и `OTHER` во вкладку не входят. + +Позиции без сектора образуют явную группу «Сектор не указан», без бренда — +«Эмитент не указан»; обе группы показываются с видимой долей. Государственные +облигации определяются значением сектора T-Bank `government` с подписью +«Государственный сектор»; других собственных классификаций WealthLedger +не вводит. Название элемента в разрезе эмитентов — название бренда; если у +одного бренда разные названия, показывается название позиции с наибольшей +стоимостью. + +## Топ-5 и «Прочее» + +В каждом разрезе показаны пять крупнейших элементов по текущей денежной оценке, +каждый с суммой и долей. Рядом показан суммарный показатель «Топ-5 · N %». +Если в разрезе семь и более элементов, все остальные объединены в одну строку +«Прочее» с числом элементов, суммой и долей. При шести и меньшем числе +элементов каждый показан своей строкой. По нажатию на «Прочее» раскрывается +полный перечень остальных элементов, каждый со своей суммой и долей; топ-5 +и диаграмма при этом не меняются. + +Доли считаются от суммы стоимостей позиций разреза в выбранной валюте и +в сумме дают ровно 100 %; округление — до десятой доли процента, очень малые +доли показываются как «< 0,1 %». Отрицательные и нулевые стоимости, а также +позиции без оценки в разрез не входят. Конвертации валют нет: каждая позиция +входит только в валюту своей оценки. + +## Валюта + +У вкладки свой список валют — валюты оценок позиций акций, облигаций и фондов, +отсортированные по ISO-коду, — и свой выбор, независимый от «Структуры +портфеля». По умолчанию выбрана первая валюта списка. При одной валюте +переключатель не показывается. Общего итога по нескольким валютам нет. +Выбранные разрез и валюта сохраняются, пока пользователь остаётся на странице +счёта, включая переключение её вкладок, и сбрасываются при новом заходе и при +смене счёта. + +## Диаграмма и неполные данные + +Рядом с перечнем показана кольцевая диаграмма, согласованная с перечнем; +информация передаётся не только цветом, есть текстовый эквивалент. Если ответ +отмечен как неполный (`completeness: "incomplete"` — часть позиций не имеет +оценки), над разрезом появляется предупреждение «Данные неполные», а под +списком — сноска «Не учтено позиций: N» с числом позиций, не вошедших в разрез. +Пустой разрез (нет позиций с положительной оценкой в выбранной валюте) +показывает текстовое состояние вместо диаграммы. + +## Откуда берутся сектор и эмитент + +Сектор и эмитент — часть данных Portfolio: их получает backend в часовом +обходе и сохраняет в снимке вместе с остальными полями позиций +([поток загрузки](flows/portfolio-loading.md#обновление-сектора-и-эмитента), +[интеграция T-Bank](../../integrations/tbank.md)). Вкладка считается по уже +загруженному снимку и не обращается к T-Bank. diff --git a/domains/portfolio/data-reference.md b/domains/portfolio/data-reference.md index 69dd72e..ca059ae 100644 --- a/domains/portfolio/data-reference.md +++ b/domains/portfolio/data-reference.md @@ -33,6 +33,8 @@ | `totalsByCurrency` | Стоимости позиций + доступные деньги той же валюты | Не включает невычислимую стоимость; не обещает полную оценку портфеля | | `lastSuccessfulAt` | Время формирования успешного снимка, UTC | Не является временем каждой котировки; запасной снимок сохраняет исходное время | | `isStale` | Истёк часовой срок свежести сохранённого portfolio source | Не описывает состояние клиентского кэша или ошибку фонового запроса | +| `sector` | Сектор инструмента в том виде, как его определяет T-Bank, с обрезанными пробелами | Только для позиций `STOCK`, `BOND` и `FUND`; значение из одних пробел считается отсутствующим. Во всех остальных случаях — `null` | +| `issuer` | Бренд актива инструмента по данным T-Bank: `{ id, name }` | Только для позиций `STOCK`, `BOND` и `FUND`, когда у актива известны uid и название бренда. Во всех остальных случаях — `null`. Не влияет на количество, стоимость и свежесть снимка; используется вкладкой [«Концентрация»](concentration.md) | Ненулевые денежные остатки одной валюты суммируются. Позиции одинаковых инструментов в ответе отдельного счёта не объединяются; визуальная группировка @@ -58,6 +60,8 @@ ISIN, тикер и `logoName` могут быть `null`. `logoName` — имя или метаданных не меняет количество, суммы и свежесть снимка и не скрывает финансовые данные. Metadata обновляется независимо; отсутствие имени не задерживает выдачу финансового снимка и оставляет доступный идентификатор. +`logoName` не равен эмитенту из вкладки «Концентрация»: он берётся из metadata +инструмента, а эмитент — из [классификации инструмента](flows/portfolio-loading.md#обновление-сектора-и-эмитента). ## Структура и доли diff --git a/domains/portfolio/flows/portfolio-loading.md b/domains/portfolio/flows/portfolio-loading.md index 1d31896..50b340e 100644 --- a/domains/portfolio/flows/portfolio-loading.md +++ b/domains/portfolio/flows/portfolio-loading.md @@ -11,9 +11,28 @@ они не ждут и не вызывают T-Bank и не предлагают ручную синхронизацию. Часовой обход текущего подключения обновляет Portfolio независимо от экрана. Для нового полного snapshot ему нужны оба финансовых ответа `GetPortfolio` и -`GetPositions`; суммы и позиции публикуются вместе. Metadata инструмента -дополняет представление независимо, с доступным UID/FIGI вместо имени до её -онлайн-загрузки. +`GetPositions`; суммы и позиции публикуются вместе. Metadata инструмента и +классификация (сектор и эмитент) дополняют представление независимо, +с доступным UID/FIGI вместо имени до их загрузки. + +## Обновление сектора и эмитента + +Часовой обход также обновляет сектор и эмитента позиций типов `share`, `bond` +и `etf`. Значения хранятся как последнее известное ([ADR +022](../../../adr/022-stored-instrument-classification.md)): сектор — как его +определяет T-Bank, эмитент — бренд актива (`uid` и `name`). Каждое поле +обновляется при первом обходе, начавшемся не ранее чем через 24 часа после его +последнего успешного получения; пока значение не получено, попытка повторяется +в каждом обходе. Сектор и эмитент обновляются независимо. + +Неуспешное получение не мешает публикации snapshot и не меняет +`lastSuccessfulAt` и `isStale`; сохранённое значение остаётся доступным. +Исключение — отказ token: он обрабатывается так же, как отказ token при +обходе Portfolio. Инструмент ищется по UID, затем по FIGI; ответ «не найдено» +сохраняет прежнее значение и отсчёт 24 часов начинается заново. Позиции без +полученных значений участвуют в разрезах вкладки +[«Концентрация»](../concentration.md) как «Сектор не указан» и +«Эмитент не указан». Открытый экран выполняет локальное перечитывание не чаще одного раза в 30 минут; retry также повторяет только HTTP GET. `data: null` означает, что diff --git a/domains/portfolio/overview.md b/domains/portfolio/overview.md index 21afefd..15f8123 100644 --- a/domains/portfolio/overview.md +++ b/domains/portfolio/overview.md @@ -64,6 +64,10 @@ Backend получает данные через серверную без логотипа и с подписью результата. Отсутствующие показатели скрываются, а не подменяются нулём или заглушкой. +Рядом с вкладкой «Позиции» на странице отдельного счёта есть вкладка +[«Концентрация»](concentration.md): она показывает, где сконцентрированы +деньги — крупнейшие бумаги, секторы и эмитенты. В режиме «Все счета» её нет. + Существует расхождение: [согласованная спецификация представления позиций](https://git.personal.ksv741.ru/WealthLedger/specs/src/commit/9e227a563dda67620f0ad78228aa8a4c18bf35a0/openspec/specs/portfolio-view/spec.md#requirement-представление-карточек-позиций-на-клиенте) требует доступности всех иных типов в отдельной секции, а текущие frontend и его проверка исключают `CURRENCY` только из списка карточек. Такие позиции diff --git a/glossary.md b/glossary.md index 866c22d..d2fc1ed 100644 --- a/glossary.md +++ b/glossary.md @@ -119,6 +119,46 @@ Instrument. Она остаётся в `positions` и не объединяет _Не использовать_: денежный остаток, cash balance. +## Концентрация + +Вкладка страницы одного Brokerage Account, показывающая, какие акции, +облигации, секторы и эмитенты занимают наибольшую часть текущей оценки +Portfolio, без валютной конвертации. Отличается от [структуры +портфеля](domains/portfolio/data-reference.md#структура-и-доли): в её разрезах +деньги не входят в знаменатель долей. + +_Не использовать_: структура портфеля, диверсификация. + +## Разрез + +Одна из четырёх группировок вкладки «Концентрация»: «Акции», «Облигации», +«Секторы», «Эмитенты». Элемент разреза — единица ранжирования; сектор +агрегирует позиции `STOCK`, `BOND` и `FUND`, эмитенты — `STOCK` и `BOND`. + +_Не использовать_: фильтр, категория структуры. + +## Сектор + +Значение сектора инструмента в том виде, как его определяет T-Bank, без +перекодирования и собственной классификации WealthLedger. Заполняется для +позиций `STOCK`, `BOND` и `FUND`; государственные облигации определяются +значением `government` с подписью «Государственный сектор». Позиция без +сектора попадает в явную группу «Сектор не указан». + +_Не использовать_: отрасль, собственная классификация приложения. + +## Эмитент + +В разрезе «Эмитенты» вкладки «Концентрация» — бренд актива по данным T-Bank, +объединяющий акции и облигации одной компании; фонды в разрез не входят. +Название эмитента — название бренда. **Оговорка:** в этом разрезе слово +означает бренд актива T-Bank, а не юридического эмитента ценной бумаги; +[рейтинг выпуска](integrations/nkr.md) не подставляется вместо рейтинга +эмитента и наоборот. Позиция без бренда попадает в явную группу +«Эмитент не указан». + +_Не использовать_: юридический эмитент, эмитент рейтинга. + ## Instrument Ценная бумага или иной торгуемый актив T-Bank, на который ссылается Portfolio diff --git a/integrations/tbank.md b/integrations/tbank.md index 2214df2..e5a1857 100644 --- a/integrations/tbank.md +++ b/integrations/tbank.md @@ -14,8 +14,17 @@ WealthLedger обращается к Invest API на сервере по gRPC ov | Портфель и денежные остатки | Показать текущий состав инвестиций и итоги по исходным валютам | | Исполненные операции | Построить журнал и выделить полученные купоны и дивиденды | | Инструменты и рынок | Имена, идентификаторы, цены, свечи, параметры акций и облигаций | +| Классификация инструментов | Сектор акций, облигаций и фондов и бренд актива для разрезов [концентрации](../domains/portfolio/concentration.md) | | Купоны и дивиденды | Построить будущие события по текущим позициям и календарь инструмента | +Сектор получается из описаний инструмента (отдельные описания для акций, +облигаций и фондов, поиск по UID, затем по FIGI); эмитент — из описания актива +по `asset_uid` инструмента: его uid и название бренда. Эмитент не выводится из +названия, тикера или ISIN. Классификация хранится как последнее известное +значение с обновлением не чаще раза в сутки ([ADR +022](../adr/022-stored-instrument-classification.md)); все вызовы проходят +через общий лимитер запросов T-Bank. + T-Bank определяет исходные данные и права token. Backend проверяет локальную сессию, выбирает подключение её пользователя и устанавливает доступ к счёту. Наличие идентификатора счёта в URL этого доступа не подтверждает. @@ -41,7 +50,9 @@ Backend передаёт имя файла `logoName` из метаданных Логотипы используются в портфеле, операциях, будущих событиях, поиске и страницах инструментов. Отсутствующее имя или ошибка изображения оставляют -буквенную заглушку и не меняют финансовые значения. Правило построения URL +буквенную заглушку и не меняют финансовые значения. Логотип — это metadata +инструмента; он не равен эмитенту из [концентрации](../domains/portfolio/concentration.md), +который берётся из бренда актива. Правило построения URL принадлежит [форматированию frontend](https://git.personal.ksv741.ru/WealthLedger/frontend/src/commit/9f7e342333b80bfacfd5bc394a2dcd0613d33ff3/src/shared/lib/display.ts). ## Проверка и сохранение подключения diff --git a/overview.md b/overview.md index ede05cb..b48b568 100644 --- a/overview.md +++ b/overview.md @@ -20,6 +20,7 @@ WealthLedger — локальное приложение для частного | Найти свой инвестиционный счёт | [Список счетов](domains/accounts/overview.md), их типы и доступные сводки | | Вести банковские карты | [Ручной учёт](domains/cards/overview.md): независимые балансы, расходы, пополнения, переводы, возвраты и месячные сводки | | Понять текущий состав инвестиций | [Портфель](domains/portfolio/overview.md): позиции, денежные остатки и итоги по валютам | +| Увидеть, где сконцентрированы деньги | [Концентрация](domains/portfolio/concentration.md): крупнейшие бумаги, секторы и эмитенты счёта | | Разобрать уже совершённые движения | [Журнал операций](domains/operations/overview.md): исполненные операции с фильтрами и последовательной загрузкой истории | | Посчитать полученные выплаты | [Пассивный доход](domains/income/overview.md): исполненные купоны и дивиденды за календарный период | | Посмотреть ожидаемые события | [Будущие выплаты](domains/income/upcoming-events.md): купоны, дивиденды, погашения и оферты по текущим позициям |