YTM%

Antes de entrar a definir el concepto del rendimiento hasta el vencimiento de un bono o YTM por sus siglas en inglés (Yield to Maturity), vamos a detenernos en el concepto valor del dinero en el tiempo. Dividamos este concepto en dos partes, para una total comprensión: cuando hablamos del valor del dinero, nos referimos a su capacidad de compra o intercambio, es decir, su poder adquisitivo; mientras que cuando estamos hablando del tiempo, nos referimos al cambio que sufre esta capacidad adquisitiva a lo largo del mismo. De allí la importancia de este concepto cuando se busca algún retorno dentro de todo proceso de inversión.

El concepto de valor del dinero en el tiempo lo podemos ver reflejado en los conceptos de valor presente y valor futuro. El primero se refiere al valor descontado de los flujos de caja que se generarán en el futuro, es decir, a cuánto equivale hoy una suma de dinero que esperamos recibir en un tiempo futuro determinado. El segundo, por su parte, describe el proceso de crecimiento de la inversión a una tasa de interés y en un período de tiempo dados. Dicho en otras palabras, hace referencia al capital acumulado en un momento futuro, generado por los intereses y/o amortizaciones que se den a lo largo de la vida de esa inversión. El concepto de valor de dinero en el tiempo permite una evaluación y comparación de inversiones.

La conversión de un valor actual a su valor futuro equivalente se denomina composición. Mientras que la conversión de un flujo de efectivo o valor futuro a su valor equivalente en un período anterior se conoce como el descuento.

Habiendo repasado los conceptos previos, ahora podremos explorar el concepto de YTM y su relación con el valor futuro. Comencemos describiendo el concepto de valor futuro.

Se le llama simple porque se repite exactamente de la misma manera de un período a otro. Se supone que el interés no se capitaliza en el instrumento. Si, por otra parte, tanto el principal como los intereses se mantienen, estos se convierten en un nuevo capital al cual se le calculan también nuevos intereses. A este método se le conoce como interés compuesto, ya que se devengan intereses sobre el interés pagado anteriormente. Se le llama compuesto, ya que el nuevo nominal es una combinación del principal, intereses sobre el capital y los intereses sobre el interés acumulado (o simplemente, intereses sobre los intereses).

Para entender la diferencia, supongamos una inversión de dos años

El valor futuro no es más que el resultado de componer los flujos a una tasa de interés durante un período determinado de tiempo.

Ahora bien, “el rendimiento de cualquier en cualquier valor de renta fija es la única tasa de interés (con interés capitalizable a un intervalo especificado) que, si es pagada en la cantidad invertida, permitirá al inversionista obtener todos los pagos prometidos por el valor en cuestión”.

Matemáticamente, el rendimiento, y, es la tasa de interés que satisface la siguiente ecuación:

Al interés calculado de ésta relación se le conoce como tasa interna de retorno.

De manera equivalente, se compone el rendimiento al vencimiento o YTM, que no es mas que la tasa de descuento que hace que el valor presente de los flujos de efectivo futuros prometidos sea igual en la suma al precio de mercado actual del bono; entendiendo los flujos como aquellos que recibirá el inversor por mantener el bono hasta el vencimiento.

donde:

P = precio del bono,

C = cupón del bono

N = nominal

n = número de períodos

Dicho valor del YTM puede hallarse bajo el método de ensayo y error.

Este método consiste en ir tanteando con diferentes YTM hasta que consigamos una que haga que el precio del bono coincida. A continuación describiremos brevemente como crear una función en R, que nos permita calcular el precio de un bono.

Como primer paso, debemos construir una función para obtener el precio del bono. Dicha función recibirá como parámetros p (valor nominal), r (tasa cupón), ttm (años al vencimiento) e y (YTM).

En el cuerpo de la función, realizaremos los siguientes pasos:

– Creamos el objeto cf (cash flow), que contendrá los pagos de los cupones más el último pago cupón incluyendo el capital.

cf<- c(rep(p * r, ttm - 1), p * (1 + r))

— Acto seguido, convertimos el objeto cf en un data frame, para poderle agregar columnas más adelante.

cf <- data.frame(cf)

— Agregamos la columna t de tiempo al data frame cf; con rownames() enumeramos la columna desde el 1 hasta el vencimiento del bono y con as.numeric() nos aseguramos que sean valores estrictamente numéricos.

cf$t <- as.numeric(rownames(cf))

— Agregamos la columna pv_factor y guardamos en dicha variable el cálculo del factor de descuento.

cf$pv_factor <- 1 / (1 + y) ^ cf$t

— Calculamos el valor presente de cada flujo de caja y lo sumamos como columna a cf. Esto no es más que multiplicar cada flujo por el factor de descuento.

cf$pv <- cf$pv_factor * cf$cf

— Por último, realizamos la sumatoria de cada uno de los valores presentes de cada flujo para obtener el precio del bono.

sum(cf$pv)

De una manera completa, la función quedaría de la siguiente forma :

bondprc <- function(p, r, ttm, y) {
  cf<- c(rep(p * r, ttm - 1), p * (1 + r))
  cf <- data.frame(cf)
  cf$t <- as.numeric(rownames(cf))
  cf$pv_factor <- 1 / (1 + y) ^ cf$t
  cf$pv <- cf$pv_factor * cf$cf
  sum(cf$pv)
}

Otra alternativa a la función creada, para calcular el precio de un bono es la siguiente:

precio <- function(p,r,ttm,y){
  descuento <- c()
  cupones <- rep(p * r, ttm - 1)
  nominal <- p * (1 + r)
  cf <- c(cupones, nominal)
  t <- c(1:ttm)
    for (i in t){
      descuento <- c(descuento, 1 / (1 + y) ^ i)
    }
  vp <- cf * descuento
  sum(vp)
}

Una vez detallada la función, vamos a explorar a través de ella para poder encontrar el valor del YTM que satisfaga la relación.

#Función para calcular el precio precio <- function(p,r,ttm,y){ descuento <- c() cupones <- rep(p * r, ttm - 1) nominal <- p * (1 + r) cf <- c(cupones, nominal) t <- c(1:ttm) for (i in t){ descuento <- c(descuento, 1 / (1 + y) ^ i) } vp <- cf * descuento sum(vp) } # La función "precio" se encuentra cargada en el ambiente de trabajo. Sólo debe llamarla con los parámetros necesarios. Suponga un bono con 5 años hasta su vencimiento, que se está vendiendo en el mercado secundario por $910. Un inversor que compre este bono y lo mantenga hasta su vencimiento recibirá $70 cada año por concepto de intereses. Se desea conocer el rendimiento que generará dicho bono, utilizando el método de ensayo y error. # Utilice la función "precio" con y=0.12 (12%) # Utilice la función "precio" con y=0.08 (8%) # Utilice la función "precio" con y=0.0933 (9,33%) # La función "bondprc" se encuentra cargada en el ambiente de trabajo. Sólo debe llamarla con los parámetros necesarios. Suponga un bono con 5 años hasta su vencimiento, que se está vendiendo en el mercado secundario por $910. Un inversor que compre este bono y lo mantenga hasta su vencimiento recibirá $70 cada año por concepto de intereses. Se desea conocer el rendimiento que generará dicho bono, utilizando el método de ensayo y error. # Utilice la función "precio" con y=0.12 (12%) precio(p = 1000, r = 0.07, ttm = 5, y = 0.12) # Utilice la función "precio" con y=0.08 (8%) precio(p = 1000, r = 0.07, ttm = 5, y = 0.08) # Utilice la función "precio" con y=0.0933 (9,33%) precio(p = 1000, r = 0.07, ttm = 5, y = 0.0933) test_function("precio") success_msg("Muy bien!")
Los valores de los parámetros "r" e "y" deben estar expresados en decimales.




Otra manera de calcular el valor del YTM, es construir una función que nos permita obtener su valor de manera directa.

Primero, debemos definir las variables px (precio actual), p (nominal), r (tasa cupón), ttm (años al vencimiento).

px <- 910
p <- 1000
r <- 0.07
ttm <- 5

Segundo, debemos crear una función que calcule los flujos de caja a recibir, incluyendo como primer valor el precio a pagar (en negativo, por ser un desembolso) y como último valor el nominal más el cupón. Una vez creada la función, asignaremos su resultado a un objeto cf.

# Función cash_flow
cash_flow <- function(px,p,r,ttm){
  cf <- c(-px, rep(p * r, ttm - 1), p * (1 + r))
  cf
}

cf <- cash_flow(px,p,r,ttm)


Veamos como quedan representados los flujos de caja

# Definición de la variable `t` que contiene los períodos
t <- c(0:ttm)

# Creación del Dataframe que muestra los períodos y sus flujos correspondientes
CF <- data.frame(Periodo = t, Flujos = cf)
CF
Periodo Flujos
0 -910
1 70
2 70
3 70
4 70
5 1.070


Como siguiente paso crearemos la función bval que utiliza la misma lógica de la función precio() para obtener el total del valor presente de los flujos de caja.

bval <- function(i, cf, t=seq(along = cf)) {
 sum(cf / (1 + i)^t)
}

Por último, creamos la función ytm() que utiliza la función uniroot() para hallar la raíz de la función bval() y encontrar el valor en el cual se hace cero; que no es más que hallar el YTM que iguala el precio del bono al valor presente de los flujos de caja.

ytm <- function(cf){
  uniroot(bval, c(0, 1), cf = cf)$root
}

ytm(cf)


Ahora vamos a trabajar con la función ytm para realizar el mismo cálculo que hicimos en el ejercicio previo, con la diferencia de que en esta ocasión no utilizaremos el método de ensayo y error, ya que vamos a utilizar la función creada.

# Definición de las variables px <- 910 p <- 1000 r <- 0.07 ttm <- 5 # Función cash_flow cash_flow <- function(px,p,r,ttm){ cf <- c(-px, rep(p * r, ttm - 1), p * (1 + r)) cf } # Función bval bval <- function(i, cf, t=seq(along = cf)) { sum(cf / (1 + i)^t) } # Función ytm ytm <- function(cf){ uniroot(bval, c(0, 1), cf = cf)$root } # Las variables `px` (precio actual), `p` (nominal), `r` (tasa cupón), `ttm` (años al vencimiento) y las funciones `ytm` y `cash_flow` se encuentran cargadas en el ambiente de trabajo. Debe crear el objeto que contenga los flujos de caja a recibir (`cf`). cf <- # Utilice la función "ytm", pasándo como parametro el objeto `cf` para determinar el valor del YTM del bono # Las variables `px` (precio actual), `p` (nominal), `r` (tasa cupón), `ttm` (años al vencimiento) y las funciones `ytm` y `cash_flow` se encuentran cargadas en el ambiente de trabajo. Debe crear el objeto que contenga los flujos de caja a recibir (`cf`). cf <- cash_flow(px,p,r,ttm) # Utilice la función "ytm", pasándo como parametro el objeto `cf` para determinar el valor del YTM del bono ytm(cf) test_object("cf", incorrect_msg = "Debe utilizar la función cash_flow, pasándolos parámetros correctos") test_function("ytm", incorrect_msg = "Recuerde pasar como parámetro el objeto con los flujos a recibir") success_msg("Muy bien!")
Debe conocer los flujos a recibir antes de calcular el YTM.



Como pudimos observar, el resultado obtenido fue el mismo que resultó de utilizar el método de ensayo y error; con la diferencia que utilizando la función se simplifica el proceso.

Ahora bien, continuando con el tema veamos como se relacionan ambos conceptos, utilizando los datos del ejemplo que hemos trabajado durante el artículo.

Tal como expusimos anteriormente, tenemos que el valor del YTM lo obtuvimos de la fórmula del precio del instrumento:

Si sustituimos el valor del Precio (VP) en la fórmula del valor futuro, tenemos que:

Como podemos observar, el YTM nos va a permitir determinar el valor esperado de una inversión en bonos componiendo cada uno de los flujos a dicha tasa.

Dichos cálculos también pueden obtenerse en R, utilizando las funciones creadas anteriormente.

# Definición de variables
px <- 910
p <- 1000
r <- 0.07
ttm <- 5

# Flujos de efectivo del bono
cf <- cash_flow(px,p,r,ttm)
cf

# YTM del bono
y <- ytm(cf)
y

# Precio del bono
precio(p,r,ttm,y)

# Valor final del bono utilizando la fórmula de VF = (1+YTM)^ttm
vf <- px*(1+y)^ttm
vf

# Valor final del bono calculando el valor futuro de cada flujo (sustituyendo P en la fórmula del VF)
VF <- (70*(1+0.0933211)^4) + (70*(1+0.0933211)^3) + (70*(1+0.0933211)^2)+ (70*(1+0.0933211))+ 1070
VF

Los comandos en R se pueden descargar para que puedan experimentar.

Copyright © 2014-2019 Synergy Vision. Los artículos del Corpus se comparten bajo los términos de la licencia Creative Commons con Reconocimiento, Propósito no comercial, Compartir contenido similar, 4.0 Internacional (CC BY-NC-SA 4.0).

Citar el artículo.