2011-07-31 71 views
6

ActiveState Recipes網站有Python實現Internal Rate of Return功能:這種實施IRR的數值方法是什麼?

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檢查了幾個例子),但我想知道爲什麼

  • 它似乎不是牛頓方法(無導數)或分數方法(只跟蹤一次迭代)的實現。
  • 特別是,將投資變量定義爲第一個現金流元素(以及它的後續使用)使我感到困惑。

任何想法?

回答

4

該方法被稱爲定點迭代;例如參見維基百科文章http://en.wikipedia.org/wiki/Fixed_point_iteration

的想法是,如果rate包含正確的值(即,內部收益率),則淨現值爲零,這樣的聲明

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

不會改變rate。因此,一旦找到IRR,迭代不會改變它。定點迭代有時會收斂到正確的值,有時它不會。 @Gareth和@unutbu的例子表明,它並不總是收斂。

收斂的標準如下。寫在循環的更新語句作爲

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

現在,如果右側相對於所述衍生物rate爲1和-1之間,則該方法收斂。我不能立即看到在什麼情況下這種情況。

你也許會奇怪,爲什麼迭代沒有做

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

而不怪異investment變量。事實上,我也想知道這一點。如果導數條件得到滿足,這也將是一個收斂於IRR的固定點方法。我的猜測是,在某些情況下,對於您提供的方法,派生條件得到滿足,而對於沒有investment的方法則不滿足。

3

對我來說這似乎是虛假的。收斂速度太慢,不適於實際應用。

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

對我來說這似乎也是假的。

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

我想你正在等待答案-0.5。 (0.5將是現金流量的內部收益率[-100,150])。但是無論如何都是假的! –

+0

@Gareth Rees:對,謝謝。 – unutbu