我有这个函数来计算非定期现金流的内部收益率。
xirr <- function(cf, t) {
npv <- function(cf, t, r) sum(cf/((r)^(t/365.25)))
irr <- uniroot(f=npv, interval=c(0,10), cf=cf, t=t, maxiter=100)$root - 1
return(irr)
}
问题是,如果现金流量的回报小于-100%,则不满足该公式的数学假设。即使没有满足这些假设,我也需要函数NOT STOP(抛出错误)。当发生这种情况时,我需要它返回0或其他东西。目前..
mycashflow <- c(2000, 2000, 3000,4000, -10000)
mydates <-as.integer( c(0,101,200,300,400))
xirr(mycashflow, mydates)
..它抛出错误:
Error in uniroot(f = npv, interval = c(0, 10), cf = cf, t = t, maxiter = 100) :
f.lower = f(lower) is NA
答案 0 :(得分:4)
尝试捕获错误并直接返回:
xirr <- function(cf, t) {
npv <- function(cf, t, r) sum(cf/((r)^(t/365.25)))
tryCatch(
irr <- uniroot(f=npv, interval=c(0,10), cf=cf, t=t, maxiter=100)$root - 1,
error=return(0)
)
return(irr)
}
答案 1 :(得分:2)
你可以尝试:
irr <- NA
try(irr <- uniroot(f=npv, interval=c(0,10), cf=cf, t=t, maxiter=100)$root - 1, silent=T)
if(is.na(irr)) irr <- 0
如果uniroot功能失败,将尝试计算irr并将其指定为0。
答案 2 :(得分:0)
问题在于使用 uniroot 本身来查找IRR。您将固定间隔0%和1000%之间的解决方案限制
如果您编写代码来查找XIRR而不是依靠内置函数来查找不规则现金流的内部收益率,那会更好
在阅读OP的评论后,我正在编辑此回复以显示为什么您不需要指定查找根的下限和上限。
f(i) = 2000 + 2000(1+i)^-0.277 + 3000(1+i)^-0.548 + 4000(1+i)^-0.822 - 10000(1+i)^-1.096
f'(i) = - 553.425(1+i)^-1.277 - 1(1+i)^-1.548 - 3(1+i)^-1.822 + 10(1+i)^-2.096
i(N-1) ############## f(x) ############# f'(x) ############ i(N-1) - f(x)/f'(x)
0 ################### 1000 ############# 5473.97260274 #### -0.182682682683
-0.182682682683 #### -287.317250921 #### 9015.5263858 ##### -0.150813522899
-0.150813522899 #### -13.1104684396 ##### 8209.8448578 #### -0.149216602535
-0.149216602535 #### -0.0301760416678 ### 8172.09143372 ### -0.149212909962
-0.149212909962 #### -1.60673153005E-7 ## 8172.00440952 ### -0.149212909943
IRR = -14.921%
如您所见,XIRR计算不会使用任何特定的时间间隔来定位或查找函数的根。