计算给定目标 IRR 的现金流量

问题描述 投票:0回答:3

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

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

  • 我拥有价值 18,000,000 美元的资产(每年贬值 1,000,000 美元)
  • 我的目标 IRR 是 5 年后 10%
  • 这意味着初始投资为 18,000,000 美元,在第 5 年,我将以 13,000,000 美元的价格出售该资产
  • 要达到 10% 的目标 IRR,年度现金流量必须为 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% 的误差范围内,因为我们正在处理的数字有数亿。

ruby math finance
3个回答
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
投票

Ruby 中有一个名为

Newton
的模块...它使用 Newton Raphson 方法。

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

https://github.com/Noverde/exonio

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

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

0
投票

本例中的 sn 是什么意思?

© www.soinside.com 2019 - 2024. All rights reserved.