$SU26225RMFS1 макрос в эксплуатацию для подробного расчета дохода облигации
Function CalculateYTM(Price As Double, FaceValue As Double, Coupon As Double, Years As Double, PaymentsPerYear As Double) As Double
' Функция для расчета доходности к погашению
Dim CashFlows() As Double
Dim i As Integer
Dim n As Integer
Dim guess As Double
Dim YTM As Double
n = Years * PaymentsPerYear
ReDim CashFlows(0 To n)
' Первый поток - цена покупки (отрицательный)
CashFlows(0) = -Price
' Промежуточные потоки - купонные выплаты
For i = 1 To n - 1
CashFlows(i) = Coupon
Next i
' Последний поток - купон + номинал
CashFlows(n) = Coupon + FaceValue
' Начальное предположение для расчета
guess = 0.1 ' 10%
' Расчет IRR (внутренней нормы доходности)
YTM = Application.WorksheetFunction.IRR(CashFlows, guess) * PaymentsPerYear
CalculateYTM = YTM
End Function
Sub CompareBonds()
' Основная процедура для сравнения облигаций
Dim ws As Worksheet
Set ws = ActiveSheet
' Заголовки
ws.Cells(1, 1) = "Параметр"
ws.Cells(1, 2) = "Облигация 1"
ws.Cells(1, 3) = "Облигация 2"
' Названия параметров
ws.Cells(2, 1) = "Цена покупки"
ws.Cells(3, 1) = "Номинал"
ws.Cells(4, 1) = "Срок до погашения (лет)"
ws.Cells(5, 1) = "Купон за полгода"
ws.Cells(6, 1) = "Годовой купон"
ws.Cells(7, 1) = "Купонная ставка (%)"
ws.Cells(8, 1) = "Доходность к погашению (%)"
ws.Cells(9, 1) = "Дисконт"
ws.Cells(10, 1) = "Выгоднее"
' Данные для облигации 1 (из твоего примера)
ws.Cells(2, 2) = 886
ws.Cells(3, 2) = 1000
ws.Cells(4, 2) = 14.5
ws.Cells(5, 2) = 61.08
ws.Cells(6, 2) = "=B5*2"
ws.Cells(7, 2) = "=B6/B3*100"
ws.Cells(8, 2) = "=CalculateYTM(B2,B3,B5,B4,2)*100"
ws.Cells(9, 2) = "=B3-B2"
' Данные для облигации 2 (из твоего примера)
ws.Cells(2, 3) = 579
ws.Cells(3, 3) = 1000
ws.Cells(4, 3) = 14.5 ' Уточни этот параметр!
ws.Cells(5, 3) = 35.4
ws.Cells(6, 3) = "=C5*2"
ws.Cells(7, 3) = "=C6/C3*100"
ws.Cells(8, 3) = "=CalculateYTM(C2,C3,C5,C4,2)*100"
ws.Cells(9, 3) = "=C3-C2"
' Определение какая облигация выгоднее
ws.Cells(10, 2) = "=IF(B8>C8,""ДА"",""НЕТ"")"
ws.Cells(10, 3) = "=IF(C8>B8,""ДА"",""НЕТ"")"
' Форматирование
ws.Columns("A:C").AutoFit
ws.Range("B2:C9").NumberFormat = "0.00"
ws.Range("B8:C8").NumberFormat = "0.00%"
ws.Range("B7:C7").NumberFormat = "0.00%"
MsgBox "Расчет завершен! Проверь срок погашения второй облигации в ячейке C4."
End Sub
Sub ClearBondData()
' Очистка данных
Dim ws As Worksheet
Set ws = ActiveSheet
ws.Range("A1:C10").ClearContents
End Sub