\[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\).
\(\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.001,
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)^(n-1))
P_2b
## [1] 815.2707
El precio del bono es $ 815.27 dolares.
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 %.
\[r(t) = 0.028 + 0.00042t\]
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
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.
\[ r(t) = 0,028 + 0,0002t - 0,0003t^2\]
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 %
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.
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
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 %
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
}
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.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)
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)
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)