martes, 16 de abril de 2019

TIR modificada a tipo variable

Puede descargar el archivo VanTir.xlsm

Disponemos de una inversión a 20 años con flujos de caja unos positivos y otros negativos. En este caso si calculamos la TIR obtenemos un caso de TIR múltiple con tres puntos de corte en el eje de abcisas. Vea la hoja denominada 'TIR MULTIPLE'.



Podemos resolver la incoherencia que haber obtenido tres valores para la TIR utilizando la denominada TIR modificada o corregida. Consiste en descontar los flujos de caja negativos hasta el instante t=0 a cierta tasa de descuento y capitalizar los flujos de caja positivos hasta su valor final en t=n a cierta tasa de capitalización también conocida. De esta forma habremos conseguido tener únicamente dos capitales, uno inicial Co y otro final Cn. Para calcular la TIR modificada únicamente tendremos que aplicar la ley de la capitalización compuesta a esos capitales durane el número de peridos n y despejar el tipo de interés i necesario para que la ecuación se cumpla.

Esto lo podemos ver en la hoja denominada 'TIRM'.



Si deseamos calcular la TIR modificada o corregida a tipo variable tanto para la tasa de descuento como para la de capitalización seguiremos los siguientes pasos que se pueden ver en la hoja denominada 'TIRM variable'.


Pasos a seguir.
  1. En las columnas D y E separamos los flujos de caja positivos y negativos
  2. En las columnas F y G escribimos la tasa de descuento k1 y la tasa de capitalización k2 que son datos que debemos obtener.
  3. En las columnas H e I calculamos los factores 1/(1+k1) para el descuento de un periodo y (1+k2) para la capitalización de un periodo.
  4. En las columnas J y K calculamos el factor de descuento y el factor de capitalización para multiples periodos. Por ejemplo, para la cuantía que vence el sexto año, en t=6, que es de -200 € tendremos que descontarla multiplicando por el producto siguiente  =PRODUCTO($H$7:H13)
  5. Calculamos la TIRM variable en la celda K2 con la fórmula TASA siguiente   =TASA(20;;SUMAPRODUCTO(D7:D27;J7:J27);SUMAPRODUCTO(E7:E27;K7:K27))

Programación de una función

También disponemos de una función programada en código de Excel VBA que nos permite calcular la TIR modificada  usando tipos de interés variables.

Podemos verla trabajando en la celda K3.

=TIRMvariable(C7:C27;F8:F27;G8:G27)


Los argumentos son los siguientes.

=TIRMvariable(flujos de caja;rango de tasas de descuento;rango de tasas de capitalización)

Los flujos de caja son un rango que incluye el desembolso inicial. En nuestro ejemplo, es el rango C7:C27 que está compuesto por 21 celdas. La macros de la fórmula usa la variable n para calcular el número de esas celdas. En este ejemplo n será igual a 21.

n=21

Los rangos k1 y k2 son los que contienen las tasas de descuento y de capitalización respectivamente y en el ejemplo son los siguientes.


  • k1 → Rango F8:F27 → número de celdas = 20
  • k2 → Rango G8:G27 → número de celdas = 20

Observe que el número de tasas de capitalización o descuento son 20 cuando n hemos visto que es 21. Por tanto, siempre se ha de cumplir que el número de tasas de descuento o capitalización han de ser iguales a n-1.

Existe un caso de error, cuando al  indicar los argumentos de la función no se cumple que las filas del rango de k1 han de ser las mismas que las filas del rango k2 y ambas han de ser iguales al número de filas del rango que indica los flujos de caja menos uno. Cuando se produce el error la función responde con el texto "rangos no coinciden".

El código de la macro que contiene la función es la siguiente.

Function TIRMvariable(flujos As Range, k1 As Range, k2 As Range)
'k1 es el rango donde se encuentran las tasas de descuento
'k2 es el rango donde se encuentran las tasas de capitalización
Dim n As Long
Dim fDto As Double 'factor de capitalización
Dim fCap As Double 'factor de descuento
Dim VA As Double 'Valor Actual
Dim VF As Double 'Valor Final
'n = nº de celdas que contienen los flujos de caja incluido el desembolso inicial
n = flujos.Rows.Count
VA = flujos(1) 'inicializamos el VA con el desembolso inicial
VF = 0 'inicializamos el VF a cero
'pedimos que el rango de los flujos de caja tenga una celda más que
'los rangos de las tasas de descuento y capitalización
If n = k1.Rows.Count + 1 And n = k2.Rows.Count + 1 Then
    fDto = 1 'inicialmente el factor de descuento es 1
    For i = 2 To n 'comienza en 2 porque i=1 ya se recogió con el desembolso inicial
        fDto = fDto / (1 + k1(i - 1)) 'el factor de descuento es acumulativo
        'Si el flujo de caja es negativo se calcula el VA acumulando
        If flujos(i) < 0 Then VA = VA + flujos(i) * fDto
    Next i
    'Al finalizar del bucle anterior ya tenemos calculado el VA de los flujos negativos
    fCap = 1 'inicialmente el factor de capitalización es 1. Se comienza por el final
    For j = n To 1 Step -1 'Los calculos comienzan por el final
        fCap = fCap * (1 + k2(j)) 'el factor de capitalización es acumulativo
        'Si el flujo de caja es positivo se calcula el VF acumulando
        If flujos(j) > 0 Then VF = VF + flujos(j) * fCap
    Next j
    'Al finalizar del bucle anterior ya tenemos calculado el VF de los flujos positivos
    'Llamamos a la función TASA que en inglés es RATE
    TIRMvariable = WorksheetFunction.Rate(n - 1, 0, VA, VF)
    'Nper es n-1 ya que los flujos de caja comienzan en 0 con el desembolso inicial
Else
   'mensaje que sale si los rangos de k1 y k2 no son de longitud n-1
    TIRMvariable = "rangos no coinciden"
End If
End Function

También disponemos de una macro de prueba que lanza la instrucción Debug.Print.

Sub prueba()
Debug.Print TIRMvariable(Range("C7:C27"), Range("F8:F27"), Range("G8:G27"))
End Sub

Esto permite ejecutar la función que mostrará en la ventana Inmediato el resultado de la TIR.