我应该指出,即使是公认的答案后,你的功能似乎包含一个小错误:
npv<-function(i,cf,t=seq(along=cf)) sum (cf/(1+i)^t)
irr <- function(cf) {
if(all(cf < 0)) return(0)
uniroot(npv, c(0,1), cf=cf)$root
}
哪些考虑这个例子:
> npv(c(-123400, 36200, 54800, 48100), i = 0.025)
[1] 8528.911
的问题是,对于违约t=seq(along=cf)
将使您的现金流量折扣1:4
。由于-123400
的初始现金流出通常被认为是PV,因此您最终不再同意折扣。
这应该解决的事情:
npv<-function(i,cf,t=seq(along=cf)-1) sum (cf/(1+i)^t)
给你这个:
> npv(c(-123400, 36200, 54800, 48100), i = 0.025)
[1] 8742.134
但一般来说,我会用financial
或FinCal
计算IRR或NPV(或MIRR):
> require(financial)
> cf(c(-123400, 36200, 54800, 48100), i = 2.5)
Cash Flow Model
Flows:
1 2 3 4
-123400 36200 54800 48100
IRR%: 5.96
NPV Extremes at I%:
I% NPV NFV NUS
1 2.5 8742.13 9414.32 3060.95
> require(FinCal)
> npv(c(-123400, 36200, 54800, 48100), r = 0.025)
[1] 8742.134
> irr(c(-123400, 36200, 54800, 48100))
[1] 0.05959787