Practica Calificada 4

1 La madures (T) en años y precios en dolares de bonos cupon cero se encuentran en el archivo ZeroPrices.txt. Los precios estan 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 regresion no-lineal para estimar los parametros \(\theta_1,\theta_2,\theta_3,\theta_4\).

a) Cuales son sus estimaciones para:

\(\theta_1,\theta_2,\theta_3, \theta_4\)

ZeroPrices <- read.table("C:/Users/HP/Desktop/ZeroPrices.txt", header=TRUE, quote="\"")
dat <- ZeroPrices
price <- dat$price
T <-dat$maturity
fitSpline = nls(price ~ 100 * exp(-beta0 * T - 
                                    (beta1 * T^2)/2 - (beta2 * T^3) / 3 - 
                                    (T > 15) * (beta3 * (T - 15)^3) / 3), data = dat,
                start = list(beta0 = 0.03, beta1 = 0, beta2 = 0, beta3 = 0))
summary(fitSpline)
## 
## Formula: price ~ 100 * exp(-beta0 * T - (beta1 * T^2)/2 - (beta2 * T^3)/3 - 
##     (T > 15) * (beta3 * (T - 15)^3)/3)
## 
## Parameters:
##         Estimate Std. Error t value Pr(>|t|)    
## beta0  5.927e-02  7.385e-04  80.257  < 2e-16 ***
## beta1 -7.393e-04  2.560e-04  -2.888  0.00652 ** 
## beta2 -1.727e-05  1.544e-05  -1.119  0.27073    
## beta3  7.150e-05  6.993e-05   1.023  0.31334    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.3188 on 36 degrees of freedom
## 
## Number of iterations to convergence: 4 
## Achieved convergence tolerance: 3.396e-06

Muestra los eficientes thetas estimados son :

coefSpline = summary(fitSpline)$coef[ , 1]
coefSpline
##         beta0         beta1         beta2         beta3 
##  5.926748e-02 -7.393285e-04 -1.727377e-05  7.150379e-05

b) Grafique la curva de rendimientos empirica y la curva de rendimientos estimada en una misma figura. Curva con Nelson Siegel

Genera el tiempo de madurez de 0 a 25 de 40 unidades, y muestra la curva Curva de rendimientos empirica.

t <- seq(0, 25, length = 40)
emp <- -diff(log(price))/diff(T)

Estima las tasas forward atravez de spline.

forwardSpline = coefSpline[1] + (coefSpline[2] * t) +
  (coefSpline[3] * t^2) + (t > 15) * (coefSpline[4] * (t - 15)^2)

Genera el grafico de la curva de rendimientos empirica y la curva de rendimientos estimada.

plot(T[2:length(T)], emp, ylim = c(0.025, 
                                   0.075), xlab = "madurez", ylab = "empirical forward rate", 
     type = "b", cex = 0.75, lwd = 2, 
     main = "US Treasury STRIPs - 1995")
lines(forwardSpline, col=4)
legend("bottomleft",legend=c("Curva de rendimientos empirica","curva de rendimientos estimada"),
       col=c(1,4),lty=1)

2. Un bono cupon cero con valor nominal $ 1000 dolares y madures a 5 años se vende a $ 828 dolares. Asuma que existe una tasa forward r de capitalizacion continua y constante.

a) Determine el valor de r.

vf = 1000
vp = 828
n = 5
r_2a = ((vf/vp) ^ (1/n) ) - 1
r_2a
## [1] 0.03846995

El valor de r es 3.85 %

b) Suponga que en 1 año la tasa r cambia a 4.25 %. ¿Cual es el precio del bono?

vf = 1000
r_2b = 0.0425
n = 5
P_2b = vf / ((1+r_2a) * (1+r_2b)^(n-1)) 
P_2b
## [1] 815.2707

El precio del bono es $ 815.27 dolares.

c) Si compro el bono a $ 828 dolares y lo vendio 1 año despues al precio determinado en (b).

Determine el retorno neto.

P_2b = 815.2707
vp = 828
ValorINv  =  vp - P_2b 
ValorINv
## [1] 12.7293

El valor de la inversion es $ 12.7293 dolares.

P_2b = 815.2707
vp = 828
Retor_neto  =  (vp - P_2b)  / vp
Retor_neto
## [1] 0.01537355

El retorno neto es 1,53 %.

3. Suponga que la tasa forward es:

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

  1. Cual es el rendimiento al vencimiento de un bono a 20 años.
r_3a <- function(t) {
  tasaforw <- numeric() 
  {
    0.028 + 0.00042*t}
}
r3a <- r_3a(t=20) 
r3a
## [1] 0.0364
t=20
D_20 <- exp(-r3a*t)
y_3a <- -log(D_20)/t
y_3a
## [1] 0.0364

El rendimiento al vencimiento de un bono a 20 años es 3.64 %

b) Cual es el precio de un bono cupon cero con valor nominal $ 1 000 dolares y madurez a 15 años.

r_3b <- function(t) {
  tasaforw <- numeric() 
  {
    0.028 + 0.00042*t}
}
r3b <- r_3b(t=15) 
r3b
## [1] 0.0343
t=15
D_15 <- exp(-r3b*t)
y_3b <- -log(D_15)/t
y_3b
## [1] 0.0343
t=15
vf = 1000
y_3b = 0.0364
Pb_3b <- vf / (exp(y_3b*t))
Pb_3b
## [1] 579.2622

El precio de un bono cupon cero es $ 579.26 dolares.

4. Suponga que la tasa forward es:

\[ r(t) = 0,028 + 0,0002t - 0,0003t^2\]

a) Cual es el rendimiento al vencimiento de un bono a 8 años.

r_4a <- function(t) {
  tasaforw <- numeric() 
  {
    0.028 + 0.0002*t - 0.0003*(t^2)}
}
r4a <- r_4a(t=8) 
r4a
## [1] 0.0104
t=8
D_8 <- exp(-r4a*t)
y_4a <- -log(D_8)/t
y_4a
## [1] 0.0104

El rendimiento al vencimiento de un bono es 1.04 %

b) Cual es el precio de un bono cupon cero con valor nominal $ 1 000 y madures a 5 años.

r_4b <- function(t) {
  tasaforw <- numeric() 
  {
    0.028 + 0.0002*t - 0.0003*(t^2)}
}
r4b <- r_4b(t=5) 
r4b
## [1] 0.0215
t=5
D_5 <- exp(-r4b*t)
y_4b <- -log(D_5)/t
y_4b
## [1] 0.0215
vf = 1000
m = 5
Pb_4b <- vf / (exp(y_4b*t))
Pb_4b
## [1] 898.0765

El precio de un bono cupon cero es $ 898.07 dolares.

c) Grafique la curva de rendimiento y tasas forward. ¿Cuales son concavas y cuales son convexas? ¿Como se diferencian?

Rta: la curva de tasas forward presenta convexidad conparado con la curva de rendimiento. La curva de rendimiento presenta una ligera concavidad, en conparacion con la curva de tasas forward, y tambien una tendencia a la baja.

matur <- seq(0, 25, length = 40)
intForward = matur * forwardSpline
xout = seq(0, 25, length = 200)
z1 = spline(matur, intForward, xout = xout)
forward = diff(z1$y) / diff(z1$x)
T_grid = (xout[-1] + xout[-200]) / 2
plot(T_grid, forward, type = "l", lwd = 2, ylim = c(0.01, 0.09))
lines(forwardSpline, col=4)
legend("topleft",legend=c("Tasas forwards","curva de rendimientos"),
       col=c(1,4),lty=1)

d) Suponga que compra un bono cupon cero con vencimiento a 10 años y los vende un año despues. ¿Cual sera el retorno si la tasa forward no cambia en ese año?

t = 10
D_10 <- exp(-r4b*t)
y_4d <- -log(D_10)/t
Pb_4d <- vf / (exp(y_4d*t))
Pb_4d
## [1] 806.5414
t = 10
Pb_4d_1 <- vf / (exp(y_4d*(t-1)))
retorno_4d <- (Pb_4d_1 - Pb_4d)/ Pb_4d
retorno_4d
## [1] 0.02173279

El retorno es de 2.17 %

5. El siguiente codigo calcula el precio de un bono dado el pago del cupon, madurez del bono, retorno a la madurez y valor nominal.

bondvalue = function (c, T, r, par)
{
  # Calcula bv = valores de bonos (precios actuales) 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
  #
  bv = c / r + (par - c / r) * (1 + r)^( -2 * T)
  bv
}

a) Utilice la funcion uniroot() para encontrar la madurez de un bono con madurez a 30 años y valor nominal de $ 1000 dolares con cupones de $ 40 dolares que se vende a $ 1200 dolares.

price = 1200 # precio actual del bono
c = 40 # cupón de pago
T= 30 # tiempo hasta la madurez
par = 1000 # valor nominal del bono
r = seq(0.02, 0.05, length = 300)
value5a = bondvalue(c, T, r, par)
yield5a = spline(value5a, r, xout = price) # interpolación spline
yield5a
## $x
## [1] 1200
## 
## $y
## [1] 0.03239813

El retorno a la madurez de un bono es de 3.24 %

plot(r, value5a, xlab = "Rendimiento al vencimiento", ylab = "precio del bono",
     type = "l", main = "par = 1000, coupon payment = 40, T = 30", lwd = 2)
abline(h = 1200)
abline(v = yield5a)

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 dolares y madurez de 8 años

price = 9800 # precio actual del bono
c = 280 # cupón de pago
T = 8 * 2 # tiempo hasta la madurez
par = 10000 # valor nominal del bono
r = seq(0.02, 0.05, length = 300)
value5b = bondvalue(c, T, r, par)
yield5b = spline(value5b, r, xout = price) # interpolación spline
yield5b
## $x
## [1] 9800
## 
## $y
## [1] 0.0289672

El retorno a la madurez de un bono es de 2.89 %

plot(r, value5b, xlab = "Rendimiento al vencimiento", ylab = "precio del bono",
     type = "l", main = "par = 10000, cupón de pago = 40, T = 8", lwd = 2)
abline(h = 9800)
abline(v = yield5b)

c) Utlice la funcion 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 dolares.

price = 1050 # precio actual del bono
c = 35 # cupón de pago
T = 20*2 # tiempo hasta la madurez
par = 1000 # valor nominal del bono
r = seq(0.02, 0.05, length = 300)
value5c = bondvalue(c, T, r, par)
yield5c = spline(value5c, r, xout = price) # spline interpolation
yield5c
## $x
## [1] 1050
## 
## $y
## [1] 0.03320829

El retorno a la madurez de un bono es de 3.32 %

plot(r, value5c, xlab = "Rendimiento al vencimiento", ylab = "precio del bono",
     type = "l", main = "par = 1000, cupón de pago = 35, T = 20", lwd = 2)
abline(h = 1050)
abline(v = yield5c)

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 dolares y madurez a 5 años. ¿Cual es el valor del cupon?

Suponiendo que el rendimiento al vencimiento refleja el rendimiento promedio esperado del bono durante su vida restante hasta el vencimiento. la tasa cupon es la multiplicacioon 0.035 por el valor nominal 1000 igual a $ 35.

price = 950.10 # precio actual del bono
c = 0.035*par #   cupón de pago
T = 5 # tiempo hasta la madurez
par = 1000 # valor nominal del bono
r = seq(0.02, 0.05, length = 300)
value5d = bondvalue(c, T, r, par)
yield5d = spline(value5d, r, xout = price) # spline 
yield5d 
## $x
## [1] 950.1
## 
## $y
## [1] 0.04118868

El retorno a la madurez de un bono es de 4.11 %

plot(r, value5d, xlab = "Rendimiento al vencimiento", ylab = "precio del bono",
     type = "l", main = "par = 1000, cupón de pago = 35, T = 5", lwd = 2)
abline(h = 950.10)
abline(v = yield5d)