计算目标IRR的现金流量

时间:2013-12-06 21:56:37

标签: ruby math finance

如果这个问题的答案已经存在,我道歉,我现在已经搜索了几个小时,但我找不到我要找的东西。

我正在建立一个简单的金融计算器来计算给定目标IRR的现金流量。例如:

  • 我有一笔价值18,000,000美元的资产(折旧价为1,000,000美元/年)
  • 5年后我的目标IRR为10%
  • 这意味着初始投资为18,000,000美元,而在第5年,我将以13,000,000美元的价格出售该资产
  • 要达到10%的目标内部收益率,年度现金流量必须为2,618,875美元。现在,我通过猜测和检查在Excel表格中手动计算。

还有其他变量和功能,但它们对我在这里要做的事情并不重要。我发现有很多库和函数可以计算给定数量现金流的内部收益率,但是当我试图获得给定内部收益率的现金流量时,没有任何内容出现。

此时,我认为唯一的解决方案是基本上运行一个循环来插入值,检查IRR是否高于或低于目标IRR,并继续计算IRR直到我得到现金流我想要的。

这是解决这一特定问题的最佳方法吗?还是有一种更好的解决方法,我错过了?非常感谢!

另外,作为一个FYI,我在Ruby on Rails中构建它。

修改

IRR功能:

NPV = - (I)+ CF [1] /(1 + R)^ 1 + CF [2] /(1 + R)^ 2 + ... + CF [n] /(1 + R) ^ N

NPV =净现值(此值必须尽可能接近0)

I =初始投资(在此示例中为18,000,000美元)

CF =现金流(这是我试图计算的价值 - 如果我手工计算它最终会达到2,618,875美元。在我的金融计算器中,所有的现金流量都是相同的,因为我是为他们解决问题。)

R =目标回报率(10%)

n =年份(所以这个例子将在5年结束)

我正在尝试将现金流量计算在.005%误差范围内,因为我们正在使用的数字是数亿。

2 个答案:

答案 0 :(得分:3)

v0 = initial value
vn = value after n periods
n  = number of periods
r  = annual rate of return
y  = required annual net income

一期贴现因子是:

j = 1/(1+r)

投资的现值是:

pv = - v0 + j*y  + j^2*y + j^3*y +..+ j^n*y + j^n*vn
   = - v0 + y*(j + j^2   + j^3   +..+ j^n)  + j^n*vn
   = - v0 + y*sn + j^n*vn

,其中

sn = j + j^2 + j^3 + j^4 +..+ j^n

我们可以按如下方式计算sn

sn       = j + j^2 + j^3 + j^4 +..+ j^n
j*sn     =     j^2 + j^3 + j^4 +..+ j^n + j^(n+1)
sn -j*sn = j*(1 - j^n)
sn       = j*(1 - j^n)/(1-j)
         = (1 - j^n)/[(1+r)(r/(1+r)]
         = (1 - j^n)/r  

设置pv = 0并解析y

y*sn =  v0 - vn * j^n   
y    = (v0 - vn * j^n)/sn
     =  r * (v0 - vn * j^n)/(1 - j^n)

我们的Ruby方法:

def ann_ret(v0, vn, n, r)
  j = 1/(1+r)
  (r * (v0 - vn * j**n)/(1 - j**n)).round(2)
end

年度复合:

ann_ret(18000000, 13000000, 5, 0.1)       # => 2618987.4

半年复合:

2 * ann_ret(18000000, 13000000, 10, 0.05) # => 2595045.75

每日复合:

365 * ann_ret(18000000, 13000000, 5*365, 0.10/365) # => 2570881.20 

这些值与您计算的所需年度回报略有不同。您应该能够通过比较现值公式来解释差异。

答案 1 :(得分:1)

Ruby中有一个名为Newton的模块......它使用Newton Raphson方法。

我一直在使用这个模块在这个库中实现IRR功能:

https://github.com/Noverde/exonio

如果您需要IRR,可以这样使用:

Exonio.irr([-100, 39, 59, 55, 20]) # ==> 0.28095