Блог им. Ride_The_Market_Wave

Математика Облигаций. Доходность к погашению.

Друзья, всем привет!
Сегодня будет первая статья в этом блоге.

Финансовая математика начинается с понятия временной стоимости денег.
Эта теория постулирует, что денежные потоки имеют разную стоимость в зависимости от момента времени, в который они будут получены.
Что вполне логично, ведь 100 рублей сегодня и 100 рублей через год — это разные деньги.
Поэтому денежные потоки надо дисконтировать под определённую ставку. Так возникает понятие приведённой стоимости денег (PV или Present Value).

 


Автодор БО-3 выпуск 2 RU000A104XR2
(https://www.moex.com/ru/issue.aspx?board=EQNE&code=RU000A104XR2)
 
В качестве примера рассмотри конкретную бумагу, которая обращается на рынке.
Многие из часто оплачивают проезд по дорогам компании Автодор, давайте и разберём их облигацию.
Для простоты возьмём бумагу с фиксированным купоном и без аморатизации, с выплатами 2 раза в год.
Сразу сделаю замечание, что для наглядности и простоты расчета не будем учитывать реинвестирование купонов.

# Задаём график выплат
start_date = '2025-08-01'
end_date = '2027-08-01'
freq = '6MS'

date_range = pd. <a name="cut"></a> date_range(
    start = start_date, end = end_date, freq = freq
)
cash_flows = [0, 53.1, 53.1, 53.1, 1000 + 44.35]
for i in range(0,len(date_range)):
    print(f"Выплата номер {i} в дату {date_range[i].strftime('%d.%m.%Y')} составит {cash_flows[i]}")


Или графически можно изобразить так:
Математика Облигаций. Доходность к погашению.

Вычислим доходность к погашению (YTM).
Нам даны стоимость облигации на рынке, номинал, график выплаты (cash flow) купонов и номинала.
Чтобы найти доходность надо решить степенное уравнение отностительно параметра r.
Проще всего получить приближенное решение численным методом, возьмём реализацию из библиотеки scipy.

Математика Облигаций. Доходность к погашению.


Код языке python:
# Начальное приближение
initial_guess = 0.1

# Задаём уравнение f(x) = 0
def equation(x):
    N = 1000
    P = 932
    n = 2
    T = 2
    cash_flows = [0, 53.1, 53.1, 53.1, 1000 + 44.35]
    
    return P - np.sum([ cash_flows[i]/((1+(x/n))**(i)) for i in range(1, n*T+1) ])
    
# Решение с помощью fsolve
solution_fsolve = fsolve(equation, initial_guess)[0]

print(f"Оценка доходности к погашению {100*solution_fsolve:.2f} %, в процентах годовых")
Оценка доходности к погашению 14.25 %, в процентах годовых

По итогу получили доходность 14.25%. А на сайте мосбиржи указана доходность 15.25%.
Причина расходнения как раз в реинвестировании купонов, в том что мы её не учли.
Грубо говоря 100 рублей купонов за год нам бы дали примерно 10 рублей, вот как раз и тот самый один процент.

Спасибо за внимание!
I hope you found this helpful!
386
12 комментариев
dsfdfss, ИИ выдал Вам сомнительный ответ, НКД в текущей точке 0. НКД отсчитывается от последней купонной выплаты. Код очень простой и легко работает — 0 в массив специально добавил, чтобы показать, что в дату расчета выплаты нет. А выбор метода оптимизации в данном случае это просто вкусовщина.
avatar
Ride_The_Market_Wave, я с тобой спорить не буду, просто скажу так, в вопросах кто касается расчетов, программирования, бухгалтерии, математики  и тд он умнее всех вас вместе взятых, ты с ним поговри а не со мной он тебе все по полочкам разложит
avatar
У этого выпуска погашение в другую дату.

avatar
dmytriy klimov, для простоты расчета сместил даты на месяц. Тут скорее попытался сделать приближённую оценку доходности и показать как применяются формулы. Точный расчёт будет значительно сложнее — надо учитывать абсолютное количество дней от выплаты до выплаты и реинвестирование купонов. Вам спасибо за комментарий — тут надо было подробнее описать исходные допущения))
avatar
Ride_The_Market_Wave, Так в этом же причина расхождения! И никакое реинвестирование здесь ни причём)))



avatar
dmytriy klimov, сокращение срока действительно приводит к тому, что последняя выплата с учётом дисконтирования станет немного больше. Но даже с этой поправкой я получил значение 14,8%. Допускаю, что могут быть ещё неучтённые эффекты. Но в любом сразу видно, и это радует, что пишет Естественный Интеллект, а не ИИ)))

avatar
Ride_The_Market_Wave, Надо дни считать правильно. Там последний купонный период 152 дня, те n не равно 2 и Т, соответственно, тоже.
avatar
dmytriy klimov, тут полностью согласен))
avatar
Ride_The_Market_Wave, и зачем этот код если ЧИСТВНДОХ экселя сделает это проще, точнее и, главное, вы получите такой же результат, что и биржа?
avatar
dmytriy klimov, вычисления делать интересно. Мне лично это нравится. Теперь понятно — ЧИСТВНДОХ как раз и учитывает реинвестирование! Безусловно, можно пользоваться и готовыми калькуляторами, да и вообще готовыми решениями. Но я и не призываю Вас пользоваться моим кодом, и не претендую на последнюю правду. Тут каждый решает для себя)
avatar
Ride_The_Market_Wave, так и ваша формула учитывает))). У вас погрешность из-за неверных начальных условий появляется. ЧИСТВНДОХ такую же формулу использует как и вы. Про реинвестирование, которое вы не видите рекомендую почитать  smart-lab.ru/blog/1054369.php . Если коротко — YTM можно не только дисконтированием считать.
avatar

Читайте на SMART-LAB:
Фото
Газета «Коммерсант» выпустила тематическое приложение о страховом рынке
Много интересных материалов для тех, кто работает в отрасли и тех, кто так или иначе с ней связан. Полагаем, публикации могут быть интересны и...
Фото
Софтлайн + собственные разработки = ?
В стратегии, которую мы представили рынку в 2023 году, одним из главных приоритетов было развитие собственных решений. Они более прибыльные для...
Фото
Холдинг SFI закрыл сделку по продаже ЛК «Европлан» Альфа-Банку
Альфа-Банк приобрел 87,5% ПАО «ЛК «Европлан», крупнейшего независимого оператора на российском рынке лизинга, у инвестиционного холдинга SFI....
Фото
Какая доходность среди облигаций с наивысшим рейтингом надежности и сроком погашения от 3 лет?

теги блога Ride_The_Market_Wave

....все тэги



UPDONW
Новый дизайн