【问题标题】:Calculate cash flows given a target IRR计算给定目标 IRR 的现金流
【发布时间】:2013-12-06 21:56:37
【问题描述】:

如果这个问题的答案已经在某个地方,我深表歉意,我已经搜索了几个小时,但找不到我要找的东西。

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

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

还有其他变量和功能,但它们对于我在这里尝试做的事情并不重要。我发现很多库和函数可以计算给定数量现金流的 IRR,但是当我尝试获取给定 IRR 的现金流时却没有任何结果。

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

这是解决这个特定问题的最佳方法吗?还是有更好的方法来解决我错过的问题?非常感谢您的帮助!

另外,作为一个仅供参考,我正在用 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 结束)

我试图将现金流量计算在 0.005% 的误差范围内,因为我们处理的数字是数亿。

【问题讨论】:

  • 听起来像是 Newton-Raphson 的应用。您能否提供一个与这些变量相关的封闭式公式?我知道所需的值将是公式中的变量之一。
  • 这不是编程问题,而是数学问题。取方程并求解未知变量。然后将生成的公式实现为 Ruby 代码。
  • 我刚刚添加了带有解释变量的公式。刚刚查找了一些 IRR 的 Newton-Raphson 实现,我找到了this example on Google Code。唯一的问题是,这与其他实现一样,使现金流成为强制性输入。想法?感谢您的帮助!
  • 啊。刚看了一眼,发现我是个白痴。这比我最初想象的要简单得多。我想我只需要离开这个问题一分钟。谢谢大家的帮助!

标签: ruby math finance


【解决方案1】:

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 

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

【讨论】:

    【解决方案2】:

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

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

    https://github.com/Noverde/exonio

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-21
      • 2023-02-09
      相关资源
      最近更新 更多