# Получение данных о ценах облигаций
import requests
import csv
from datetime import datetime
import time
def get_bond_data(bond_identifier, start_date, end_date):
"""Получение данных по облигации (ISIN, тикер или название)"""
# Поиск облигации
url = "https://iss.moex.com/iss/securities.json"
params = {'q': bond_identifier}
response = requests.get(url, params=params)
data = response.json()
# Ищем облигацию
bond_info = None
for security in data['securities']['data']:
if (security[1] == bond_identifier or # ISIN
security[0] == bond_identifier or # тикер
security[2] == bond_identifier): # название
bond_info = {
'ticker': security[0],
'shortname': security[1],
'fullname': security[2],
'isin': security[1] if security[1].
На излёте первой декады сентября держатели облигаций ВТБ С1-519 столкнулись с неприятным сюрпризом: оказалось, что их бумаги не будут погашены по номиналу, как они ожидали. Выяснилось, что инвесторы получат выплату в размере всего лишь 316 рублей на облигацию и небольшую сумму в довесок, как слабое утешение:
Вчера мне прислали ссылку на статью из “Пульса” и поинтересовались, действительно ли амортизируемые облигации могут принести дополнительную реализованную доходность. В статье разбираются “две ситуации” — реальная и гипотетическая. В одной ситуации приобретается конкретная облигация с ежемесячной амортизацией, а в другой — искусственно предполагается, что происходило бы, если бы та же самая бумага платила обычные купоны, т.е. амортизация отсутствовала. Для убедительности в статье приведены расчеты в Excel и наглядно показано, что при определенных допущениях бумага с амортизацией выгоднее обычной.
Расчеты, конечно, можно не проверять, так как это не имеет смысла по простой причине: исходные предпосылки автора неверны. Но чисто арифметических ошибок там нет.
Главная finmath ошибка состоит в предположении, что цены обеих облигаций (в % от номинала) на момент их покупки можно считать равными.
Вымышленную облигацию достаточно легко оценить, так как она отличается от реальной только структурой денежных потоков. Возможны два подхода: 1) через эффективную доходность и 2) используя КБД с добавлением Z-спреда. Второй способ более правильный, но из за короткого срока бумаг отклонения будут минимальными.
Инвесторы на рынке облигаций могут преследовать разные цели:
⠀⠀⠀⠀⠀
Спекулятивным может считаться портфель, который инвестор собирается вскоре продать. Обычно с этой целью приобретаются длинные ОФЗ в расчете на рост их стоимости, если начнется снижение ставок. Инвестор ожидает, что реализованная доходность (HPR) его вложений за время смягчения ДКП превысит эффективную доходность к погашению (YTM).
Инвестор открыл в банке срочный вклад с капитализацией процентов. В качестве альтернативы он мог бы приобрести бескупонную облигацию и удерживать ее до погашения. Его не волнуют ни ценовой риск, ни риск реинвестирования. Он точно знает размер будущего дохода. Стоит ли ему переживать еще о чем-нибудь?
Вместо того чтобы сразу израсходовать деньги на текущее потребление, инвестор откладывает траты на определенный срок. Пусть X₀ и Xₜ обозначают стоимость типичного набора товаров на сегодняшний день и через t лет соответственно. Как правило, Xₜ > X₀ вследствие потребительской инфляции — устойчивого роста общего уровня цен на товары и услуги, приводящего к уменьшению покупательной способности денег.
Предположим, что стоимость Xₜ известна заранее. Мы можем найти численное значение инфляции в годовом выражении, равное π, из выражения Xₜ = X₀∙( 1+ π)ᵗ Согласятся ли участники рынка на номинальную ставку i = π по вкладу в банке или облигациям с нулевым купоном?
import requests import pandas as pd import numpy as np import matplotlib.pyplot as plt
# URL для API MOEX, данные по ZCYC (zero coupon yield curve) url = "https://iss.moex.com/iss/engines/stock/zcyc/securities.json" # Запрос на получение данных response = requests.get(url) data = response.json() # Извлекаем данные из секции 'params' columns = data['params']['columns'] values = data['params']['data'] # Преобразуем в DataFrame df = pd.DataFrame(values, columns=columns) # Выбираем нужные столбцы: B1, B2, B3, T1, G1, ..., G9 df_selected = df[['tradedate', 'tradetime', 'B1', 'B2', 'B3', 'T1', 'G1', 'G2', 'G3', 'G4', 'G5', 'G6', 'G7', 'G8', 'G9']] # Извлекаем параметры для функции GT из df_selected beta0 = df_selected['B1'].values[0] beta1 = df_selected['B2'].values[0] beta2 = df_selected['B3'].values[0] tau = df_selected['T1'].values[0] g_values = df_selected[['G1', 'G2', 'G3', 'G4', 'G5', 'G6', 'G7', 'G8', 'G9']].values[0].tolist()
Вновь взяться за перо меня побудили пост Андрея Х. о доходности к погашению (YTM) и чудовищные проявления ригоризма в комментариях к нему.
Вот утверждения автора, которые подверглись жестокой обструкции:
YTM (Yield to Maturity) — общий доход, ожидаемый от облигации, если облигация удерживается до погашения.
Этот вид доходности предполагает реинвестирование купонов внутри года и позволяет наиболее корректно сравнивать бумаги с разными параметрами (срок, купон, изменение цены)
И в самом деле, YTM это не “общий доход”, а ставка дисконтирования. Мы ведь помним, чем качественно отличаются доход, прибыль и процентная ставка? А выражение “реинвестирование купонов внутри года” правильно будет заменить на “сложную ставку процента ”
Конечно, Андрей Х. создает такие миниатюрные посты не в просветительских целях, а чтобы в очередной раз прорекламировать свои соцсети и телеграм-канал. Завсегдатаи смартлаба это понимают, и не имеют привычки придираться к содержанию и осуждать автора за мелкие недочеты. Мало кто ожидал, что в комментариях возникнет агрессивный неофит, гневно размахивающий старой публикацией малоизвестных американских финансистов.
В амортизируемых облигациях иногда можно наблюдать ценовые разрывы после частичного погашения номинала. Подобная “дивотсечка” недавно произошла, например, в бумагах Ульоб35002 (ISIN. RU000A101U61). 26 июня 2024 г. они торговались по цене около 87% от номинала, а на следующий день котировки упали до 84%
Для простой облигации снижение котируемой цены означает рост доходности на величину, обратно пропорциональную дюрации. Инвесторы, купившие такие бумаги на падении, могли бы извлечь дополнительный доход при условии, что будут держать их до погашения.
Однако у облигации “Ульоб35002” эффективная доходность в указанные дни почти не менялась и составляла примерно 18% годовых, а значит, разницу цен нельзя было использовать для получения финансовой выгоды. Это легко увидеть, если перейти к абсолютным цифрам. Перед выплатой купона и частичным погашением в размере 200 руб. облигация стоила около 870 руб (с учетом НКД — 903 руб), а сразу после — 670 руб, т.е. цена упала на величину амортизированной стоимости и выплаченного купона. Но почему тогда мы видим разрыв на графике?