###5.1 LOS BONOS###
Las coorporaciones financian sus operaciones vendiendo stocks y bonos.
Los bonos son intrumentos financieros en el que se paga un monto fijo de flujo de dinero para la madurez del bono con un pago adicional de el principal del bono en la madurez.
SE PUEDE FORMULAR DE LA SIGUIENTE MANERA:
c <- 0.05
P <- 100
y <- c(0.04, 0.05, 0.06)
m <- 2
T <- 10
(V <- (c/m) * P * (1/(y/m) - 1/((y/m) *
(1 + (y/m))^(m * T))) + P/(1 + (y/m))^(m *
T))
## [1] 108.17572 100.00000 92.56126
DONDE:
V: es el valor actual del bono T: es el numero de años hasta la madurez del bono m: es el numero de periodos de flujo de dinero que ocurren por año y: es el rendimiento del bono por a?o P: es el principal del bono
##BONOS NEGATIVOS###
Tambien podemos tener bonos con rendimiento negativo. Esto se da cuando un inversionista compara un bono con un precio mayor a su face value. Si el valor total del interes del bono a pagar sobre su tiempo de vida es es menor que la prima que pago inversor por el bono, este pierde dinero, por lo tanto el bono es considerado con rendimiento negativo.
POR LO TANTO:
c <- 0.05
P <- 100
y <- c(-0.02, -0.01, 0, 0.01, 0.02)
m <- 2
T <- 10
(V <- (c/m) * P * (1/(y/m) - 1/((y/m) *
(1 + (y/m))^(m * T))) + P/(1 + (y/m))^(m *
T))
## [1] 177.9215 163.2689 NaN 137.9748 127.0683
El rendimiento en este modelo es el promedio de los forward rates que los mercados usan para valorar los flujos de efectivo futuros durante periodos de tiempo futuros.
###5.2 SPLINES ###
Las regresiones polinomicas en modelamiento matematico solamente capturan una parte de la curvatura en asociaciones no lineares. Se necesitaria polinomios de alto grado para capturar toda la complejidad de la data. Una alternativa para el modelamiento de asociaciones no lineares es el uso de splines.
Los splines, dan una solucion que producen un “smooth interpolation” esto es que produce una funcion que captura los patrones importantes de la data sin grandes variaciones entre valores de la data.Un spline cuenta con segmentos y puntos de cortes “knots” que determinan estos segmentos que pueden ser internos y externos (valor minimo y maximo en la data).
##DAREMOS ALGUNOS EJEMPLOS##
SUPONEMOS:
y = 100 m = 365×24×60 = 525600
luego P es el valor actual de el flujo de dinero del 100 face value at maturity.
(m <- 365 * 24 * 60)
## [1] 525600
(y <- 1)
## [1] 1
(P <- 1/(1 + (y/m))^m)
## [1] 0.3678798
##OTROS EJEMPLOS##
maturity <- c(1, 5, 10, 20, 30) # in years
price <- c(99, 98, 96, 93, 89) # in percentage of face value
log(price)/100
## [1] 0.04595120 0.04584967 0.04564348 0.04532599 0.04488636
(forward <- -diff(log(price))/diff(maturity))
## [1] 0.002538093 0.004123857 0.003174870 0.004396312
log(price)
## [1] 4.595120 4.584967 4.564348 4.532599 4.488636
price
## [1] 99 98 96 93 89
(forward.initial <- -log(price[1]/100))
## [1] 0.01005034
(forward.integrate <- c(forward.initial,
forward.initial + cumsum(forward *
diff(maturity))))
## [1] 0.01005034 0.02020271 0.04082199 0.07257069 0.11653382
# a rolling integration of rates
# across maturities
(price <- 100 * exp(-forward.integrate))
## [1] 99 98 96 93 89
# present value of receiving 100% of
# face value
(forward <- -diff(log(price/100))/diff(maturity))
## [1] 0.002538093 0.004123857 0.003174870 0.004396312
(-log(price/100))
## [1] 0.01005034 0.02020271 0.04082199 0.07257069 0.11653382
-log(price/100)
## [1] 0.01005034 0.02020271 0.04082199 0.07257069 0.11653382
(-diff(log(price/100)))
## [1] 0.01015237 0.02061929 0.03174870 0.04396312
(-diff(price/100)/(price[-length(price)]/100))
## [1] 0.01010101 0.02040816 0.03125000 0.04301075
Estos son los rates, son continuas versiones del tiempo del porcentaje de cambio o crecimiento. Taza de una fecha de vencimiento (maturity) a otra fecha de vencimiento. Podemos usar los resultados para realizar una explicacion.
##ROLLING THE INTEGRATION##
Rolling “integration” es un proceso de acumulacion que consiste en agregar mas forward rates cando el tiempo de madurez avanza.
Yields son la acumulacion de los forward rates. Por lo tanto, el uso de la suma acumulativa como una versión discreta de la integral. La primera forward rate es solo la tasa de descuento en el bono de vencimiento a 1 año almacenado en forward inicial.
forward.initial <- -log(price[1]/100)
(forward.integrate <- c(forward.initial,
forward.initial + cumsum(forward *
diff(maturity))))
## [1] 0.01005034 0.02020271 0.04082199 0.07257069 0.11653382
(price <- 100 * exp(-forward.integrate))
## [1] 99 98 96 93 89
##BOND YIEL Vemos que el time yield en el tiempo siempre es menor que la tasa discreta porque hay muchos más períodos de capitalización continua.
y.T.d <- 0.2499 # Usury rate in NYS; d = discrete, T = maturity in years
(y.T <- log(1 + y.T.d))
## [1] 0.2230635
(y.T.d <- exp(y.T) - 1)
## [1] 0.2499
###5.3 FORWARD RATE PARAMETERS###
Aqui se puede ver la informacion de US Treasury STRIPS (Separate Trading of Registered Interest and Principal of Securities). Se muestra los precios y la madures de los bonos de cupo zero. Mas informacion en https://www.newyorkfed.org/aboutthefed/fedpoint/fed42.html.
La data es del periodo del 31 Diciembre de 1995.Hay 117 precios y las maturities (vencimientos) estan espaciados de 0 a 30 años.
GRAFICO DE PRECIOS DE LOS U.S. STRIPS: Como se puede observar en el plot, podemos decir que el precio disminuye con el tiempo de madurez del bono.
# The data is in a directory called
# data that is a sub-directory of the
# directory from which this code
# executes.
dat <- read.table("https://turing.manhattan.edu/~wfoote01/finalytics/RMD/data/strips_dec95.txt", header = TRUE)
head(dat)
## T price
## 1 0.1260 99.393
## 2 0.6219 96.924
## 3 1.1260 94.511
## 4 1.6219 92.070
## 5 2.1260 89.644
## 6 2.6219 87.295
names(dat)
## [1] "T" "price"
dat <- dat[order(dat$T), ]
plot(dat$T, dat$price, main = "STRIPS",
xlab = "Maturity", ylab = "Price", col = 'blue')
###EMPIRICAL fORWARD CURVE##
En la practica la funcion forward rate es desconocida, solo los precios de los bonos son conocidos. Si conocemos los precios de los bonos en un relativo rango de valores de T1<T2…<Tn, podemos estimar el forward rate curve.
t <- seq(0, 30, length = 100)
emp <- -diff(log(dat$price))/diff(dat$T)
Grafico de Empirical forward-rate estimates de los precios: Se observa en el grafico que las estimiciones empiricas de forward-rate pueden ser bastante ruidosas cuando los denominadores en son pequeños porque los vencimientos (maturities) estan muy juntos. Las estimaciones empiricas de la tasa de interes dan una impresion general de la forward-rate curve y son utiles para comparar con estimaciones de modelos parametricos, que se analizan:
plot(dat$T[2:length(dat$T)], emp, ylim = c(0.025,
0.075), xlab = "maturity", ylab = "empirical forward rate",
type = "b", cex = 0.75, lwd = 2,
main = "US Treasury STRIPs - 1995", col = 'blue')
length(dat$T)
## [1] 117
head(dat$T[2:length(dat$T)])
## [1] 0.3699 0.6219 0.8740 1.1260 1.3699 1.6219
##AMPLIACION DEL GRAFICO##
En el grafico anterior podemos ver que existen outliers en nuestra data en el punto 11 y 14 de maturity. Se puede apreciar que apartir del T=15 hay un cambio “break” en la tendencia del empirical forward rate de una tendencia positiva a una negativa. En ese punto se puede ubicar el internal knot y dividir la data en 2 segmentos creciente y decreciente y estimar 2 polinomias que se unen a nivel del internal not, por eso es muy importante.
# Now the zoom in:
plot(dat$T[2:length(dat$T)], emp, xlim = c(10,
20), ylim = c(0.025, 0.075), xlab = "maturity",
ylab = "empirical forward rate",
type = "b", cex = 0.75, lwd = 2,
pin = c(3, 2), main = "US Treasury STRIPS - 1995", col = 'blue')
##COMPARANDO SPLINES WITH CUADRATRIC MODELS##
Realizaremos graficos de la forward curve basado en 2 modelos ajustados: El polinomio cuadratico tipo spline y el polinomio cuadratico para compararlos.
##SPLINES##
Para el grafico basado en el Forward curve en el polinomio cuadratico tipo spline, ubicamos el punto de corte al T=15. En los 2 segmentos se estima un polinomio cuadratico que se unen a nivel del T=15 y una sola curva continua.
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))
coefSpline = summary(fitSpline)$coef[ , 1]
forwardSpline = coefSpline[1] + (coefSpline[2] * t) +
(coefSpline[3] * t^2) + (t > 15) * (coefSpline[4] * (t - 15)^2)
plot(t, forwardSpline, type = "l", lwd = 2,
ylim = c(0.03, 0.075), xlab = "Maturity",
ylab = "Forward Rate", main = "US Treasury STRIPs Forward Curve: 1995", col = "blue")
points(dat$T[2:length(dat$T)], emp, pch = "*",
cex = 1.5)
library(knitr)
kable(summary(fitSpline)$coefficients,
digits = 4)
| Estimate | Std. Error | t value | Pr(>|t|) | |
|---|---|---|---|---|
| beta0 | 0.0495 | 1e-04 | 536.5176 | 0 |
| beta1 | 0.0016 | 0e+00 | 51.5116 | 0 |
| beta2 | 0.0000 | 0e+00 | -13.6152 | 0 |
| beta3 | -0.0002 | 0e+00 | -30.6419 | 0 |
(sigma <- (summary(fitSpline)$sigma)^0.5)
## [1] 0.2582649
##POLINOMIO CUADRATICO##
fit.quad <- nls(price ~ 100 * exp(-theta_0 *
T - (theta_1 * T^2)/2 - (theta_2 *
T^3)/3), data = dat, start = list(theta_0 = 0.047,
theta_1 = 0.0024, theta_2 = 0))
coef.quad <- summary(fit.quad)$coef[,
1]
forward.quad <- coef.quad[1] + (coef.quad[2] *
t) + (coef.quad[3] * t^2)
plot(t, forward.quad, type = "l", lwd = 2,
ylim = c(0.03, 0.075), xlab = "Maturity",
ylab = "Forward Rate", main = "US Treasury STRIPs Forward Curve: 1995", col="red")
points(dat$T[2:length(dat$T)], emp, pch = "*",
cex = 1.5)
##SPLINE VS POLINOMIO CUADRATICO##
El polinomio cuadratico tipo spline (azul) modela mejor la data a diferencia de los polinomios (rojo) tienen dificultades especialmente con los valores extremos.
Los splines: *Producen un mejor modelamiento y un ajuste mas flexible de la data,sus estimaciones son mas estables.
plot(t, forwardSpline, type = "l", lwd = 2,
ylim = c(0.03, 0.075), xlab = "Maturity",
ylab = "Forward Rate", main = "US Treasury STRIPs Forward Curve: 1995", col = "blue")
lines(t, forward.quad, lty = 2, lwd = 2,
col = "red")
points(dat$T[2:length(dat$T)], emp, pch = "*",
cex = 1.5)
legend("bottomleft", legend=c("splines", "cuadratico"),
col=c("blue", "red"), lty=1:2, cex=0.8)