1. Valoración de bonos sobre Fechas de Pago de Cupón

El valor intrínseco de un bono es el valor presente de los pagos de cupones y el pago principal que los tenedores de bonos esperan recibir de poseer el bono con descuento en la tasa de descuento ajustada al riesgo. Por lo tanto, para valorar un enlace, necesitaríamos conocer los flujos de efectivo prometidos del bono y su rendimiento al vencimiento (YTM). Por otro lado, si conocemos el precio del bono y los flujos de efectivo del bono, podemos entonces encontrar el TIR del bono. En esta sección, mostramos cómo implementar estos dos cálculos.

1.1 Precios bonos de conversión con el rendimiento a vencimiento conocido

Considere que una inversión en bonos, por 4 años, que paga cupones anuales, con una tasa anual de 4.25%. El valor nominal de este bono es 1000 y su rendimiento fue de 1.7%.

Paso 1: Configurar las variables de caracterización de los bonos
rm(list=ls()) 
cupon=0.0425 
vencimiento=4
rendimiento=0.017 
par=1000
frec.cupon=1
Paso 2: Crear variables contables para la periodicidad de los pagos de cupones
periodos=vencimiento*frec.cupon 
periodos
## [1] 4
cupon.periodo=cupon/frec.cupon
cupon.periodo
## [1] 0.0425
rendimiento.periodo=rendimiento/frec.cupon 
rendimiento.periodo
## [1] 0.017
Paso 3: Construir un vector de Tasas de cupón aplicable por período

Creamos un vector llamado cupon.bono que contiene el pago de cupones para cada período. Hacemos esto mediante el comando rep, que repite el periodo.cupon de 4.25% para un cierto número de veces (es decir, cuatro).

cupon.bono<-rep(cupon.periodo,times=periodos,length.out=NA,each=1)
bono.df<-as.data.frame(cupon.bono) 
bono.df
##   cupon.bono
## 1     0.0425
## 2     0.0425
## 3     0.0425
## 4     0.0425
Paso 4: Calcular flujos de efectivo periódicos, Rendimiento al vencimiento, y el valor actual de cada flujo de efectivo de los periodos
bono.df$cf<-cupon.periodo*par 
bono.df$cf[periodos]=bono.df$cf[periodos]+par 
bono.df$ytm<-rendimiento.periodo 
bono.df$periodo<-c(1:periodos) 
bono.df$vp.cf<-bono.df$cf/((1+bono.df$ytm)^bono.df$periodo)
bono.df
##   cupon.bono     cf   ytm periodo     vp.cf
## 1     0.0425   42.5 0.017       1  41.78958
## 2     0.0425   42.5 0.017       2  41.09103
## 3     0.0425   42.5 0.017       3  40.40416
## 4     0.0425 1042.5 0.017       4 974.52336
Paso 5: Calcular el valor de Bono sumando el valor actual de cada flujo de efectivo de los periodos
valor=sum(bono.df$vp.cf) 
valor
## [1] 1097.808

1.3. Encontrar el rendimiento del bono (Bond Yield) al vencimiento con precio conocido

Paso 1: Crear un vector de flujos de efectivo del bono (Cash Flows), con el precio de compra como la primera observación y como número negativo
bono.cf<-c(-valor,rep(cupon.periodo*par,periodos-1),par+cupon.periodo*par)
bono.cf
## [1] -1097.808    42.500    42.500    42.500  1042.500
Paso 2: Crear Funciones encontrar iterativamente el rendimiento al vencimiento (YTM)

Creamos la primera de las dos funciones. Esta función calcula el valor del bono y usamos el carácter i como la variable que representa el rendimiento por período.

bonoval<-function(i,bono.cf,t=seq(along=bono.cf)) sum(bono.cf/(1+i)^t)

La segunda función utiliza la función uniroot para encontrar la raíz de los flujos de efectivo.

bono.ytm <- function(bono.cf) { + uniroot(bonoval,c(0,1), bono.cf=bono.cf)$root}
Paso 3: Analizar el Rendimiento periódico al vencimiento calculado anteriormente
YTM<-bono.ytm(bono.cf)*frec.cupon 
YTM
## [1] 0.01699932