2011-07-31 14 views
6

Witryna ActiveState Recipes posiada funkcję wykonawczą Internal Rate of Return w Pythonie:Jaka jest metoda numeryczna stosowana w tej implementacji 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 

Ten kod zwraca poprawne wartości (przynajmniej na kilka przykładów, które zostały sprawdzone przed Excel), ale chciałbym wiedzieć dlaczego .

  • Nie wydaje się być implementacją metody Newtona (bez pochodnej) lub metody Secanta (śledzenie tylko jednej iteracji).
  • W szczególności definicja zmiennej inwestycyjnej jako pierwszego elementu przepływów pieniężnych (i jego późniejszego wykorzystania) wprowadza mnie w błąd.

Wszelkie pomysły?

Odpowiedz

4

Metoda nazywana jest iteracją stałoprzecinkową; zobacz na przykład artykuł w Wikipedii http://en.wikipedia.org/wiki/Fixed_point_iteration.

Chodzi o to, że jeśli rate zawiera poprawną wartość (czyli IRR), to NPV wynosi zero, więc rachunku

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

nie zmieni rate. Tak więc, po znalezieniu IRR, iteracja go nie zmieni. Naprawiono punkt iteracji czasem zbiega się z poprawną wartością, a czasami tak nie jest. Przykłady @Gareth i @unutbu pokazują, że tutaj nie zawsze się zbiegają.

Kryterium konwergencji jest następujące. Napisać komunikatu aktualizacji w pętli jak

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

więc, jeśli pochodna z prawej strony w stosunku do rate wynosi pomiędzy 1 i -1, wówczas sposób zbieżny. Nie widzę od razu, w jakich okolicznościach tak się dzieje.

Można się zastanawiać, dlaczego nie zrobić iteracji

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

bez dziwne investment zmiennej. Rzeczywiście, zastanawiałem się to samo; byłaby to również metoda o stałym punkcie, która zbiega się z IRR, jeśli warunek pochodny jest spełniony. Domyślam się, że warunek derywacyjny jest spełniony w pewnych okolicznościach dla metody, którą podałeś, a nie dla metody bez investment.

3

Wydaje mi się to fałszywe. Konwergencja jest zbyt powolna dla praktycznego zastosowania.

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

Wydaje mi się to również fałszywe.

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

Myślę, że oczekujesz odpowiedzi -0.5. (0,5 to IRR dla przepływów pieniężnych [-100, 150].) Ale w każdym razie fałszywe! –

+0

@Gareth Rees: Dobrze, dzięki. – unutbu

Powiązane problemy