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% 的值非常接近。