PRIMER EJERCICIO
1.La madures (T) en años y precios en dólares de bonos cupón cero se encuentran en el archivo \(ZeroPrices.txt.\) Los precios están expresados en porcentajes del par value. El modelo NelsonSiegel con tasa de forward es:
\[r(T; θ_1, θ_2, θ_3, θ_4) = θ_1 + (θ_2 + θ_3T)exp(−θ_4T)\]
Realice una regresión no-lineal para estiamr los parámetros \(θ_1, θ_2, θ_3, θ_4\).
a)¿Cúales son sus estimaciones para \(θ_1,θ_2,θ_3\) y \(θ_4\)?
Para resolver la pregunta tenemos que subir la base de datos.
zero_prices = read.table('C:/Users/Esmeralda/Documents/R/ZeroPrices.txt',header=TRUE)
attach(zero_prices)El modelo que se va usar para la solución del ejercicio es el modelo de Nelson-Siegel con las tasas-forward y las curvas de rendimiento.
\[r(t; θ) = θ_0 + (θ_1 + θ_2t) exp(−θ_3t)\]
\[yt(θ) = θ_0 + (θ_1+\frac{θ_2}{θ_3})\frac{(1 − exp(−θ_3t)}{θ_3t} − \frac{θ_2}{θ_3} exp(−θ_3t)\] Con ello se hallará los \(\theta_s\)
Nelson_Siegel_1 = nls (
price ~ 100 * exp (- theta1 * maturity),
data = zero_prices,
start = list (theta1 = 0.01))
theta1_inicial_estimado = summary(Nelson_Siegel_1)$coef[,1]
theta1_inicial_estimado## [1] 0.05179561
El valor obtenido es el valor del \(\theta\) inicial, con ello se obtendra los demás, es importante mencionar que se tomo un valor de 0.5 para los \(\theta_3\) y \(\theta_4\).
Nelson_Siegel_2 = nls(
price ~ 100 * exp( - ( theta1 + (theta3/theta4) * (1 - exp(-theta4*maturity)) / (theta4*maturity) - (theta3/theta4)*exp(-theta4*maturity) ) * maturity ),
data=zero_prices,
start=list(theta1=theta1_inicial_estimado,theta3=0.5,theta4=0.5))
coefs = summary(Nelson_Siegel_2)$coef[,1]
theta1_inicial_estimado = coefs[1]
theta3_inicial_estimado = coefs[2]
theta4_inicial_estimado = coefs[3]
theta1_inicial_estimado ## theta1
## 0.04216902
## theta3
## 0.01826462
## theta4
## 0.3479543
Para finalizar calculamos el ultimo parámetro ya con toda la ecuación desarrollada:
Nelson_Siegel_3 = nls(
price ~ 100 * exp( - ( theta1 + (theta2 + theta3/theta4) * (1 - exp(-theta4*maturity)) / (theta4*maturity) - (theta3/theta4)*exp(-theta4*maturity) ) * maturity ),
data=zero_prices,
start=list(theta1=theta1_inicial_estimado,theta2=0.,theta3=theta3_inicial_estimado,theta4=theta4_inicial_estimado))
coefs = summary(Nelson_Siegel_3)$coef[,1]
coefs## theta1 theta2 theta3 theta4
## 0.009860962 0.049479902 0.002103318 0.056456328
theta1 = 0.00986 theta2 =0.04948 theta3 =0.00210 theta4 =0.05646
b)Grafique la curva de rendimientos empírica y la curva de rendimientos estimada en una misma figura.
Para hallar r se hace uso de la siguiente formula \[r(n)=\frac{log{(\frac{FV}{P(n)})}}{n}\]
CURVA DE RENDIMIENTO EMPÍRICA
theta1 = 0.00986
theta2 =0.04948
theta3 =0.00210
theta4 =0.05646
curva_empirica <- numeric()
madurez <- zero_prices$maturity
for(i in 1:length(madurez)){
curva_empirica[i] <- log(100 / zero_prices$price[i]) / zero_prices$maturity[i]
}CURVA DE RENDIMIENTO ESTIMADA
curva_estimada <-numeric()
madurez <- zero_prices$maturity
for(i in 1:length(madurez)){
curva_estimada[i] <- theta1_inicial_estimado+(theta2+theta3*zero_prices$maturity[i])*exp(-theta4*zero_prices$maturity[i])
}GRAFICOS DE LAS CURVAS
plot(zero_prices$maturity, curva_estimada, col="red" , xlab="Maduración", ylab="Rendimiento")
par(new=TRUE)
plot(zero_prices$maturity, curva_empirica, col="blue" , xlab="", ylab="", axes=FALSE)
title(main="Gráficas la Curva Empírica y la Curva Estimada")
legend(x = "topright", legend = c("Curva Empírica", "Curva Estimada"), fill = c("blue", "red"),
title = "Leyenda")SEGUNDO EJERCICIO
2.Un bono cupon cero con valor nominal \(\$1 000\) y madures a 5 años se vende a \(\$ 828\). Asuma que existe una tasa forward r de capitalización continua y constante.
a)Determine el valor de r.
Para hallar r se hace uso de la siguiente formula \[r(n)=\frac{log{(\frac{FV}{P(n)})}}{n}\] dicha formula se deriva de la siguiente formula que se encuentra en la pag 32 del mencionado libro lineas arriba.
\[P(n)=\frac{FV}{exp(nr_n)}\]
\(FV\)= Valor nominal
\(P(n)\)= Es el valor al que se vende
\(n\)= años
## [1] 3.774842
El valor de \(r_n\) es \(3.77\%\).
b)Suponga que en 1 año la tasa r cambia a 4.25 %. ¿Cúal es el precio del bono?
Se usara la misma formula del inciso a:
\[P(n)=\frac{FV}{exp(nr_n)}\] pero en este caso como ya paso un año, en valor de n será 4, todo lo demás se mantendrá igual.
## [1] 843.6648
El precio obtenido es 844 dólares, para un valor de r=4.25%, n=4 y FV=1000.
c)Si compró el bono a \(\$ 828\) y lo vendió 1 año después al precio determinado en (b). Determine el retorno neto.
Para hallar el retorno neto hacemos uso de la siguiente formula:
\[ Rt=\frac{P_t - P_{t-1}}{P_{t-1}}\]
## [1] 1.891886
El retorno neto obtenido es \(1.89\%\).
TERCER EJERCICIO
3.Suponga que la tasa forward es \(r(t) = 0,028 + 0,00042t\)
a)Cúal es el rendimiento al vencimiento de un bono a 20 años.
En este caso solo se creará una funcion que contenga lo siquiente:
\[r(t) = 0,028 + \frac{0,00042t}{2}\]
## [1] 3.22
El rendimiento al vencimiento para un bono a 20 años es \(3.22\%\).
b)Cúal es el precio de un bono cupón cero con valor nominal \(\$ 1 000\) y madures a 15 años.
En este caso se utiliza:
\[Precio= \frac{VN}{exp(ty(t))}\]
## [1] 626.7234
El precio de un bono cupón cero con valor nominal de 1000 y con una madurez a 15 años es 627 dólares.
CUARTO EJERCICIO
4.Suponga que la tasa forward es \(r(t) = 0,028 + 0,0002t − 0,0003t^2\)
a)Cúal es el rendimiento al vencimiento de un bono a 8 años.
Creamos una funcion:
\[r(t) = 0,028 + \frac{0,0002t}{2} − \frac{0,0003t^2}{3}\]
yield1 = function(t){0.028 + 0.0002/2 * t - 0.0003*t^2/3}
yield1_porcentaje<- yield1(8)*100; yield1_porcentaje## [1] 2.24
El rendimiento al vencimiento es \(2.24\%\)
b)Cúal es el precio de un bono cupón cero con valor nominal \(\$ 1 000\) y madures a 5 años.
En este caso se utiliza:
\[Precio= \frac{VN}{exp(ty(t))}\] Donde el t=5, VN=1000 y el y es halla con la funcion anterior.
## [1] 878.0954
El precio de un bono cupón cero con valor nominal de 1000 y con madurez de 5 años es dólares.
c)Grafique la curva de rendimiento y tasas forward. ¿Cúales son cóncavas y cúales son convexas? ¿Cómo se diferencian?*
Para graficar la curva de rendimiento y de tasas forward, se crean los datos de ambas curvas.
Para ello se ejecutara el siguiente codigo:
## [1] 491
Además, en este inciso usaremos las dos ecuaciones que definen tanto al rendimiento como a las tasas forward:
\[r(t) = 0,028 + 0,0002t − 0,0003t^2\]
\[yt=\frac{1}{t}(0,028 (t)+\frac{0,0002}{2}(t)^2−\frac{0,0003}{3} (t)^3)\]
Ahora utilizamos el siguiente código en R para graficar las curvas:
DEFINIENDO LA CURVA DE RENDIMIENTO
rendimiento<- numeric() #Vector tasa de rendimiento
for (i in 1:length(maturity)) {
rendimiento[i] <- 0.028 + 0.0002*maturity[i]-0.0003*(maturity[i])^2
}DEFINIENDO LA CURVA DE TASA FORWARD
forward<- numeric()#vector de tasa de forward
for (i in 1:length(maturity)) {
forward[i] <- ((0.028*maturity[i])+(0.0002/2)*((maturity[i])^2)-(0.0003/3)*((maturity[i])^3))/maturity[i]
}GRAFICOS
par(mfrow = c(1,2))
plot(rendimiento, type = "l", col="pink" ,main = "CURVA DE RENDIMIENTO", xlab = "MADURACIÓN", ylab = "RENDIMIENTO")
plot(forward, type = "l", col="grey" , main = "CURVA DE TASAS FORWARD", xlab = "MADURACIÓN", ylab = "TASAS FORWARD")En este caso ambos curvas son cóncavas, lo diferente es el valor de la tasa, ya que en el caso de la tasa forward tiene un factor al cubo.
Ahora mostraremos los dos graficos en uno para ver la diferencia:
## rendimiento forward
## 1 0.027900 0.028000
## 2 0.027857 0.027989
## 3 0.027808 0.027976
## 4 0.027753 0.027961
## 5 0.027692 0.027944
## 6 0.027625 0.027925
Grafica:
plot(rendimiento, type = "l", color="pink", xlab = "MADURACIÓN", ylab = "RENDIMIENTO-TASA FORWARD")
par(new=TRUE)
plot(forward, type = "l", col="grey", xlab = "", ylab="", axes=FALSE)
title(main="GRAFICAS CURVA DE TASA FORWARD Y RENDIMIENTO")
legend(x = "topright", legend = c("Curva de Rendimiento", "Curva de Tasas Forward"), fill = c("grey", "pink"),
title = "Leyenda")d)Suponga que compra un bono cupón cero con vencimiento a 10 años y los vende un año después. ¿Cúal sería el retorno si la tasa forward no cambia en ese año?
## [1] 1.9
El rendimiento al vencimiento de un bono cupón cero con vencimiento a 10 años es \(1.9\%\), esto se realizo usando la formula del inciso a.
## [1] 826.9591
El precio de un bono cupón cero con vencimiento a 10 años es 827 dólares.
Ahora hallaremos el retorno si la tasa forward no cambia
#Primero hallaremos el precio a 9 años, con rendimeinto igual a 1.9%
precio3<-1000*exp(-9*0.019)
precio3## [1] 842.8216
El precio al que se vendera es 843 dólares.
Para hallar el retorno neto hacemos uso de la siguiente formula:
\[ Rt=\frac{P_t - P_{t-1}}{P_{t-1}}\]
## [1] 1.918165
El retorno neto obtenido es \(1.92\%\).
QUINTO EJERCICIO
5.El siguiente código calcula el precio de un bono dado el pago del cupón, madurez del bono, retorno a la madurez y valor nominal.
Valor del bono El rendimiento al vencimiento (sobre una base semestral) de un bono con cupón, con r, que es la tasa de interes.
\[PRICE = \frac{C}{r}+({PAR − \frac{C}{r}})(1 + r)^{−2T}\]
Aquí PRICE es el precio de mercado del bono, PAR es el valor nominal, C es el pago del cupón semestral, y T es el tiempo hasta el vencimiento en años y se supone que es un múltiplo de 1/2.
bondvalue = valores de bonos (precios corrientes) correspondientes a todos los valores de rendimiento al vencimiento en el vector de entrada r
ENTRADA:
- c = pago del cupón (semestral)
- T = tiempo hasta el vencimiento (en años)
- r = vector de rendimientos al vencimiento (tasas semestrales)
- par = valor nominal
Utilice la función uniroot() para resolver las siguiente preguntas.
- Utilice la función uniroot() para encontrar la madurez de un bono con madurez a 30 añoos y valor nominal de \(\$ 1 000\) con cupones de \(\$ 40\) que se vende a \(\$ 1 200\)
Se puede encontrar el rendimiento al vencimiento usando un buscador de raíces no lineal (solucionador de ecuaciones) como \(uniroot ()\), este busca en el intervalo de menor a mayor una raíz (es decir, cero) de la función f con respecto a su primer argumento.
Como en el problema no nos especifica que los cupones son anuales o semianuales, lo haremos de las dos formas, primera forma, asumiendo que el cupón es semianual, por ello se usa la formula \(bondvalue\).
T = 30 #años y 60 semestres
C = 40 #seminual
par = 1000
price = 1200
options(digits = 3)
retornosemi<-uniroot(function(r) bondvalue(C,T,r,par) - price, c(0.001,.1))
retornosemi## $root
## [1] 0.0324
##
## $f.root
## [1] -0.333
##
## $iter
## [1] 6
##
## $init.it
## [1] NA
##
## $estim.prec
## [1] 6.1e-05
El rendimiento al vencimiento de dicho bono es \(3.24\%\), este esta en terminos semestrales, asumiendo que los cupones son pagaderos semianualmente, para convertirlos a anuales se tendria que multiplicar por 2. Retorno anual es \(6.48\%\)
Segunda formula, es terminos anuales: \[PRICE = \frac{C}{r}+{({PAR − \frac{C}{r}})}(1 + r)^{−T}\]
bondvalueanual = function(c1, T1, r1, par1)
{
bv1 = c1 / r1 + (par1 - c1 / r1) * (1 + r1)^(-T1)
bv1
}T1 = 30 #años
C1 = 40 #anual
par1 = 1000
price1 = 1200
options(digits = 3)
retornoanual<-uniroot(function(r1) bondvalueanual(C1,T1,r1,par1) - price, c(0.001,.1))
retornoanual## $root
## [1] 0.0298
##
## $f.root
## [1] -0.186
##
## $iter
## [1] 5
##
## $init.it
## [1] NA
##
## $estim.prec
## [1] 6.1e-05
El retorno anual obtenido es \(2.98\%\).
Se observa una gran diferencia con la primera parte, y quiza se esperaba que el retorno sea \(6.48\%\), pero ello no es asi porque el pago para el segundo caso asumimos que es anual, y para que nos salga un rendimiento de \(6.48\%\), se tendria que de asumir que el cupon es 80 anual.
Se realizo, dos casos para un mejor entendimiento del lector, pero se hace enfasis que el caso mas usual y más logico es el primer caso.
El rendimiento al vencimiento de dicho bono es \(3.24\%\).
b)Determine el retorno a la madurez de un bono con valor nominal \(\$ 10 000\) que se vende a \(\$ 9800\) con pago de cupones semi-anuales de \(\$ 280\) y madurez de 8 años.
Usamos uniroot(), para hallar el retorno a la madurez, es necesario enfatizar que se usa la formula \(bondvalue\) que esta en terminos semestrales, por lo tanto, el retorno que se obtiene es semestral.
retornosemi1<-uniroot( function(r) bondvalue(280, 8, r, 10000) - 9800, c(0.0001, 0.1) )
retornosemi1## $root
## [1] 0.0296
##
## $f.root
## [1] -0.45
##
## $iter
## [1] 5
##
## $init.it
## [1] NA
##
## $estim.prec
## [1] 6.1e-05
El retorno obtenido a la madurez es de \(2.96\%\), esta es una tasa semestral.
- Utlice la función uniroot() para hallar el retorno a la madurez de un bono a 20 años con valor nominal \(\$ 1 000\) y cupon semi-anual de \(\$ 35\) que se vende a \(\$ 1 050\).
retornosemi2<-uniroot( function(r) bondvalue(35, 20, r, 1000) - 1050.0, c(0.01, 0.04) )
retornosemi2## $root
## [1] 0.0327
##
## $f.root
## [1] 0.0604
##
## $iter
## [1] 5
##
## $init.it
## [1] NA
##
## $estim.prec
## [1] 6.1e-05
El retorno a la madurez es \(3.27\%\), este esta en terminos semestrales, para que sea anual, se tendria que mutiplicar x 2, y saldría \(6.54\%\).
- El retorno a la madurez de un bono es 0,035 en un bono con valor nominal de \(\$1 000\), un precio de \(\$ 950,10\) y madurez a 5 años. ¿Cúal es el valor del cupon?
## $root
## [1] 29
##
## $f.root
## [1] 0
##
## $iter
## [1] 1
##
## $init.it
## [1] NA
##
## $estim.prec
## [1] 19
En este problema tampoco se espicifica si el retorno es anual o semianual, pero para mayor simplicidad del problema, se asume que es seminual.
Asumiendo que el \(r= 0.035\) es el retorno en terminos semestrales, el cupón semianual es \(29\).