债券优惠券折扣循环

时间:2020-03-10 20:46:56

标签: python finance

有关如何编写for循环以给我所有优惠券的现值(即折现值)的快速问题。我的代码如下:

我想要一个for循环来执行操作

c[0]*np.exp(-r*1)
c[1]*np.exp(-r*2)
c[2]*np.exp(-r*3) 

,依此类推(数字-r始终是索引+1)。 我想要所有值的总和,例如使用x + = for循环迭代

c=[7.5, 7.5, 7.5, 7.5, 7.5, 7.5, 7.5]
r=0.071
PVx=0 

for i in c:
    print(i)
    year = c.index(i)+1
    print(year)
    PV=c[i]*np.exp(-r*year)
    PVx += PV 
    print(PVx)

以某种方式,我的PV变量收到错误代码“ TypeError:列表索引必须是整数或切片,而不是浮点数”。 本质上,我想让列表中的每个值都乘以np.exp(-r *索引位置+1),然后求和:S

编辑:

我的新代码

import numpy as np
c=[7.5, 7.5, 7.5, 7.5, 7.5, 7.5, 7.5]
r=0.071
PVx=0 

for i in c:
    year = c.index(i)+1
    print(year)
    PV=i*np.exp(-r*year)
    PVx += PV
    print(PVx)

将年份保留为1(意味着c.index(i)的结果为0 +1 = 1),而我希望它从1变为7。我想这是我的问题。

2 个答案:

答案 0 :(得分:0)

该错误说明了问题:“ TypeError: list indices must be integers or slices, not float”浮点数是一个带小数的数字,即不是整数。例如7.5。那是你的问题。

答案 1 :(得分:0)

我的新代码[...]继续将年份打印为1(意味着c.index(i)产生0 +1 = 1),而我希望它将从1变为7。 em>

df2 = 'a' 'b' 'c' 'd' 6 1 2 0 0 7 0 0 0 0 8 3 0 0 0 and df3 = 'a' 'b' 'c' 'd' 6 0 0 0 0 7 0 0 0 0 8 0 0 0 0 返回出现list.index(i)的第一个索引;如果列表中没有i,则返回-1。


NumPy解决方案:

i

输出:

import numpy as np

r = 0.071

arr_1 = np.full(shape=7, fill_value=7.5)
print(arr_1)

arr_2 = np.exp(-r * np.arange(1, arr_1.shape[0] + 1))
print(arr_2)

arr_3 = arr_1 * arr_2
print(arr_3)
print(arr_3.sum())

循环解决方案:

[7.5 7.5 7.5 7.5 7.5 7.5 7.5]
[0.93146189 0.86762126 0.80815614 0.75276664 0.70117344 0.65311634
 0.60835298]
[6.98596419 6.50715942 6.06117103 5.64574984 5.25880082 4.89837257
 4.56264738]
39.919865247574606

输出:

import math
from pprint import pprint

r = 0.071

vals = [7.5 * math.exp(-r * i) for i in range(1, 8)]

pprint(vals)
pprint(sum(vals))

我不能完全确定我了解您要做什么,所以请让我知道我是否有任何遗漏。