143 lines
14 KiB
Markdown
143 lines
14 KiB
Markdown
# Облигации
|
||
|
||
Страница облигации объясняет условия конкретного выпуска, его рыночную цену,
|
||
купонный календарь и личную позицию. Денежная оценка покупки, текущая купонная
|
||
доходность, доходность источника к целевой дате и результат открытой позиции
|
||
имеют разный смысл. Раздел сохраняет их отдельно, вместе с валютой,
|
||
датой и ограничениями исходных данных.
|
||
|
||
## Поиск и идентификация выпуска
|
||
|
||
Раздел «Облигации» открывает `/bonds`: поиск по названию, тикеру или ISIN
|
||
с двух символов. `/bonds/:identifier` принимает UID или точный тикер.
|
||
Название и логотип облигации в портфеле счёта и «Всех счетах» ведут на её
|
||
страницу по точному UID без предварительной загрузки карточек всех позиций.
|
||
При открытии выпуска проверенный однозначный тикер заменяет UID в адресе,
|
||
сохраняя период графика и фильтр событий.
|
||
|
||
Поиск выбирает один режим на нормализованный ISIN, сохраняя разные выпуски
|
||
и записи без ISIN отдельно. Приоритет: доступность API, точный тикер, TQOB,
|
||
затем UID. Ограничение — 30 результатов после выбора режима. Цена и ссылка
|
||
принадлежат выбранному UID. Прямая ссылка из портфеля сохраняет исходный UID,
|
||
если поиск предпочитает другой режим. Неоднозначный точный тикер возвращает
|
||
`409 BOND_TICKER_AMBIGUOUS`; интерфейс предлагает выбрать выпуск через поиск.
|
||
Поиск загружает параметры выпусков и котировки, но оставляет ссылки по UID:
|
||
отдельная проверка тикера для каждого результата не выполняется.
|
||
|
||
## Содержание
|
||
|
||
Карточка показывает цену в процентах от номинала, время котировки и статус
|
||
торгов. Изменение выражено в процентных пунктах относительно последней
|
||
завершённой дневной свечи до московской даты котировки; база ищется за 20 дней.
|
||
Денежная оценка без НКД равна цене в процентах, умноженной на текущий номинал
|
||
и делённой на 100. Она округляется до девяти десятичных знаков. Оценка с НКД
|
||
добавляет текущий накопленный купонный доход только при совпадении валют.
|
||
Это ориентир без комиссии: котировка может быть старше текущего номинала и НКД.
|
||
FX-конвертация не выполняется, первоначальный номинал не заменяет текущий.
|
||
|
||
Условия выпуска: текущий и первоначальный номинал, погашение, оферта,
|
||
количество купонов в год, лот. Отдельно отмечены плавающий купон,
|
||
амортизация, бессрочность и субординация. Неизвестные даты и суммы показываются
|
||
как недоступные.
|
||
|
||
Сводка «Купон, рейтинг и доходность» показывает ближайший купон на одну
|
||
облигацию, дату выплаты и тип из календаря Т-Банка. Неизвестная сумма ближайшей
|
||
выплаты не заменяется суммой более позднего купона. Флаг плавающего купона
|
||
используется только как запасной признак типа; отсутствие флага не означает
|
||
фиксированный купон.
|
||
|
||
Текущая купонная доходность — ближайший купон × 365 / длительность его периода
|
||
в днях / денежная цена без НКД × 100 %. Decimal-расчёт округляется до четырёх
|
||
знаков. Требуются известная неотрицательная выплата, положительные цена и
|
||
период и одинаковая валюта выплаты и цены. Это годовая оценка при сохранении
|
||
размера купона и номинала, без налогов, комиссий и реинвестирования; она не
|
||
является доходностью к погашению. Время котировки показывается отдельно.
|
||
|
||
Эффективная доходность берётся из `marketdata_yields.EFFECTIVEYIELD` [MOEX ISS](../../integrations/moex.md),
|
||
с проверкой точных SECID, ISIN и BOARDID. Показываются собственная цена
|
||
расчёта, дата торгов и целевая дата (погашение, оферта или другая дата источника).
|
||
Котировка MOEX может отличаться от котировки Т-Банка и поступать с задержкой.
|
||
Доходность не рассчитывается из неполного календаря будущих выплат.
|
||
|
||
Кредитный рейтинг выпуска читается по точному ISIN из публичного
|
||
[реестра НКР](../../integrations/nkr.md). Отображаются агентство,
|
||
дата рейтингового действия, время получения реестра и ссылка на выпуск.
|
||
Отзыв показывается явно; уровень риска Т-Банка и рейтинг эмитента не
|
||
подставляются вместо рейтинга выпуска. Отсутствие записи в НКР не означает
|
||
отсутствия рейтингов других агентств. Причины выбора источника и пределы
|
||
покрытия сохранены в [ADR 013](../../adr/013-nkr-bond-credit-ratings.md).
|
||
|
||
HTML-источник, общий кэш и поведение при изменении реестра описаны в
|
||
[интеграции НКР](../../integrations/nkr.md#загрузка-кэш-и-отказ-источника).
|
||
|
||
График и таблица дневных цен сохраняют проценты от номинала и признак
|
||
завершённости свечи. Исторические котировки не пересчитываются в деньги
|
||
по сегодняшнему номиналу. Денежная средняя покупки не наносится на процентную
|
||
шкалу. Периоды: месяц, полгода, год и вся известная история. Окна upstream
|
||
не превышают 365 дней, одинаковые границы дедуплицируются. Если начало истории
|
||
неизвестно, запрос «вся история» возвращает `BOND_HISTORY_START_UNAVAILABLE`.
|
||
|
||
Позиция агрегирует только `BOND` с точным UID по доступным счетам, используя
|
||
[снимок портфеля](../portfolio/overview.md) и decimal-арифметику. Средняя покупка взвешена
|
||
по количеству. Неполные или разновалютные суммы недоступны; общая средняя
|
||
и процент доступны только при положительных включённых позициях. Для
|
||
коротких позиций и сочетания длинных с короткими эти показатели не синтезируются.
|
||
Результат открытой позиции не включает выплаченные купоны и продажи и не
|
||
называется доходностью к погашению. При отсутствии позиции блок скрыт.
|
||
|
||
## Купоны и личные события
|
||
|
||
Календарь охватывает пять прошлых лет и следующий год. Будущие купоны
|
||
сортируются по дате выплаты, прошедшие и недатированные доступны отдельно.
|
||
Показаны сумма на облигацию, номер, тип, длительность периода и дата реестра,
|
||
если они известны. Неопределённый будущий купон не заменяется нулём.
|
||
|
||
Личная оценка доступна только при положительных позициях, известной сумме,
|
||
будущей выплате и известном ещё не прошедшем реестре. Она не подтверждает право
|
||
на выплату и не учитывает налоги и будущие сделки. Время позиции и устаревание
|
||
снимка показываются отдельно от календаря выпуска.
|
||
|
||
Личная история использует [журнал операций](../operations/overview.md) всех счетов с точным
|
||
`instrumentUid`, включая прошлые годы. Фильтры: все, сделки, купоны, прочее.
|
||
Смена фильтра сбрасывает пагинацию; истёкший курсор восстанавливается запросом
|
||
первой страницы. Выплаты выпуска не подменяют личные зачисления.
|
||
|
||
## Получение данных и восстановление
|
||
|
||
Страницу облигации обслуживает инвестиционная подсистема backend.
|
||
Запросы `/api/v1/bonds` требуют действующей сессии с Bearer token и текущего
|
||
подключения T-Bank. Backend разрешает идентификатор и получает условия
|
||
выпуска, котировку, свечи, позицию, купоны и показатели. Точную форму
|
||
транспортного контракта задаёт [HTTP API](../../architecture/http-api.md).
|
||
|
||
`BondBy`, `FindInstrument` и `GetBondCoupons` используют способ
|
||
декодирования, сохраняющий отсутствие полей. Рыночные RPC проходят
|
||
общие TLS, очередь, ограничение частоты, deadline и повторные попытки. Кэш успешных и совместных
|
||
незавершённых запросов ограничен LRU и сроком 30 секунд по пользователю,
|
||
поколению подключения и параметрам. Ошибки не кэшируются; ошибки авторизации
|
||
не подавляются при дополнительной загрузке данных поиска.
|
||
Исходный ответ `BondBy` совместно используется поиском, карточкой, котировкой,
|
||
графиком, купонами и сводкой показателей в пределах того же пользователя, поколения и TTL.
|
||
Одновременная загрузка секций вызывает один `BondBy` на UID. Календарь
|
||
и сводка совместно используют один запрос купонов; котировка переиспользуется
|
||
при расчёте купонной доходности. MOEX и НКР загружаются только для открытого
|
||
выпуска, независимо от поиска. Для 30 новых
|
||
результатов поиск выполняет 32 RPC до повторных попыток: один `FindInstrument`,
|
||
30 `BondBy` и один пакетный запрос цен. Общий ограничитель backend не заменяет
|
||
квоты Т-Банка; при их исчерпании сохраняется `TBANK_UNAVAILABLE`.
|
||
|
||
Разделы загружаются независимо, показывают каркас загрузки и локальную повторную попытку.
|
||
Ошибка фонового обновления сохраняет последние данные. Смена подключения
|
||
сбрасывает поддерево клиентских запросов облигаций вместе с остальными финансовыми запросами;
|
||
выход очищает кэш сессии. Общие график, позиция и личные события
|
||
имеют общее представление на страницах акций и облигаций.
|
||
|
||
Основные спецификации [портфеля](../../../specs/openspec/specs/portfolio-view/spec.md)
|
||
и [журнала](../../../specs/openspec/specs/brokerage-account-ledger/spec.md)
|
||
описывают исходные финансовые понятия. Отдельная основная спецификация
|
||
страницы облигации в текущем OpenSpec Store не найдена; условия вычислений
|
||
подтверждены [сервисом облигаций](../../../backend/src/tbank/bond.service.ts)
|
||
и его [проверками](../../../backend/src/tbank/bond.service.spec.ts).
|
||
Границы источников описаны в [разделе интеграций](../../integrations/README.md),
|
||
сходное разделение рыночных и личных данных — в [акциях](stocks.md).
|