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.
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%.
rm(list=ls())
cupon=0.0425
vencimiento=4
rendimiento=0.017
par=1000
frec.cupon=1
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
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
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
valor=sum(bono.df$vp.cf)
valor
## [1] 1097.808
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
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}
YTM<-bono.ytm(bono.cf)*frec.cupon
YTM
## [1] 0.01699932