Я старался максимально избегать циклов:
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, кроме блоков, проверяя предположение, упомянутое выше.