11

是否有任何可用的 R 包具有某种形式的功能,可以根据特定日期的不均匀付款来计算 IRR,以进行一次性分配。

例子:

df <- data.frame(date = c(as.Date("2010-1-24"), as.Date("2011-5-6"), as.Date("2012-3-24")), pmts=c(-2000,-1000,-800))
today <- as.Date("2012-7-25")
lumpsum <- 4580

我正在寻找一种简单的方法来计算今天收到的 4580 美元的回报率,以换取上面定义的付款时间表。

提前致谢,--JT

4

3 回答 3

10

正如评论中已经指出的那样,写一些简单的东西会更容易:

NPV<-function(paym,pdates,IRR){
   ptimes<-as.Date(pdates)-min(as.Date(pdates))
   ptimes<-as.numeric(ptimes,units="days")/365.25
   NPV<-sum(paym*(1+IRR)^{-ptimes})
   NPV
}

nlm(function(p){NPV(c(lumpsum,df$pmts),c(today,df$date),p)^2},p=0.1)

内部收益率为 11.26%

编辑:

lifecontingencies如果您想使用它来代替,在对包装进行快速侦察之后,它具有现值功能。

library(lifecontingencies)
capitals<-c(lumpsum,df$pmts)
times<-c(today,df$date)
times<-as.Date(times)-min(as.Date(times))
times<-as.numeric(times,units="days")/365.25
presentValue(cashFlows=capitals, timeIds=times,interestRates=0.03)
nlm(function(p){presentValue(capitals,times,p)^2},p=0.1)
于 2012-07-26T05:54:52.230 回答
7

利用“stats”包的uniroot函数IRR可以编码如下:

   cf <- c(-10000, 1300, -1200, 12000) 
   npv <- function(i, cf, t=seq(along=cf)) sum(cf/(1+i)^t) 
   irr <- function(cf) { uniroot(npv, c(0,1), cf=cf)$root } 
   irr(cf)
   [1] 0.0686
   irrinpercent<- irr(cf)*100
   [1] 6.86
于 2013-03-15T17:37:33.940 回答
1

pmr 从他的代码示例中的一个很好的答案开始。谢谢!

然而,我对该代码的问题是,问题(也是我的需要)是在现金流具有任意时间时计算 IRR。pmr 的代码需要修改以使 irr 函数将时间向量 t 作为参数,就像他的 npv 函数一样。

为了明确这一点,我对该代码的改编是:

# Returns the Internal Rate of Return.
# See: https://www.investopedia.com/terms/i/irr.asp
irr = function(t, cf) {
    uniroot(f = npv, interval = c(0, 1), t = t, cf = cf)$root
}

# Returns the Net Present Value.
# See: https://www.investopedia.com/terms/n/npv.asp
npv = function(t, cf, i) {
    sum( cf / (1 + i)^t )
}

请注意,我更改了 arg 顺序(例如 t first)。此外,t 没有默认值,但如果您想要一个偶数序列,我认为landroni 的评论是正确的:您投资的初始资本是在时间 = 0,而不是 1,正如 irr 函数上方的投资百科链接中清楚的那样.

以下是如何使用我遇到的那些功能的示例。我获得了投资 ATM 网络的机会。这些具有很高的年回报率(每月支付),但也是一种快速贬值的资产(最终清算时可能会出现您本金的 2%)。

在首先定义上述函数后执行以下代码。

# parameters:
numYears = 7
capitalInvest = 52000
retAnnual = 0.245
capitalLiquidation = 700

# convert yearly values to mpnthly:
numMonths = numYears * 12
retMonthly = retAnnual / 12    # assumes no compounding

# initialize the time to 0 and the cash flow to capital SPENT (so negative):
t = 0
cf = -capitalInvest

# add monthly returns:
for (m in 1:numMonths) {
    t = c(t, m / 12)    # divide the time by 12 to have units of year
    cf = c(cf, retMonthly * capitalInvest)
}

# add liquidation value also on the final year:
t = c(t, numMonths / 12)    # divide the time by 12 to have units of year
cf = c(cf, capitalLiquidation)

# calculate the IRR:
irr(t, cf)

该代码返回的值为 0.1852015 ~= 18.5%,这与操作员引用我的 18.6% 的值非常接近。

于 2020-06-30T23:00:02.867 回答