Как дисконтировать денежные потоки с переменными ставками дисконтирования и суммировать все денежные потоки - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь оценить облигацию, которая будет выплачивать купоны (c) раз в полгода в течение 4 лет (что означает 8 выплат по купонам) и вернуть основную сумму (p) вместе с 8-м платежом (c + p) , Ставка дисконтирования (dr) для дисконтирования каждого денежного потока будет различной.

входные данные:

dr = [0,10, 0,12, 0,15, 0,22, 0,37, 0,6, 0,8, 0,85] , p = 1000, c = 2, T = 4, freq = 2

Я нашел приведенный ниже код в stackoverflow, но он не использует разные 'dr' для дисконтирования каждого денежного потока, а также делает Не суммируйте все денежные потоки после дисконтирования. Может кто-нибудь, пожалуйста, помогите? '' '

par = 1000
coupon_rate = 3
T = 5
freq = 2


def cf_calculator(par, r, T, freq):
    for i in range(0,(T * freq)+1):
        if i < (T * freq):
            coupon = ((r/100) * par) / freq
            print(coupon)
        else: 
            coupon = (((r/100) * par) / freq) + par
            print(coupon)

print(cf_calculator(par,coupon_rate,T,freq))

' ''

Bond CF для l oop и, если еще l oop

1 Ответ

0 голосов
/ 27 апреля 2020

Я старался максимально избегать циклов:

p = 1000
c = 2 
T = 4
freq = 2
dr = [0.10, 0.12, 0.15, 0.22, 0.37, 0.6, 0.8, 0.85]

import numpy as np
cashflows = np.dot(p,[(c/100 + (i==freq*T-1)) for i in range(freq*T) ])
print(cashflows)

dcf = sum([cf[0]/((1+cf[1])**(i+1)) for i,cf in enumerate(zip(cashflows,dr))])
print(dcf)

Вывод:

[20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 1020.0]
69.40091054501804

Надеюсь, математика верна. И код предполагает, что длина списка dr равна T*freq. Для кода уровня производства вам может понадобиться добавить try, кроме блоков, проверяя предположение, упомянутое выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...