Pregunta N°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 Nelson-Siegel con tasa de forward es: \[r(T;\theta_1;\theta_2;\theta_3;\theta_4) = \theta_1 + (\theta_2 + \theta_3*T)*exp(-\theta_4*T)\]

Realice una regresión no-lineal para estimar los parámetros \(\theta_1\), \(\theta_2\), \(\theta_3\), \(\theta_4\).

Los datos se encuentran en el archivo ZeroPrices.txt; entonces con la función read.table() indicaremos la dirección en la cual se encuentra dicho archivo, también indicaremos que la primera fila de los datos son los nombres de las variables colocando dentro de la función header = TRUE

Zero.Price <- read.table("C:/Users/saul/OneDrive/MIS CURSOS/AGR/SEGUNDA PARTE/ZeroPrices.txt", header = TRUE, sep = "")

Se hara la regresion no lineal usando la ecuacion del precio de un bono cupon cero, como los datos que se tienen descargados son los precios y los vencimientos, se tendra que utilizar la informacion para hallar los valores de la tasa de descuento para cada precio. De tal forma se obtendran los parametros de \(\theta_1\), \(\theta_2\), \(\theta_3\), \(\theta_4\).

Nelso.Siegel.1 <- nls(
  price ~ 100 * exp( - theta1 * maturity ),
  data=Zero.Price,
  start=list(theta1=0.01),
  control=list(minFactor=1.e-5,warnOnly=TRUE) )
theta1_initial <- summary(Nelso.Siegel.1)$coef[,1] 
Nelso.Siegel.2 <- nls(
  price ~ 100 * exp( - ( theta1 + (theta2/theta3) * (1 - exp(-theta3*maturity)) / (theta3*maturity) - (theta2/theta3)*exp(-theta3*maturity) ) * maturity ),
  data=Zero.Price,
  start=list(theta1=theta1_initial, theta2=0.5, theta3=0.5),
  control=list(minFactor=1.e-5,warnOnly=TRUE) )
coefs <- summary(Nelso.Siegel.2)$coef[,1] 
theta1_initial <- coefs[1]
theta2_initial <-coefs[2]
theta3_initial <- coefs[3]
Nelso.Siegel.3 <- nls(
  price ~ 100 * exp( - ( theta1 + (theta4 + theta2/theta3) * (1 - exp(-theta3*maturity)) / (theta3*maturity) - (theta2/theta3)*exp(-theta3*maturity) ) * maturity ),
  data=Zero.Price,
  start=list(theta1=theta1_initial, theta4 = 0.,theta2=theta2_initial, theta3= theta3_initial),
  control=list(minFactor=1.e-5,warnOnly=TRUE) )
coefs <- summary(Nelso.Siegel.3 )$coef[,1]

Por lo tanto, los estimadores para \(\theta_1\), \(\theta_2\), \(\theta_3\) y \(\theta_4\) son:

coefs
##      theta1      theta4      theta2      theta3 
## 0.009860962 0.049479902 0.002103318 0.056456328

Finalmente se graficará la curva de rendimiento estimada junto a la curva de rendimiento empírica en términos de los precios, entonces se aplicará el siguiente código y se obtiene lo siguiente:

par(mfrow = c(1,2))
plot( Zero.Price$maturity, Zero.Price$price , xlab = "Vencimiento", ylab = "Precio")
theta1 <- coefs[1]
theta2 <- coefs[2]
theta3 <- coefs[3]
theta4 <- coefs[4] 
P_hat =100 * exp(-( theta1 + (theta2 + theta3/theta4) * (1 - exp(-theta4*Zero.Price$maturity)) / (theta4*Zero.Price$maturity) - (theta3/theta4)*exp(-theta4*Zero.Price$maturity) ) * Zero.Price$maturity)
lines(Zero.Price$maturity, P_hat, type="l", col="red")

Pregunta N°2

Un bono cupón cero con valor nominal \(\$1000\) y madures a \(5\) años se vende a \(\$828\). Asuma que existe una tasa forward r de capitalización continua y constante. El valor de r se obtiene con la siguiente ecuación:

\[r= \frac{log\left(\frac{P_{(1)}}{P}\right)}{n}\]

Entonces, el valor de r hallara usando el siguiente codigo:

  r <- log(pn-1 / pn) / n

Entonces, como se sabe que el valor nominal es \(\$1000\), que sera pn-1, también sabemos que se vende a \(\$828\), lo que será pn y n será 5. Por lo que el valor de r sera:

  r <- log(1000 /828) / 5;r
## [1] 0.03774842

Si luego de un año teniendo el activo la tasa r cambia a 4.25%, se desea hallar el precio del bono. El precio de un bono con capitalización es: \[P= \frac{VN}{exp(n*y)}\]

Se usara el valor de r como si fuera y es decir 4.25%. Entonces el valor de del bono sera:

p <- 1000 * exp(-5 * 0.425);p
## [1] 119.433

Se desea conocer el retorno neto que genera el bono, se compró el bono a \(\$828\) y se vendió un año después a \(\$843.66\). El retorno neto se debe utilizar la siguiente formula: \[Retorno Neto= \frac{P_t}{P_{t-1}}-1\]

Se hallara el retorno neto con el siguiente codigo:

  rneto <- (p1 / p0) - 1

Donde p1 es el precio con el que se vendió el bono y p0 es el precio con el que se compró el bono. Aplicando con los datos:

r.neto <- (843.66 / 828) - 1;r.neto
## [1] 0.01891304

Pregunta N°3

Suponga que la tasa forward se halla a partir de:

\[r(t)=0.028+0.00042t\]

Se busca el rendimiento para un bono que vence en 20 años.Como se sabe la tasa de rendimiento se puede traducir como el promedio aritmético de las tasas forward que se encuentren entre un intervalo de tiempo.

En el codigo se coloca la solucion general poder obtener la tasa de rendimiento de un bono teniendo en cuenta la funcion de tasa forward dada:

tasa.rendimiento <- ((0.028 * T) + (0.00021 * (T^2)))*(1/T)

Entonces, utilizando los datos del problema se tiene lo siguiente que la tasa de rendimiento es:

tasa.rendimiento <- ((0.028 * 20) + (0.00021 * (20^2)))*(1/20); tasa.rendimiento
## [1] 0.0322

Para hallar el valor de un bono cupón cero con un valor nominal de \(\$1000\) y con una madures a 15 años. Como se sabe el precio de un bono se halla utilizando la siguiente ecuación: \[P_n= \frac{Valor Nominal}{exp(T*y_n)}\]

Entonces primero se halla la tasa de rendimiento para el bono de 15 años:

tasa.rendimiento2 <- ((0.028 * 15) + (0.00021 * (15^2)))*(1/15); tasa.rendimiento2
## [1] 0.03115

Y el precio del bono sera:

p2 <- 1000 * exp(-15 * tasa.rendimiento2);p2
## [1] 626.7234

Pregunta N°4

Suponga que la tasa forward es: \[r(t)=0.028 + 0.0002*t-0.0003*t^2\]

Se busca el rendimiento para un bono que vence en 8 años. Por lo que usando la idea para hallar la tasa de rendimiento de problemas anteriores, se puede hallar el rendimiento del bono con el siguiente codigo:

tasa.rendimiento3 <- ((0.028 * T) + (0.0002 * ((T^2)/2)) - (0.0003 * ((T^3)/3)))*(1/T)

Entonces, utilizando los datos del problema:

tasa.rendimiento3 <- ((0.028 * 8) + (0.0002 * ((8^2)/2)) - (0.0003 * ((8^3)/3)))*(1/8);tasa.rendimiento3
## [1] 0.0224

Hallar el valor de un bono cupón cero con un valor nominal de \(\$1000\) y con una madures a 5 años. Teniendo la idea de desarrollo de los ejercicios anteriores, primero se halla la tasa de rendimiento que es:

tasa.rendimiento4 <- ((0.028 * 5) + (0.0002 * ((5^2)/2)) - (0.0003 * ((5^3)/3)))*(1/5);tasa.rendimiento4
## [1] 0.026

Y el precio sera:

p3 <- 1000 * exp(-5 * tasa.rendimiento4);p3
## [1] 878.0954

Para graficar la curva de rendimiento y de tasas forward, primero se cran los datos de ambas curvas y se ejecutara el siguiente codigo:

t <- seq(0,3, by = 0.1) #Se cuencia de vencimientos.
tamaño <- length(t);tamaño 
## [1] 31
f4 <- function(t){0.028 + (0.0002 * t) - (0.0003 * (t^2))} #Funcion de tasa forward
f <- numeric(length = 31) # Vector de forwards
for(i in 0:31){
  f[i] <- f4(t[i])
}
r <- numeric(length = 31) #Vector de tasa de rendimiento.
for(i in 0:31){
  r[i] <- ((0.028 * i) + (0.0002 * ((i^2)/2)) - (0.0003 * ((i^3)/3)))*(1/i)
}

Entonces para graficar las curvas se ejecuta lo siguiente:

plot(t, f, main = "Tasas Forward")

plot(t, r, main = "Curva de Rendimiento")

Se observar en ambas graficas son cóncavas y difieren en que ambas curvas tienen distintos valores en los coeficientes de los polinomios que generan cada curva.

Suponga que se compra un bono cupón cero con vencimiento a 10 años y se vende un año después. ¿Cuál sería el retorno si las tasas forward no cambian en ese año?

Para hallar el precio del bono cero con vencimiento de 10 años, se utiliza el siguiente código:

tasa.rendimiento5 <- ((0.028 * 10) + (0.0002 * ((10^2)/2)) - (0.0003 * ((10^3)/3)))*(1/10);tasa.rendimiento5
## [1] 0.019

utilizando los datos, el precio a 10 años sera :

p4 <- 1000 * exp(-10 * tasa.rendimiento5);p4
## [1] 826.9591

Para hallar el precio del bono cero con vencimiento de 9 años, se utiliza el siguiente código:

tasa.rendimiento6 <- ((0.028 * 9) + (0.0002 * ((9^2)/2)) - (0.0003 * ((9^3)/3)))*(1/9);tasa.rendimiento6
## [1] 0.0208

Entonces el precio de venta del bono al año siguiente será de:

p5 <- 1000 * exp(-10 * tasa.rendimiento6);p5
## [1] 812.207

Por lo que el retorno neto sera:

r.neto2 <- (p5/p4) - 1;r.neto2
## [1] -0.01783897

Pregunta N°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.

bondvalue = function (c, t, r, par)
{
# Computes bv = bond values ( current prices ) corresponding
# to all values of yield to maturity in the
# input vector r
#
# INPUT
# c = coupon payment ( semiannual )
# T = time to maturity (in years )
# r = vector of yields to maturity ( semiannual rates )
# par = par value
#
bv = c / r + (par - c / r) * (1 + r)^( -2 * t)
bv
}

A

Utilice la función uniroot() para encontrar la madurez de un bono con madurez a 30 años con un valor nominal de \(\$ 1 000\), con cupones de \(\$ 40\) que se vende a \(\$ 1 200\).

r = seq(0, 0.05, length = 300)
value = bondvalue(40, 30, r, 1000)
plot(r, value)
abline(h=1200)

a <- uniroot( function(r) bondvalue(40, 30, r, 1000) - 1200, c(0.03,0.04) )
a$root
## [1] 0.03241618

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.

r = seq(0, 0.05, length = 300)
value = bondvalue(280, 8, r, 10000)
plot(r, value)
abline(h=9800)

b <- uniroot(function(r) bondvalue(280, 8, r, 10000) - 9800, c(0.01,0.04) )
b$root
## [1] 0.02956445

C

Utilice la función uniroot() para hallar el retorno a la madurez de un bono a 20 años con valor nominal $ $1 000$ y cupón semi-anual de $ $35$ que se vende a \(\$ 1 050\).

r = seq(0, 0.05, length = 300)
value = bondvalue(35, 20, r, 1000)
plot(r, value)
abline(h=1050)

c <- uniroot(function(r) bondvalue(35, 20, r, 1000) - 1050, c(0.01,0.04) )
c$root
## [1] 0.0327374

D

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. ¿Cuál es el valor del cupón?

d <- uniroot(function(c) bondvalue(c, 5, 0.035, 1000) - 950.10, c(0,1000) )
d$root
## [1] 28.99996