如何使用可变贴现率贴现现金流,并将所有现金流相加

2024-06-26 14:33:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图为一种债券定价,这种债券将每半年支付一次息票(c),为期4年(即总共支付8次息票),并在第8次支付(c+p)的同时返还本金(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 for loop and if else loop


Tags: loopforifratecalculatorelsecfprint
1条回答
网友
1楼 · 发布于 2024-06-26 14:33:02

我已尽可能避免循环:

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-except块,检查上述假设

相关问题 更多 >