Bonos

En el presente trabajo se busca analizar la comprensión de los flujos de efectivo y la valoración de un bono simple; que viene a ser un instrumento financiero financiero que paga flujos de efectivo fijos por el vencimiento del bono con un reembolso del principal del bono al vencimiento.

                                                 $ V=(c/m)I(1y/m−1(y/m)(1+y/m)mT)+I(1+y/m)mT $

Dónde V es el valor presente del bono, T es el número de años hasta la madurez metro es el número de períodos que ocurren los flujos de efectivo por año, y es el rendimiento del bono por año, C es la tasa de cupón por año, y I es el principal del bono (valor facial o nominal).

Ejemplo 1

Usando la idea de una anualidad que paga (C /m)I por período para T períodos y I al vencimiento T obtenemos una buena fórmula para la suma del valor presente de los pagos de cupones. Nuestro bono típico paga cupones dos veces al año, así que m = 2. Si el vencimiento del bono en años es de 10 años, entonces T=10×2=20 períodos de capitalización. Asumiremos que no hay devengo de intereses a partir de la fecha de valoración del bono por el momento.

c <- 0.05
I <- 100
y <- c(0.04, 0.05, 0.06)
m <- 2
T <- 10
(V <- (c/m) * I * (1/(y/m) - 1/((y/m) * 
    (1 + (y/m))^(m * T))) + I/(1 + (y/m))^(m * 
    T))
## [1] 108.17572 100.00000  92.56126

Los resultados fueron que para una tasa del 4% se obtuvo un valor presente de 108.18, mientras que para la tasa de 5% el valor presente fue de 100, lo que se puede apreciar que a medida que la tasa de interes aumente ocaciona que el precio disminuya, está premisa se puede confirmar con la tasa del 6% que obtuvo un precio de 92.56, por lo que se puede concluir y completar la definicion, agregando que para que el valor presente sea menor que el valor facial el rendimiento debe ser menor a la tasa cupón.

Ejemplo 2

En el siguiente ejemplo tambien podemos ver a mayor detalle el comportamiento del valor presente en función a la variación de la tasa de interes.

c <- 0.05
I <- 100
y <- c(-0.02, -0.01, 0, 0.01, 0.02)
m <- 2
T <- 10
(V <- (c/m) * I * (1/(y/m) - 1/((y/m) * 
    (1 + (y/m))^(m * T))) + I/(1 + (y/m))^(m * 
    T))
## [1] 177.9215 163.2689      NaN 137.9748 127.0683

En los resultados podemos observar que las tasas que son negativas han traido mejor valor presente a comparación de las tasas que son mayor a cero. Una conclusión que se puede dar es que el bono se paga a una tasa mayor que la requerida en el mercado. Los compradores pagan más de lo normal para compensar la diferencia.

Bono Cupón Cero

En esta ocación utilizaremos bonos cupón cero para explicar para poder explicar la capitalización continua. Primero cargamos los datos que se usaran en este ejercicio.

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

El rendimiento en este modelo es un promedio de las tasas forward que los mercados utilizaron para fijar el precio de los flujos de efectivo futuros durante períodos de tiempo futuros.

(forward <- -diff(log(price))/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
(-diff(log(price/100)))
## [1] 0.01015237 0.02061929 0.03174870 0.04396312

Lo que se puede visualizar en los resultado es el crecimiento en tasa porcentuales de un vencimiento a otro. Podemos utilizar estos resultados numéricos para motivar una interpretación: las tasas de interés son simplemente tasas de cambio de los valores actuales en relación con el tiempo que cubren en la madurez.

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

Estos son cambios porcentuales discretos que son similares, pero no iguales, que la log()versión continua. Observe el uso de la indexación de precios para eliminar el último precio, esto para poder calcular la variación del precio de periodo actual con el periodo anterior.

Integracion Continua

La “integración” continua es el precedimiento que trata de que a medida que avanzo el vencimiento se va agregando más tasas de interes en un sistema acumulativo, por lo tanto, se despliega una suma acumulativa o mediante el cusum

(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

Los rendimientos son la acumulación de tasas a plazo. Por lo tanto, el uso de la suma acumulativa como una versión discreta de la integral. Las tarifas se suman (en lugar de multiplicarse: buena característica) cuando usamos logy exp para hacer nuestros precios. La primera tasa a plazo es solo la tasa de descuento en el bono de vencimiento a 1 año almacenado en forward.initial.

(price <- 100 * exp(-forward.integrate))
## [1] 99 98 96 93 89
# valor presente de recibir el 100% de valor facial

Todos los precios de los bonos se recuperan invirtiendo el proceso de producir adelantos a partir de los precios y convirtiéndolos en rendimientos y nuevamente en precios.

Rendimiento del Bono

Ahora calculamos versiones discretas y continuas de tiempo del rendimiento:

y.T.d <- 0.2499  # Tasa de usura en el estado de Nueva York; d = discreto, T = vencimiento en años
(y.T <- log(1 + y.T.d))
## [1] 0.2230635
(y.T.d <- exp(y.T) - 1)
## [1] 0.2499

Observamos que el rendimiento continuo en el tiempo siempre es menor que la tasa discreta porque hay muchos más períodos de capitalización continua.

Parámetros de tasa de avance

Lo que se realiza a continuacion es realizar la carga de los datos; que son de diciembre del 1995, para cupones cero del tesoro de Estados Unidos. El conjunto de datos mostrará los precios y los vencimientos de lo que se conoce como bonos de “cupón cero”, es decir, bonos que solo pagan el valor nominal del bono al vencimiento.

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

¿Cómo se ven los datos? ¿Algo más? Ejecutamos este fragmento de código para obtener una vista preliminar de estos datos.

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"

Leemos en una tabla de texto con un encabezado, observamos las primeras observaciones con head() y ordenamos los datos por madurez Tyo. Una trama simple está en orden ahora.

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

Curva Empírica

Estimamos la curva empírica hacia adelante usando:

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

La ecuación se traduce en R con la diff función. Usaremos el vector t más adelante cuando grafiquemos nuestros modelos de la curva hacia adelante. Definitivamente, véalo desde la consola y consulte ??seqpara obtener más información sobre esta función.

Tracemos las curvas empíricas hacia adelante usando esta línea de código:

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.6219 1.1260 1.6219 2.1260 2.6219 3.1260

Recuperamos el Tvector del datmarco de datos usando dat\(T. Luego lengthdevuelve el número de vencimientos en el datmarco de datos. dat\)T[2:length(dat$T)]trunca la primera observación. ¿Por qué? Debido a que diferenciamos los precios para adelantar las tasas y necesitamos alinear las tasas a plazo con sus respectivos vencimientos Tyo . Aquí está la lista:

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 *main Especifica el título de la trama.

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

A Tyo= 14 parece haber un valor atípico. Más importante aún, hay un descanso en Tyo = 15. Este es un nudo natural . Por lo tanto, la posibilidad de una necesidad de una spline .

Volviendo a los datos: ahora encontramos el θs. La expresión lógica (T>k)es 1 si TRUEy 0 si FALSE. Ponemos la Rversión del precio del bono en la nlsfunción, junto con una especificación del marco de datos daty los valores iniciales.

Ejecute estas declaraciones para calcular la regresión (no lineal) de la estructura de términos:

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 price. Las variables independientes están dentro del Exp() operador e incluyen poderes de Tlos vencimientos de los bonos. El theta_3parámetro expone el precio del bono a movimientos en el vencimiento alrededor del nudo en T = 15 años.

Echemos un vistazo a nuestra obra usando kableel knitrpaquete:

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 tenemos un error estándar para comparar con otros modelos.

Construir una spline

Ahora produzcamos una gráfica de nuestros resultados usando una secuencia de vencimientos T. Nuestra primera tarea es analizar los coeficientes del nls()ajuste de spline y construir la predicción de spline. Aquí construimos la spline de tasa de interés a través de los T vencimientos.

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.275162e-06 -9.100647e-06 -2.047645e-05 -3.640259e-05
##   [6] -5.687904e-05 -8.190582e-05 -1.114829e-04 -1.456103e-04 -1.842881e-04
##  [11] -2.275162e-04 -2.752946e-04 -3.276233e-04 -3.845023e-04 -4.459317e-04
##  [16] -5.119114e-04 -5.824414e-04 -6.575217e-04 -7.371524e-04 -8.213334e-04
##  [21] -9.100647e-04 -1.003346e-03 -1.101178e-03 -1.203561e-03 -1.310493e-03
##  [26] -1.421976e-03 -1.538009e-03 -1.658593e-03 -1.783727e-03 -1.913411e-03
##  [31] -2.047645e-03 -2.186430e-03 -2.329766e-03 -2.477651e-03 -2.630087e-03
##  [36] -2.787073e-03 -2.948609e-03 -3.114696e-03 -3.285333e-03 -3.460521e-03
##  [41] -3.640259e-03 -3.824547e-03 -4.013385e-03 -4.206774e-03 -4.404713e-03
##  [46] -4.607202e-03 -4.814242e-03 -5.025832e-03 -5.241972e-03 -5.462663e-03
##  [51] -5.687904e-03 -5.917695e-03 -6.152037e-03 -6.390929e-03 -6.634371e-03
##  [56] -6.882364e-03 -7.134907e-03 -7.392000e-03 -7.653644e-03 -7.919838e-03
##  [61] -8.190582e-03 -8.465877e-03 -8.745721e-03 -9.030117e-03 -9.319062e-03
##  [66] -9.612558e-03 -9.910604e-03 -1.021320e-02 -1.052035e-02 -1.083204e-02
##  [71] -1.114829e-02 -1.146909e-02 -1.179444e-02 -1.212434e-02 -1.245879e-02
##  [76] -1.279778e-02 -1.314133e-02 -1.348943e-02 -1.384208e-02 -1.419928e-02
##  [81] -1.456103e-02 -1.492734e-02 -1.529819e-02 -1.567359e-02 -1.605354e-02
##  [86] -1.643804e-02 -1.682710e-02 -1.722070e-02 -1.761885e-02 -1.802156e-02
##  [91] -1.842881e-02 -1.884061e-02 -1.925697e-02 -1.967787e-02 -2.010333e-02
##  [96] -2.053333e-02 -2.096789e-02 -2.140700e-02 -2.185065e-02 -2.229886e-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.643556e-05 -1.012099e-04 -1.983714e-04 -3.279201e-04
##  [56] -4.898559e-04 -6.841789e-04 -9.108891e-04 -1.169986e-03 -1.461471e-03
##  [61] -1.785343e-03 -2.141601e-03 -2.530248e-03 -2.951281e-03 -3.404701e-03
##  [66] -3.890509e-03 -4.408703e-03 -4.959285e-03 -5.542254e-03 -6.157610e-03
##  [71] -6.805354e-03 -7.485484e-03 -8.198002e-03 -8.942907e-03 -9.720199e-03
##  [76] -1.052988e-02 -1.137194e-02 -1.224640e-02 -1.315324e-02 -1.409247e-02
##  [81] -1.506408e-02 -1.606808e-02 -1.710447e-02 -1.817325e-02 -1.927441e-02
##  [86] -2.040796e-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.206734e-02
##  [96] -3.352477e-02 -3.501458e-02 -3.653677e-02 -3.809136e-02 -3.967833e-02