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.
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))+'%')
Buen día, como se podría obtener el calculo de la TIR y el VPN para flujos de efectivo no periódicos, es decir cada medio año durante "n" años! ?
ResponderEliminarMuchas gracias, me ha servido mucho para poder implementar el cálculo de la TIR en MariaDB, tu algoritmo fue la base, te lo agradezco.
ResponderEliminarSaludos