sábado, 11 de mayo de 2019

Cálculo de la TIR (Tasa Interna de Rentabilidad) en Python

Vamos a calcular la TIR que es la Tasa Interna de Rentabilidad o también denominada Tasa Interna de Retorno. En inglés se denomina IRR (Internal Rate of Return). La TIR nos proporciona la rentabilidad que proporciona una inversión financiera. Habitualmente existe un flujo de caja negativo en t=0 y luego una serie de flujos de caja en los periodos t=1 hasta t=n. Si los flujos de caja son de periodicidad anual la TIR obtenida será directamente un tanto anual, si la periodicidad de los flujos de caja es diferente a la anual, por ejemplo mensual, la TIR que se obtiene será la expresada en esa unidad temporal y tendremos que posteriormente anualizarla, ya que el concepto de TIR hace referencia a un tanto anual efectivo.

Veamos varios método para programar la TIR en Python.

Método 1

Cargamos la librería numPy y alimentamos la función irr con los flujos de caja de la inversión. Si en un momento dado no existiera flujo de caja se tendría que indicar poniendo cero. El resultdo obtenido vendrá dado en tanto por uno.
import numpy as np
flujos=[-4000,1400,1300,1200,1100,1000]
print (round(np.irr(flujos), 5))
El resultado es la TIR de la inversión expresada en tanto por uno 0.16289 que equivale a un 16,289%
anual, suponiendo que los flujos de caja se dieron con periodicidad anual.

Método 2

Programando la TIR mediante un algoritmo que calcula los puntos de corte con el eje de abcisas. Puesto que la TIR se define como aquel tipo de interés que hace el VAN igual a cero, lo que tenemos que hacer es calcular el punto de corte con el eje horizontal en el gráfico del VAN (Valor Actual Neto).

Para hacer este cálculo utilizamos un algoritmo de cálculo numérico por aproximaciones sucesivas. Partimos de una tasa de interés inferior muy baja ka=-0,5 que es negativa del 50%, y partimos de una tasa de interés superior muy alta kc=10 que supone una tasa positiva del 1.000%. Este algoritmo calculará la TIR de la inversión proporcionada si está comprendida entre ka y kc. Si está fuera de este rango responderá con el texto 'sin TIR'.
Calculamos un valor inferior para el VAN que denominamos inf y que se obtiene calculando el VAN a una tasa ka=-50%.
Calculamos un valor superior para el VAN que denominamos sup y que se obtiene calculando el VAN a una tasa kc=1000%.
El VAN inferiro, inf, seguramente salga negativo, y el VAN superior, sup, seguramente saldrá positivo. Bajo este supuesto es sobre el que nuestro algoritmo trabajará ya que si esto es así quiere decir que existirá un VAN que saldrá igual a cero a una cierta tasa de descuento, que será la TIR de la operación.
Lo que hacemos ahora es calcular la media aritmética entre ka y kc. A esa semisuma la denominamos kb.
kb=(ka+kc)/2

  • Calculamos el VAN al nuevo tipo kb y si es negativo eso indicará que la TIR es menor que kb y por lo tanto para un nuevo ciclo del bucle haremos que rc sea igual a kb. Graficamente lo que ha sucedido es que kb es una tasa que obtiene un VAN negativo por lo que la TIR buscada estará a su izquierda.
  • Si el VAN obtenido al nuevo tipo kb es positivo eso indicará que la TIR es mayor que kb y por lo tanto para un nuevo ciclo del bucle haremos que ra sea igual a kb. Graficamente lo que ha sucedido es que kb es una tasa que obtiene un VAN positivo por lo que la TIR buscada estará a su derecha.
De esta forma iremos acotando el valor de la TIR por la derecha y por la izquierda hasta que consideremos que el error comentido en el VAN por ambos lados es inferior a un cierto valor suficientemente pequeño.

Cuando el error es despreciable (inferior a 10-10) detenemos el bucle e imprimimos la TIR redondeando y expresada en porcentaje.

#La lista flujos incluye el desembolso inicial
def VAN(tasa,flujos):
  VA=0
  for j in range(len(flujos)):
    VA+=flujos[j]/(1+tasa)**j
  return VA

#print('VAN=',VAN(0.05,[-4000,1400,1300,1200,1100]))

def TIR(flujos):
  ka=-.5 #tasa de descuento inferior. Inicialmente -50%
  kc=10 #tasa de descuento superior. Inicialmente 1000%
  inf=VAN(ka,flujos) #VAN calculado con la tasa inferior
  sup=VAN(kc,flujos) #VAN calculado con la tasa superior
  if inf>=0 and sup<0:
    error=abs(inf-sup)
    while error>=1e-10:
      kb=(ka+kc)/2
      #print(kb)
      med=VAN(kb,flujos)
      if med<=0:
        kc=kb
      elif med>0:
        ka=kb
      inf=VAN(ka,flujos)
      sup=VAN(kc,flujos)
      error=inf-sup
    return kb
  else:
    return "sin TIR"

misFlujos1=[-4000,1400,1300,1200,1100]
misFlujos2=[-5000,1500,1600,1700,1800,1900]
print('TIR=',str(round(TIR(misFlujos2)*100,8))+'%')