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\).

  1. Cuales son sus estimaciones para: \(theta_1,theta_2,theta_3 y 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.

  1. 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 %

  1. 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)^4) 
P_2b
## [1] 815.2707

El precio del bono es 815.27 dolares.

  1. 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
retorno_neto  =  vp - P_2b 
retorno_neto
## [1] 12.7293

El retorno neto es 12.7293 dolares.

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 %

  1. Cual es el precio de un bono cupon cero con valor nominal 1 000 dolares y madures 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
vf = 1000
r_3b = 0.0364
Pb_3b <- vf / (exp(y_3b*t))
Pb_3b
## [1] 597.7994

El precio de un bono cupon cero es 597.7994 dolares.

4. Suponga que la tasa forward es r(t) = 0,028 + 0,0002t - 0,0003t^2

  1. 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) 
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 %

  1. 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) 
t=5
D_5 <- exp(-r4b*t)
y_4b <- -log(D_5)/t
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.0765 dolares.

  1. 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)

  1. 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
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
}

Utilice la funcion uniroot() para resolver las siguiente preguntas.

  1. Utilice la funcion uniroot() para encontrar la madurez de un bono con madurez a 30 años y valor nominal de 1 000 dolares con cupones de 40 dolares que se vende a 1 200 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)

  1. 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.896 %

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)

  1. 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)

  1. 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?
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)