2011-07-31 11 views
6

El sitio de ActiveState Recipes tiene una función de la implementación de Internal Rate of Return en Python:¿Cuál es el método numérico utilizado en esta implementación de 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 

Este código devuelve valores correctos (al menos por el par de ejemplos que he comprobado en contra de Excel), pero me gustaría saber qué .

  • No parece ser una implementación del Método de Newton (sin derivada) o el Método Secante (solo realiza un seguimiento de una iteración).
  • En particular, la definición de la variable de inversión como el primer elemento de flujo de efectivo (y su uso posterior) me confunde.

¿Alguna idea?

Respuesta

4

El método se llama iteración de punto fijo; ver por ejemplo el artículo de Wikipedia http://en.wikipedia.org/wiki/Fixed_point_iteration.

La idea es que si rate contiene el valor correcto (es decir, la TIR), entonces el VPN es cero, por lo que la declaración

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

no va a cambiar rate. Por lo tanto, una vez que encuentre el IRR, la iteración no lo cambiará. La iteración de punto fijo algunas veces converge al valor correcto y otras no. Los ejemplos de @Gareth y @unutbu muestran que aquí no siempre convergen.

El criterio para la convergencia es el siguiente. Escribir la instrucción de actualización en el bucle como

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

Ahora, si la derivada de la parte derecha con respecto a rate está entre 1 y -1, entonces el método converge. No puedo ver de inmediato en qué circunstancias es este el caso.

Usted puede preguntarse por qué la iteración no hace

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

sin la variable de investment raro. De hecho, me preguntaba lo mismo; ese también sería un método de punto fijo que converge al IRR si se cumple la condición derivada. Mi suposición es que la condición derivativa se cumple en algunas circunstancias para el método que usted dio, y no para el método sin investment.

3

Parece falso para mí. La convergencia es demasiado lenta para el uso práctico.

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

Me parece falso, también.

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

Creo que espera la respuesta -0.5. (0.5 sería la TIR para los flujos de caja [-100, 150]). ¡Pero falsa en cualquier caso! –

+0

@Gareth Rees: Correcto, gracias. – unutbu

Cuestiones relacionadas