我正在尝试为一种债券定价,该债券将在4年内每半年支付一次息票(c((意味着总共支付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))
''
为环路和其他环路绑定CF
我尽量避免循环:
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
我希望数学是正确的。并且该代码假定列表CCD_ 1的长度等于CCD_。对于生产级别的代码,您可能需要添加try-except块,检查上面提到的假设。