内部收益率的实现采用了什么样的数值方法?

2024-06-07 16:35:14 发布

您现在位置:Python中文网/ 问答频道 /正文

ActiveState Recipes站点有一个在Python中实现Internal Rate of Return的函数:

def irr(cashflows, iterations=100):
    """The IRR or Internal Rate of Return is the annualized effective 
       compounded return rate which can be earned on the invested 
       capital, i.e., the yield on the investment.

       >>> irr([-100.0, 60.0, 60.0, 60.0])
       0.36309653947517645
    """
    rate = 1.0
    investment = cashflows[0]
    for i in range(1, iterations+1):
        rate *= (1 - npv(rate, cashflows) / investment)
    return rate

这段代码返回正确的值(至少对于我在Excel上检查过的几个示例),但是我想知道为什么为什么。在

  • 它似乎不是牛顿法(无导数)或割线法(只跟踪一次迭代)的实现。在
  • 尤其是,将投资变量定义为第一个现金流元素(以及它的后续用途)让我感到困惑。在

有什么想法吗?在


Tags: ofthereturnrate站点oninternalrecipes
3条回答

在我看来也是假的。在

>>> irr([-100,50],100000)  # expecting answer -0.5
0.0

该方法称为定点迭代;例如,请参阅维基百科文章http://en.wikipedia.org/wiki/Fixed_point_iteration。在

其思想是,如果rate包含正确的值(即IRR),那么NPV为零,因此

rate *= (1 - npv(rate, cashflows) / investment)

不会更改rate。因此,一旦找到IRR,迭代将不会改变它。不动点迭代有时收敛到正确的值,有时不收敛。@Gareth和@unutbu的例子表明,在这里它并不总是收敛的。在

收敛的标准如下。在循环中编写update语句

^{pr2}$

现在,如果右边对rate的导数在1和-1之间,那么该方法就会收敛。我不知道在什么情况下会发生这种情况。在

您可能想知道为什么迭代没有做到

rate *= (1 - npv(rate, cashflows))

没有奇怪的investment变量。实际上,我也在想,如果导数条件满足,这也是一种不动点方法,它会收敛到IRR。我的猜测是,对于您给出的方法,导数条件在某些情况下是满足的,而对于没有investment的方法则不是。在

在我看来这是假的。收敛速度太慢,无法实际应用。在

>>> irr([-100, 100]) # expecting answer 0
0.00990099009900991

相关问题 更多 >

    热门问题