Задача облигационного калькулятора - рассчитать стандартные метрики по облигации с учетом ее цены, даты расчета, а также оценить (найти):
Кредитный спред к безрисковой кривой облигаций
Рейтинговую группу облигации, соответствующий облигационный индекс
Кредитный спред соответствующего облигационного индекса и его отклонение за последние 20 дней
Облигации-аналоги, с близкой датой погашения (оферты), той же рейтинговой группой и по которым были торги.
Оценить "рыночность" цены облигации по методологии Банка России в отношении фидуциарной ответственности НПФ.
Оценить денежные потоки облигации с плавающим купоном/номиналом, используя вмененные сценарий или собственный сценарий пользователя
Оценить Real-Yield облигации к CPI или базовой ставке/индикатору (RUONIA, Ключевая ставка RU-RATE)
Облигационный калькулятор позволяет рассчитать следующие аналитические показатели облигации:
# | Показатель | Расшифровка |
---|---|---|
1 | Агрегированный рейтинг | Агрегированный рейтинг облигации в соответствии с указанием 4060-У |
2 | Рейтинговая группа | Группа рейтингов на основе таблицы соответствия |
3 | Соответствующий индекс облигаций | Соответствующий рейтинговой группе, дюрации и классу индекс облигации |
4 | Срок до погашения (оферты) | Срок до погашения (оферты) в годах |
5 | НКД | Накопленный купонный доход |
6 | Дюрация Маколея, лет | Дюрация Маколея |
7 | Модифицированная дюрация | Модифицированная дюрация |
8 | YTM (эфф), % | Доходность к погашению (оферте) облигации в % годовых |
9 | YTM (эфф), % на Gcurve | Доходность к погашению в % годовых на безрисковой кривой доходности с соответствующим уровнем дюрации |
10 | G-spread (к кривой Gcurve), б.п. | Кредитный спред рассчитанной облигации в базисных пунктах |
11 | Z-spread (к кривой Gcurve), б.п. | Кредитный спред рассчитанной облигации в базисных пунктах с учетом дисконтирования денежных потоков по облигации под ставку соответствующую дюрации на бескупонной кривой доходности (Gcurve). |
12 | G-Spread соответсвующего индекса, б.п. | Кредитный спред соответствующего индекса |
13 | СКО (20 дн) G-Spread соотв. индекса, б.п. | Стандартное отклонение кредитного спреда соответствующего индекса за последние 20 дней |
14 | Медианный G-Spread по аналогам, б.п. | Медианный кредитный спред по облигациям-аналогам рассчитанный на выборке |
15 | YTM (эфф), % соотв. индекса | Доходность к погашению (оферте) соответствующего индекса в % годовых |
Дополнительные метрики по облигации
# | Показатель |
---|---|
16 | Средний G-spread по аналогам |
17 | Мин/Макс Z-spread по аналогам |
Справедливая цена сделки, % | |
18 | На основе среднего Z-spread по аналогам |
19 | На основе среднего Z-spread эмитента |
20 | На основе верхней/нижней границы G-spread индекса |
Для расчета доходности безрисковой ставки с аналогичным сроком до погашения (YTM (эфф), % на Gcurve) используется метод поиска средневзвешенной по сроку YTM между двумя соседними опорными точками кривой бескупонной доходности.
Валюта | Источник опорных точек КБД | Ссылка на источник |
---|---|---|
RUB | Московская биржа | https://www.moex.com/ru/marketdata/indices/state/g-curve/ |
EUR | Deutsche Bundesbank | https://www.bundesbank.de/dynamic/action/en/statistics/time-series-databases/time-series-databases/759784/759784?listId=www_skms_it02f |
USD | U.S. DEPARTMENT OF THE TREASURY | https://home.treasury.gov/policy-issues/financing-the-government/interest-rate-statistics?data=yield |
CNY | China Central Depository & Clearing Co | https://yield.chinabond.com.cn/cbweb-mn/yield_main?locale=en_US |
Выдержка из функции расчета безрисковой ставки на КБД:
base := 365
dur - дюрация Макалея в днях
rate_3m, rate_6m, rate_1y и т.д. - опорные доходности на КБД для сроков 3мес, 6мес, 1года и т.д.
При оценке безрисковой ставки для 3 месяцев и ниже используется значение ставки для 3 мес.
#сроки для опорных точек КБД
m3 := 0.25 * base
m6 := 0.5 * base
m9 := 0.75 * base
y1 := 1 * base
y2 := 2 * base
y3 := 3 * base
y5 := 5 * base
y7 := 7 * base
y10 := 10 * base
y15 := 15 * base
y20 := 20 * base
y30 := 30 * base
if dur <= m3 {
rate = rate_3m
} else if dur <= m6 {
rate = rate_3m + (dur-m3)/(m6-m3)*(rate_6m-rate_3m)
} else if dur <= m9 {
rate = rate_6m + (dur-m6)/(m9-m6)*(rate_9m-rate_6m)
} else if dur <= y1 {
rate = rate_9m + (dur-m9)/(y1-m9)*(rate_1y-rate_9m)
} else if dur <= y2 {
rate = rate_1y + (dur-y1)/(y2-y1)*(rate_2y-rate_1y)
} else if dur <= y3 {
rate = rate_2y + (dur-y2)/(y3-y2)*(rate_3y-rate_2y)
} else if dur <= y5 {
rate = rate_3y + (dur-y3)/(y5-y3)*(rate_5y-rate_3y)
} else if dur <= y7 {
rate = rate_5y + (dur-y5)/(y7-y5)*(rate_7y-rate_5y)
} else if dur <= y10 {
rate = rate_7y + (dur-y7)/(y10-y7)*(rate_10y-rate_7y)
} else if dur <= y15 {
rate = rate_10y + (dur-y10)/(y15-y10)*(rate_15y-rate_10y)
} else if dur <= y20 {
rate = rate_15y + (dur-y15)/(y20-y15)*(rate_20y-rate_15y)
} else if dur <= y30 {
rate = rate_20y + (dur-y20)/(y30-y20)*(rate_30y-rate_20y)
} else {
rate = rate_30y
}
return rate * 100
Калькулятор рассчитывает z-spread анализируемой облигации, средний z-spread облигаций аналогов, средний z-spread других выпусков эмитента, а также коридор движения g-spread релевантного индекса облигаций, и выводит результаты в виде диаграммы.
Справа на диаграмме представлено сравнение спреда сделки по сравнению с аналогами/индексом/эмитентом. Слева тоже самое, только в категории цены облигации. Это значит, что ТрэкРекордс рассчитал справедливую цену облигации, основываясь на z-spread эмитента, аналогов и диапазона g-spread индекса.
Всплывающее окно (на верху страницы при скроле).
На всплывающем окне мы видим результаты трех блоков расчета (три столбца) для удобного сравнения (расчет по индексу облигаций, расчет по аналогам, расчет по эмитенту). В эти результаты входят три основных показателя: Z-spread, доходность к погашению – YTM, цена.
Первый столбец:
Z-spread (к кривой Gcurve) в б.п, рассчитанный с учетом дисконтирования денежных потоков по облигации под ставку соответствующую дюрации на бескупонной кривой доходности (Gcurve); YTM - доходность к погашению (оферте) облигации в % годовых;
Цена - изначально предполагаемая цена сделки.
Второй столбец:
Средний Z-spread по аналогам, рассчитывается на основе Z-spread (к кривой Gcurve) каждого аналога;
YTM - средняя доходность к погашению (оферте) облигации по аналогам в % годовых, рассчитывается на основе YTM (эфф) каждого аналога;
Цена (чистая) - справедливая чистая (без НКД) цена анализируемой облигации, рассчитанная на основе среднего Z-spread по аналогам.
Третий столбец:
Средний Z-spread по отобранным (фильтры-параметры: период анализа, мин. объем торгов, диапазон дюрации, валюта) для анализа облигациям эмитента, рассчитывается на основе Z-spread (к кривой Gcurve) каждой отобранной облигации;
YTM - средняя доходность к погашению (оферте) облигации по аналогам в % годовых, рассчитывается на основе YTM (эфф) каждой отобранной облигации;
Цена - справедливая чистая (без НКД) цена анализируемой облигации, рассчитанная на основе среднего Z-spread по отобранным облигациям эмитента.
Агрегированный рейтинг облигации строится на основе рейтингов эмиссий и рейтингов эмитента присвоенных международными (S&P, Fitch, Moody's) и локальными (Эксперт РА и АКРА, НРА, НКР) рейтинговыми агентствами . Методику расчета агрегированного рейтинга см здесь
Облигации-аналоги - облигации со схожими инвестиционными характеристиками.
При оценке аналогов учитываются облигации, по которым (по умолчанию):
Данные параметры-фильтры можно настроить в режиме онлайн (пример).
YTM, G/Z-spread облигаций аналогов рассчитывается сервисом. По умолчанию расчет доходности, дюрации и спредов считается до последнего известного купона.
При анализе цен на рублевые облигации-аналоги используется информация об итогах торгов на Московской бирже. За приоритет используется средневзвешенная цена торгов WAPRICE. При ее отсутствии, берутся следующие типы цен по уровню вниз:
Уровень | Фильтр | |
---|---|---|
1 | WAPRICE | Средневзвешенная цена, % от номинала |
2 | CLOSE | Цена последней сделки, % |
3 | BID | Цена спроса (котировка на покупку) на момент окончания торговой сессии, % от номинала |
4 | MARKETPRICE2 | Рыночная цена (2), % от номинала |
5 | ADMITTEDQUOTE | Признаваемая котировка, % от номинала |
Один из видов расчета - расчет средних метрик по облигациям эмитента (G и Z-spread, справедливая цена по среднему Z-spread). Параметры-фильтры подбора (период анализа, мин. объем торгов, диапазон дюрации, валюта, вариант расчета: среднее арифметическое/средневзвешенное) можно настроить вручную.
Оцениваемая облигация выделяется цветом.
При расчете метрик по облигациям с плавающей ставкой купона или номинала используются сценарии и формулы зависимостей потоков от показателей сценария.
Под сценарием понимается группа прогнозных значений ключевых показателей (таких как инфляция, ВВП, ставки ОФЗ и др) на n периодов (месяцев или кварталов) вперед.
Пример сценария
При выборе сценария при проведении расчетов в калькуляторе, система подставит показатели сценария в формулы потоков, пересчитает потоки по облигации и проведет расчет остальных метрик на основе пересчитанных денежных потоков.
Для каждой облигации с плавающей ставкой купона или номинала в базе данных прописана формула расчета ставки купона (погашения номинала или суммы непогашенного номинала) в зависимости от ключевых показателей. Запись формул опирается на разработанных внутренний язык для обработки формульных выражений и ключевые показатели из сценария (keys).
С марта 2024 в сервисе ТрэкРекордс появился вмененный сценарий для отдельных облигаций, купон или номинал которых зависит от ставки RUONIA, RU_CPI, RU_RATE. Методологию расчета смотрите в разделе флоатеры и линкеры.
Данные с денежными потоками по облигациям имеют следующую структуру (на примере одного потока):
Столбец | Описание | Пример |
---|---|---|
ISIN | Код ISIN облигации | RU000A0ZYR91 |
ISSUER | Эмитент | ГТЛК |
COUPON_DATE | Дата купона/потока | 05.05.2020 |
COUPON_RATE | Ставка купона | 0.0715 |
CF_COUPON | Размер купона в деньгах | 17.83 |
CF_NOMINAL | Погашения части номинала | |
OS_NOMINAL | Непогашенный номинал | 1000 |
COUPON_RATE_FORMULA | Формула ставки купона | VAR_RU_RATE[get_i_date(VAR_COUPON_DATE)]+(0.0065) |
CF_NOMINAL_FORMULA | Формула расчета суммы погашения номинала | |
OS_NOMINAL_FORMULA | Формула расчета суммы непогашенного номинала | VAR_OS_NOMINAL_ARRAY[I-1]-VAR_CF_NOMINAL_ARRAY[I-1] |
COMMENT | Комментарий | Ключевая ставка + 0,65% |
В данном примере указана формула зависимости купона от ключевой ставки Банка России. Система при обработке формулы возьмет наиболее приближенное и известное к дате купона (05.05.2020) значение ключевой ставки из сценария (в примере это 6.5%) и прибавит к нему 0.65%. А далее рассчитает размер купона на основе этой расчетной ставки купона, суммы непогашенного номинала и периода накопления купона в днях.
Операция/Функция | Пример | Результат |
---|---|---|
+ | 2+3 | 5 |
- | 5-2 | 3 |
/ | 5/2.5 | 2 |
* | 5*5 | 25 |
max(a,b) | max(5,10) | 10 |
min(a,b) | min(5,10) | 5 |
date(YYYY,MM,DD) | date(2019,05,30) | 30.05.2019 |
get_i_date(date()) - получить номер периода i из сценария по дате | get_i_date(VAR_COUPON_DATE) | 2 |
diff_date() - разница между датами в днях | diff_date(date(2019,05,30), date(2019,04,28)) | 30 |
Условие (если, то) | (7 > 10 ? 1 : 2) + 0.1 | Вернет 1.1 |
Условие (если, то) | (7 < 10 == true ? 1 : 2) + 0.1 | Вернет 2.1 |
Программа для расчета денежных потоков считывает каждую строку в массиве данных о денежных потоках. Для каждой строки можно использовать переменные, которые будут выводить информацию из считываемой строки. Эти переменные нужны для написания формул расчета CF_COUPON, CF_NOMINAL и OS_NOMINAL
Переменная из строки | Описание |
---|---|
VAR_COUPON_DATE | Дата денежного потока |
VAR_COUPON_RATE | Ставка купона (уже рассчитанная) |
VAR_CF_COUPON | Размер купона в деньгах (посчитанный по ставке) |
VAR_CF_NOMINAL | Размер погашения номинала в деньгах |
VAR_OS_NOMINAL | Размер суммы непогашенного номинала |
VAR_CURRENT_PERIOD | Текущий номер периода сценария исходя из даты денежного потока |
VAR_LAST_PERIOD | Номер периода сценария исходя из даты предыдущего денежного потока |
VAR_NEXT_PERIOD | Номер периода сценария исходя из даты следующего денежного потока |
VAR_ITEM_PERIOD[номер периода] | Дата по номеру периода из сценария |
VAR_OS_NOMINAL_ARRAY[I-1] | Значение непогашенного номинала на предыдущую дату денежного потока. I - порядковый номер денежного потока в данной бумаге. (I-1) - с большой буквы |
VAR_CF_NOMINAL_ARRAY[I-1] | Значение купона на предыдущую дату денежного потока. |
В показателях сценария используются ключи. Их можно называть как угодно. Основное правило - они должны быть написаны с заглавных букв и пробелы должны соединяться символом "_". Далее данные ключи возможно использовать в формулах денежных потоков используя приставку VAR__
Например я могу в сценарий добавить переменную "Показатель" с ключом INDICATOR. Далее в формулах купонов я могу использовать этот массив как VAR_INDICATOR[номер периода в сценарии]
Стандартные индикаторы
Используются коды показателей сценария с приставкой VAR_
Комментарий к расчету купона или номинала | CF_FORMULA или OS_NOMINAL_FORMULA |
---|---|
MosPrime 6M + 2% | VAR_MOS_PRIME_6M[get_i_date(VAR_COUPON_DATE)]+0.02 Или VAR_MOS_PRIME_6M[VAR_CURRENT_PERIOD]+0.02 |
12-59 купоны max(1%;(ИПЦ-100%)+3%) | max(0.01,VAR_RU_CPI[get_i_date(VAR_COUPON_DATE)]+0.03) |
12-59 купоны - ИПЦ +2.5% годовых | VAR_RU_CPI[get_i_date(VAR_COUPON_DATE)]+0.025 |
Ключевая ставка +0,1% | VAR_RU_RATE[get_i_date(VAR_COUPON_DATE)]+0.001 |
MAX(ИПЦ+4%;Ключевая ставка ЦБ РФ+2%) | max(VAR_RU_RATE[get_i_date(VAR_COUPON_DATE)]+0.02,VAR_RU_CPI[get_i_date(VAR_COUPON_DATE)]+0.04) |
2-40 купоны ОФЗ 1 год + 1% | VAR_2Y_OFZ[get_i_date(VAR_COUPON_DATE)] + (VAR_NEXT_PERIOD==VAR_CURRENT_PERIOD ? 0: (VAR_2Y_OFZ [get_i_date(VAR_COUPON_DATE)+1]- VAR_2Y_OFZ [get_i_date(VAR_COUPON_DATE)])*diff_date(VAR_COUPON_DATE, VAR_ITEM_PERIOD[VAR_CURRENT_PERIOD])/diff_date(VAR_ITEM_PERIOD[VAR_NEXT_PERIOD], VAR_ITEM_PERIOD[VAR_CURRENT_PERIOD]))+0.01 |
Max(6M EURIBOR;0) +2,2% | max(VAR_6M_Euribor[get_i_date(VAR_COUPON_DATE)],0)+0.022 |
2-30 купоны - Yj(7)+ 0.75%, где Yj(7) - значение 7-летней точки на GCurve на конец 5-го рабочего дня, предшествующего дате начала j-го купонного периода, премия определяется по результатам букбилдинга |
3/5*(VAR_5Y_OFZ [get_i_date(VAR_COUPON_DATE)] + (VAR_NEXT_PERIOD==VAR_CURRENT_PERIOD ? 0: (VAR_5Y_OFZ [get_i_date(VAR_COUPON_DATE)+1]- VAR_5Y_OFZ [get_i_date(VAR_COUPON_DATE)])diff_date(VAR_COUPON_DATE, VAR_ITEM_PERIOD[VAR_CURRENT_PERIOD])/diff_date(VAR_ITEM_PERIOD[VAR_NEXT_PERIOD], VAR_ITEM_PERIOD[VAR_CURRENT_PERIOD])))+2/5(VAR_10Y_OFZ [get_i_date(VAR_COUPON_DATE)] + (VAR_NEXT_PERIOD==VAR_CURRENT_PERIOD ? 0: (VAR_10Y_OFZ [get_i_date(VAR_COUPON_DATE)+1]- VAR_10Y_OFZ [get_i_date(VAR_COUPON_DATE)])*diff_date(VAR_COUPON_DATE, VAR_ITEM_PERIOD[VAR_CURRENT_PERIOD])/diff_date(VAR_ITEM_PERIOD[VAR_NEXT_PERIOD], VAR_ITEM_PERIOD[VAR_CURRENT_PERIOD])))+0.0075 |
(10%+КС+2,5%)/2 | (VAR_RU_RATE[get_i_date(VAR_COUPON_DATE)]+0.125)/2 |
Индексация номинала на ставку инфляции если переменная NOMINALINDEXATION в сценарии = 1. Если NOMINALINDEXATION = 0 то использовать предыдущее значение номинала | (VAR_NOMINALINDEXATION[VAR_CURRENT_PERIOD] == 1 ? VAR_OS_NOMINAL_ARRAY[I-1]*(1+VAR_RU_CPI[VAR_CURRENT_PERIOD]/2) : VAR_OS_NOMINAL_ARRAY[I-1]) |