1. BONOS

Es un valor emitido con un acuerdo de préstamo, con un flujo de efectivo hasta el vencimiento; donde los inversores reciben el valor nominal al final del periodo del contrato.

El precio del bono, se halla a través del valor presente, donde se usa la idea de una anualidad que paga: (c/m)P (donde “c” es la tasa de cupón por año, “m” es el número de períodos que ocurren los flujos de efectivo por año y “P” es el valor nominal) por periodo para mT periodos(donde “T” es el número de años hasta la madurez); con ello se obtiene una fórmula para la suma del valor presente de los pagos de cupones del activo.

Un ejemplo de aplicación sería crear la sigueinte función tipo objetivo para determinar el precio de un bono, con los símbolos antes ya mencionados, donde tendremos un bono que paga dos veces al año, es deicr pagos semestrales, por lo que si el bono tiene una fecha de vencimiento de 10 años, el flujo tendría 20 periodos (mT=20), un valor nominal de 100, una tasa cupón de 0.05

#valor presente con rendimientos positivos
c <- 0.05
P <- 100
y <- c(0.04, 0.05, 0.06)
m <- 2
T <- 10
(Valor_presente <- (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

En ese código, básicamente se ha asigando valores a cada parte que conforma el valor presente del bono y luego se ha hecho la operación matemáticamente.

Luego, corremos el mismo código pero con tasas negativas, dado que en tiempos de incertidumbre son los que más de obtienen:

#valor presente con rendimientos negativos
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

Esto evidencia que el bono paga una tasa mayor que la del mercado, es decir, los inversores estarían pagando más de lo normal para compensar la diferencia.

El rendimiento en este modelo es un promedio de las tasas a plazo que los mercados utilizaron para fijar el precio de los flujos de efectivo futuros durante períodos de tiempo futuros.Pero, si se quiere usar una tasa futuro cambiante , lo correcto será usar el pasado como punto clave para el futuro y así calibrar las tasas, en una curva de tasas vs vencimientos.

Una spline es una función que se construye por partes, a partir de funciones polinómicas; si esto lo llevamos a efecto de finanzas en bonos, sería que cada polinomio forman parte del término de estructura de tasa de interés. Más adelante, se construirá una spline de regresión polinómica a partir de los datos de cupón cero del Tesoro de EE. UU.

(m <- 365 * 24 * 60)
## [1] 525600
(y <- 1)
## [1] 1
(P <- 1/(1 + (y/m))^m)
## [1] 0.3678798

En el código anterior lo que se quizo efectuar es el precio de un bono cuando se capitaliza minuto a minuto (m), con una tasa de rendimiento del 100% y la fórmula es de un bono cupón cero (con la ayuda de Bernoulli), donde el inversor paga el valor nominal hoy.

Se va a dar los siguientes valores, para desarrollar una relacipon entre precios de cupón cero con sus respectivos vencimientos:

maturity <- c(1, 5, 10, 20, 30)  # in years
price <- c(99, 98, 96, 93, 89)  # in percentage of face value

Se va a calcular el log del precio sobre 100, para luego encontrar las tasas a plazo con la función forward:

(forward <- -diff(log(price))/diff(maturity))
## [1] 0.002538093 0.004123857 0.003174870 0.004396312

Luego se encuentra la curva de rendimiento hasta el periodo final y se recupera los precios de los bonos con la función inicial e integral:

(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
# se hace una integración continua de tasas, a través de los rendimientos
(price <- 100 * exp(-forward.integrate))
## [1] 99 98 96 93 89
# valor presente de recibir todo el monto completo del valor facial

Ahora se ejecuta el logaritmo natural del precio del bono

(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

Al parecer -log(price/100) nos daba de forma directa el rendimiento al vencimiento, pero si use usa “diff” veremos que también nos dan tasas, pero distintas, dado que estan en tiempo continuo.

(-diff(log(price/100)))
## [1] 0.01015237 0.02061929 0.03174870 0.04396312

De este análisis se difiere que: las tasas de interés son simplemente tasas de cambio de los valores actuales en relación con el tiempo de la madurez de los bonos.

Ahora si hacemos esto:

(-diff(price/100)/(price[-length(price)]/100))
## [1] 0.01010101 0.02040816 0.03125000 0.04301075

Nos daremos cuenta que son cambios porcentuales discretos, los cuales son similares, pero no iguales, que la versión continua (usando log ()).

En síntesis la tasa de capitalización continua es cuando los periodos de capitalización son los más pequeños posibles (el número de períodos de capitalización durante el tiempo de la operación financiera crece indefinidamente), es por ello que trabajan con logaritmo y las tasas de interés discreta es cuando el periodo de capitalización esta medido en intervalos fijos de tiempo.

2. PARÁMETROS DE LAS TASAS FORWARDS

Se trabajará con un conjunto de datos, donde se rescatarán los precios y los vencimientos de los bono cupón cero de US, es decir, pagan el valor nominal al vencimiento.

dat <- read.table("https://turing.manhattan.edu/~wfoote01/finalytics/RMD/data/strips_dec95.txt", header = TRUE)

Para visualizar los datos, de forma general:

head(dat, n = 3)
##        T  price
## 1 0.1260 99.393
## 2 0.6219 96.924
## 3 1.1260 94.511
names(dat)
## [1] "T"     "price"
dat <- dat[order(dat$T), ]

Ahora graficaremos la relación de los distintos precios y sus respectivos tiempos de madurez. Con lo cual nos da los “STRIPS” (Separated Trading of Registered Interest and Principal). El strip de deuda es una segregación (separación) de un título de renta fija en varias partes.

plot(dat$T, dat$price, main = "STRIPS", 
    xlab = "Maturity", ylab = "Price")

El código de la curva forward empírica es la siguiente donde se aplica el logaritmo del precio sobre el logaritmo del tiempo de madurez y todo ello afecto por la función “diff”

t <- seq(0, 30, length = 100)
emp <- -diff(log(dat$price))/diff(dat$T)

Se procede a la gráfica de la curva forward empírica; donde “ylim” hace zoom en el rango de datos del eje y, “lwd” cambia el ancho de línea, “xlab” especifica la etiqueta del eje x, “ylab” especifica la etiqueta del eje y, “type” especifica la línea, “cex” cambia la escala de texto y símbolos y “main” especifica el título de la gráfica.

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")

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

Ahora hacemos un acercamiento en el rango de datos del eje x (“xlim”)

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")

Donde el t=14 parece haber un valor atípico y en t=15 hay un descanso, lo cual dá un nudo natural; por lo que se sospecharía el uso de una spline.

3. DESARROLLANDO UN SPLINE

Ahora se agrega una curva en la curva de rendimiento, lo que permite dos funciones cuadráticas diferentes: una antes de la curva y otra después de la curva. De dicho cálculo lo importante en este caso será hallar el mejor conjunto de parámetros “tetas”, mediante la función “nls” para mínimos cuadrados no lineales.

fit.spline <- nls(price ~ 100 * exp(-theta_0 * 
    T - (theta_1 * T^2)/2 - (theta_2 * 
    T^3)/3 - (T > 15) * (theta_3 * (T - 
    15)^3)/3), data = dat, start = list(theta_0 = 0.047, 
    theta_1 = 0.0024, theta_2 = 0, theta_3 = -7e-05))

La variable dependiente es el precio, las variables independientes estan dentro del operador: exp(). El parámetro theta_3 muestra el precio del bono en el vencimiento alrededor del nudo en t=15 años (lo que se mencionó en la sección anterior). Para ello, usaremos la función “kable”

library(knitr)
kable(summary(fit.spline)$coefficients, 
    digits = 4)
Estimate Std. Error t value Pr(>|t|)
theta_0 0.0495 1e-04 536.5180 0
theta_1 0.0016 0e+00 51.5117 0
theta_2 0.0000 0e+00 -13.6152 0
theta_3 -0.0002 0e+00 -30.6419 0
(sigma <- (summary(fit.spline)$sigma)^0.5)
## [1] 0.2582649

Todos los coeficientes son significativos y se tiene un error estándar para comparar con otros modelos.

Ahora se efectuará una gráfica con los resultados usando una secuencia de vencimientos T. Lo primero será analizar los coeficientes y luego construir la predicción de spline, a través de los vencimientos T.

coef.spline <- summary(fit.spline)$coef[, 
    1]
forward.spline <- coef.spline[1] + (coef.spline[2] * 
    t)
+(coef.spline[3] * t^2)
##   [1]  0.000000e+00 -2.275161e-06 -9.100644e-06 -2.047645e-05 -3.640258e-05
##   [6] -5.687902e-05 -8.190580e-05 -1.114829e-04 -1.456103e-04 -1.842880e-04
##  [11] -2.275161e-04 -2.752945e-04 -3.276232e-04 -3.845022e-04 -4.459316e-04
##  [16] -5.119112e-04 -5.824412e-04 -6.575215e-04 -7.371522e-04 -8.213331e-04
##  [21] -9.100644e-04 -1.003346e-03 -1.101178e-03 -1.203560e-03 -1.310493e-03
##  [26] -1.421976e-03 -1.538009e-03 -1.658592e-03 -1.783726e-03 -1.913410e-03
##  [31] -2.047645e-03 -2.186430e-03 -2.329765e-03 -2.477650e-03 -2.630086e-03
##  [36] -2.787072e-03 -2.948609e-03 -3.114695e-03 -3.285332e-03 -3.460520e-03
##  [41] -3.640258e-03 -3.824546e-03 -4.013384e-03 -4.206773e-03 -4.404712e-03
##  [46] -4.607201e-03 -4.814241e-03 -5.025831e-03 -5.241971e-03 -5.462662e-03
##  [51] -5.687902e-03 -5.917694e-03 -6.152035e-03 -6.390927e-03 -6.634369e-03
##  [56] -6.882362e-03 -7.134905e-03 -7.391998e-03 -7.653642e-03 -7.919835e-03
##  [61] -8.190580e-03 -8.465874e-03 -8.745719e-03 -9.030114e-03 -9.319059e-03
##  [66] -9.612555e-03 -9.910601e-03 -1.021320e-02 -1.052034e-02 -1.083204e-02
##  [71] -1.114829e-02 -1.146909e-02 -1.179443e-02 -1.212433e-02 -1.245878e-02
##  [76] -1.279778e-02 -1.314133e-02 -1.348943e-02 -1.384208e-02 -1.419928e-02
##  [81] -1.456103e-02 -1.492733e-02 -1.529818e-02 -1.567358e-02 -1.605354e-02
##  [86] -1.643804e-02 -1.682709e-02 -1.722069e-02 -1.761885e-02 -1.802155e-02
##  [91] -1.842880e-02 -1.884061e-02 -1.925696e-02 -1.967787e-02 -2.010332e-02
##  [96] -2.053333e-02 -2.096788e-02 -2.140699e-02 -2.185065e-02 -2.229885e-02
+(t > 15) * (coef.spline[4] * (t - 15)^2)
##   [1]  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00
##   [6]  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00
##  [11]  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00
##  [16]  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00
##  [21]  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00
##  [26]  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00
##  [31]  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00
##  [36]  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00
##  [41]  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00
##  [46]  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00
##  [51] -4.048396e-06 -3.643557e-05 -1.012099e-04 -1.983714e-04 -3.279201e-04
##  [56] -4.898560e-04 -6.841790e-04 -9.108892e-04 -1.169987e-03 -1.461471e-03
##  [61] -1.785343e-03 -2.141602e-03 -2.530248e-03 -2.951281e-03 -3.404701e-03
##  [66] -3.890509e-03 -4.408704e-03 -4.959286e-03 -5.542255e-03 -6.157611e-03
##  [71] -6.805354e-03 -7.485485e-03 -8.198003e-03 -8.942908e-03 -9.720200e-03
##  [76] -1.052988e-02 -1.137195e-02 -1.224640e-02 -1.315324e-02 -1.409247e-02
##  [81] -1.506408e-02 -1.606809e-02 -1.710448e-02 -1.817325e-02 -1.927442e-02
##  [86] -2.040797e-02 -2.157390e-02 -2.277223e-02 -2.400294e-02 -2.526604e-02
##  [91] -2.656153e-02 -2.788940e-02 -2.924966e-02 -3.064231e-02 -3.206735e-02
##  [96] -3.352477e-02 -3.501458e-02 -3.653678e-02 -3.809136e-02 -3.967833e-02
summary(fit.spline)
## 
## Formula: price ~ 100 * exp(-theta_0 * T - (theta_1 * T^2)/2 - (theta_2 * 
##     T^3)/3 - (T > 15) * (theta_3 * (T - 15)^3)/3)
## 
## Parameters:
##           Estimate Std. Error t value Pr(>|t|)    
## theta_0  4.947e-02  9.221e-05  536.52   <2e-16 ***
## theta_1  1.605e-03  3.116e-05   51.51   <2e-16 ***
## theta_2 -2.478e-05  1.820e-06  -13.62   <2e-16 ***
## theta_3 -1.763e-04  5.755e-06  -30.64   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.0667 on 113 degrees of freedom
## 
## Number of iterations to convergence: 4 
## Achieved convergence tolerance: 2.468e-06
plot(t, forward.spline, type = "l", lwd = 2, 
    ylim = c(0.03, 0.075), xlab = "t", 
    ylab = "Forward.spline")
points(dat$T[2:length(dat$T)], emp, pch = "*", 
    cex = 1.5)