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