Если вы действительно хотите рассчитать только чистую приведенную стоимость (== внутренний продукт векторов для денежных потоков и коэффициентов дисконтирования) и внутреннюю норму прибыли (== простой итеративный поиск в корне для одной переменной), тогда вы можете просто закодировать вверх.
Я использую R гораздо больше, чем Python, поэтому вот решение R:
R> data <- data.frame(CF=c(rep(2,5), 102), df=1.01^(-(1:6)))
R> data
CF df
1 2 0.9901
2 2 0.9803
3 2 0.9706
4 2 0.9610
5 2 0.9515
6 102 0.9420
R> NPV <- sum(data[,1] * data[,2])
R> print(NPV)
[1] 105.8
R>
Это устанавливает двухстолбцовую структуру данных о денежных потоках и коэффициентах дисконтирования и вычисляет NPV как сумму продуктов. Таким образом, (упрощенная) шестилетняя облигация с 2-процентным купоном в 1-процентной кривой доходности будет стоить 105,80.
Для IRR мы делаем примерно то же самое, но делаем NPV функцией функции скорости:
R> irrSearch <- function(rate) { data <- data.frame(CF=c(rep(2,5), 102),
df=(1+rate/100)^(-(1:6)));
100 - sum(data[,1] * data[,2]) }
R> uniroot( irrSearch, c(0.01,5) )
R> irr <- uniroot( irrSearch, c(0.01,5) )
R> irr$root
[1] 2
R>
Таким образом, «корень» поиска внутренней нормы доходности 2% облигаций в мире с плоской кривой ... неудивительно, что 2%.