INTRODUCCIÓN

La volatilidad es una característica inherente a las series de tiempo financieras. En general, no es constante y en consecuencia los modelos de series de tiempo tradicionales que suponen varianza homocedástica, no son adecuados para modelar series de tiempo financieras. Engle (1982) introduce una nueva clase de procesos estocásticos llamados modelos ARCH, en los cuales la varianza condicionada a la información pasada no es constante, y depende del cuadrado de las innovaciones pasadas. Bollerslev (1986) generaliza los modelos ARCH al proponer los modelos GARCH en los cuales la varianza condicional depende no solo de los cuadrados de las perturbaciones, como en Engle, sino además, de las varianzas condicionales de períodos anteriores. En 1991, Nelson presenta los modelos EGARCH, en los cuales formula para la varianza condicional un modelo que no se comporta de manera simétrica para perturbaciones positivas y negativas, como sucede en los modelos GARCH; expresando otro rasgo de la volatilidad: su comportamiento asimétrico frente a las alzas y bajas de los precios de un activo financiero. Un elevado número de trabajos sobre modelos de volatilidad se han publicado en las últimas décadas. Ver Poon y Granger (2003), Hansen y Lunde (2006) y Novales y Gracia (1993).

Los activos financieros son activos intangibles, dado que su valor o beneficio es una obligación de dinero a futuro. Por ejemplo, un bono es una obligación financiera contraída por el inversionista; o puede ser considerado como un certificado de deuda, es decir, una promesa de pago futura documentada en un papel y que determina monto, plazo, moneda y secuencia de pagos. Cuando un inversionista compra un bono, está prestando su dinero a un gobierno, a un ente territorial, a una agencia del Estado, a una corporación o a una compañía. En contraprestación a este préstamo, el emisor acuerda pagar al inversionista unos intereses durante la vida del bono, hasta que éste llegue a su vencimiento, reembolsando la cantidad prestada. Otro ejemplo de un activo financiero son las acciones; cada una de las cuales da derecho al inversionista a recibir dividendos, distribuidos por la compañía que emite la acción; estos pagos estarán relacionados con las ganancias de la empresa. A diferencia de los bonos, el poseedor de una acción común no tiene certeza de la cantidad, ni del momento en que se paguen los dividendos.

Sea \(P_t\) , \(t = 1, 2, \cdots ,n\) el precio de un activo en el tiempo \(t\). Asumiendo que el activo no paga dividendos, su tenencia por un período de tiempo, desde \(t-1\) hasta \(t\), producirá un retorno simple definido como: \[R_t=\frac{\ P_t-P_t-_1}{P_t-_1}\]

Librerías a cargar

No significa que todas estas librerías se lleguen a utilizar dentro de este ejercicio, pero siempre es útil tenerlas por si en algún momento se requieren.

Cargamos los datos desde Yahoo Finance

getSymbols("SU.PA", from = "2000-01-03")
## [1] "SU.PA"

Observamos los Datos

view(SU.PA)

Gráficos

En este caso, utilizaremos el Precio Ajustado de la acción, ya que es el mejor ídice que se tiene para la acción.

#Primera forma de graficar
plot(SU.PA$SU.PA.Adjusted, main = "Precio Ajustado")

#Segunda forma de graficar
autoplot(SU.PA$SU.PA.Adjusted) + labs(title = "Precio Ajustado de las acciones de  Schneider Electric") + xlab("Tiempo") + ylab("Precio Ajustado")

#Tercera forma de graficar
chart_Series(SU.PA$SU.PA.Adjusted, theme = chart_theme())

#Cuarta forma de graficar
chartSeries(SU.PA$SU.PA.Adjusted, name = "Precio Ajustado diario")

help("chartSeries")

Obtenemos el rendimiento diario de la acción

Un buen modelo para la volatilidad debe tener la capacidad de pronosticarla; por tanto, debe modelar sus características. En general, esta clase de modelos es utilizada para hacer proyecciones y estimaciones, por ejemplo, pronosticar el valor absoluto de la magnitud de los retornos de los precios de un activo, estimar cuantiles o incluso toda la función de densidad de probabilidad de los retornos. Estos pronósticos y estimaciones son utilizados en diversas actividades financieras: manejo de riesgo, selección de portafolio, posiciones cortas y largas en la tenencia de un activo, entre otras.

Rendimiento = dailyReturn(SU.PA$SU.PA.Adjusted)

Graficamos los rendimientos

chartSeries(Rendimiento, name = "Rendimiento del precio ajustado")

Revisar si hay efectos ARCH

El primer paso es conocer el orden de nuestro modelo ARMA, de esta forma crearemos nuestro mejor ARIMA y checar el orden de nuestro modelo.

#Paso 1: estimar el modelo

modelo1 = auto.arima(Rendimiento)

summary(modelo1)
## Series: Rendimiento 
## ARIMA(2,0,1) with non-zero mean 
## 
## Coefficients:
##          ar1      ar2      ma1   mean
##       0.6662  -0.0483  -0.7016  6e-04
## s.e.  0.0822   0.0167   0.0817  2e-04
## 
## sigma^2 estimated as 0.0004356:  log likelihood=13219.92
## AIC=-26429.85   AICc=-26429.83   BIC=-26396.88
## 
## Training set error measures:
##                         ME       RMSE        MAE MPE MAPE      MASE
## Training set -2.459051e-06 0.02086258 0.01458123 NaN  Inf 0.6812746
##                      ACF1
## Training set 0.0004253775
autoplot(modelo1)

checkresiduals(modelo1)

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(2,0,1) with non-zero mean
## Q* = 22.993, df = 6, p-value = 0.0007988
## 
## Model df: 4.   Total lags used: 10

Claramente observamos que estamos ante un modelo ARMA (2,1). Por lo consiguiente será calcular una regresión lineal de nuestros errores o residuales del modelo ARMA al cuadrado como variable dependiente, \(Y\), y como variable independiente, los mismos errores del modelo ARMA al cuadrado con un rezago, \(X\).

#Paso 2: Calcular los residuales al cuadrado de nuestro modelo ARMA (2,0,1)
#Esto para conocer si hay Heterocedastica

Errores_cuadrado = resid(modelo1)^2

chartSeries(Errores_cuadrado) #La varianza no es constante, existe Heterocedacistidad

Observamos que nuestra varianza no es constante, ya que los errores al cuadrado muestran que al pasar los días la varianza llega a ser heterocedastica, por lo que ahora haremos nuestra regresión. Esto para observar si nos enfrentamos a un modelo ARCH o no.

#Paso 3: Hacer una regresión con los residuales al cuadrado rezagados

Regresion1 = dynlm(Errores_cuadrado ~ L(Errores_cuadrado))

summary(Regresion1)
## 
## Time series regression with "ts" data:
## Start = 2, End = 5394
## 
## Call:
## dynlm(formula = Errores_cuadrado ~ L(Errores_cuadrado))
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.005332 -0.000378 -0.000306 -0.000026  0.039077 
## 
## Coefficients:
##                      Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         3.794e-04  1.769e-05  21.455   <2e-16 ***
## L(Errores_cuadrado) 1.284e-01  1.351e-02   9.507   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.001225 on 5391 degrees of freedom
## Multiple R-squared:  0.01649,    Adjusted R-squared:  0.01631 
## F-statistic: 90.38 on 1 and 5391 DF,  p-value: < 2.2e-16
#H0: No hay efectos ARCH si el p-value es mayor que 0.05
#H1: Sí hay efectos ARCH si el p-value es menor que 0.05
#Conclusión: Sí hay efectos ARCH con un rezago

Observamos claramente que el intercepto y nuestra pendiente llegan a ser significativos, rechazamos la Hipótesis nula y concluimos que sí hay efectos ARCH dentro de nuestra varianza de los errores al cuadrado a un rezago. Ahora lo que procede es revisar la Autocorrelación y Autocorrelación Parcial de nuestro modelo, para comprobar que nuestra varianza es Heterocedástica:

#Paso 4: revisar la autocorrelación y autocorrelación parcial

autoplot(acf(Errores_cuadrado, lag.max = 5394, ylim = c(-0.5,1))) +
  labs(title = "Autocorrelación de los errores al cuadrado") + 
  xlab("Rezagos") +
  ylab("Autocorrelación")

autoplot(pacf(Errores_cuadrado, lag.max = 5394, ylim = c(-0.5,1))) +
  labs(title = "Autocorrelación parcial de los errores al cuadrado") +
  xlab("Rezagos") +
  ylab("Autocorrelación parcial")

#Tanto en la autocorrelación y autocorrelación parcial llegan a salir del límite de criterio, podemos decir que hay ruido blanco, en otras palabras: hay Heterocedacistidad en la varianza

Conclusiones:

  • A través de nuestro mejor modelo ARMA, vemos que es de orden (2,1)

  • Hemos obtenido los residuales al cuadrado y hemos hecho una regresión con ellos

  • Vemos que el modelo es significativo a través del p-value

  • Observamos que tanto en la Autocorrelación como la Autocorrelación Parcial, llegan a salir del límite las observaciones, por lo que podemos concluir que nuestra varianza es HETEROCEDÁSTICA

Prueba ARCH para verificar

#Generamos el modelo ARCH a un rezago
ModeloARCH1 = ArchTest(Rendimiento, lags = 1, demean = TRUE)

#Revisamos
ModeloARCH1
## 
##  ARCH LM-test; Null hypothesis: no ARCH effects
## 
## data:  Rendimiento
## Chi-squared = 89.951, df = 1, p-value < 2.2e-16
#H0: No hay efectos ARCH si el p-value es mayor que 0.05
#H1: Sí hay efectos ARCH si el p-value es menor que 0.05
#Conclusión: Sí hay efectos ARCH con un rezago

#Existe volatilidad al primer rezago

Verificamos que nuestro modelo cumpla las condiciones para ser un modelo ARCH a través del p-value. Concluimos que llega a ser Heterocedástico.

Generar el modelo GARCH

Para comprobar que se trata de un modelo ARCH generaremos un modelo GARCH. Siendo la condición de que hay uno o más puntos de datos en una serie para los cuales la varianza del término de error actual o innovación es una función de los tamaños reales de los términos de error de los períodos de tiempo anteriores: se relaciona con los cuadrados de las innovaciones anteriores. En la econometría, los modelos ARCH se utilizan para caracterizar y modelar series temporales. Una variedad de otras siglas se aplican a las estructuras particulares que tienen una base similar.

#Modelo ARMA (1,1)
ugarch1 = ugarchspec()

#Resumen
ugarch1
## 
## *---------------------------------*
## *       GARCH Model Spec          *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## ------------------------------------
## GARCH Model      : sGARCH(1,1)
## Variance Targeting   : FALSE 
## 
## Conditional Mean Dynamics
## ------------------------------------
## Mean Model       : ARFIMA(1,0,1)
## Include Mean     : TRUE 
## GARCH-in-Mean        : FALSE 
## 
## Conditional Distribution
## ------------------------------------
## Distribution :  norm 
## Includes Skew    :  FALSE 
## Includes Shape   :  FALSE 
## Includes Lambda  :  FALSE
#Modelo ARMA (2,1) <--- Modelo efectivo
ugarch2 = ugarchspec(mean.model = list(armaOrder = c(2,1)))

ugarch2
## 
## *---------------------------------*
## *       GARCH Model Spec          *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## ------------------------------------
## GARCH Model      : sGARCH(1,1)
## Variance Targeting   : FALSE 
## 
## Conditional Mean Dynamics
## ------------------------------------
## Mean Model       : ARFIMA(2,0,1)
## Include Mean     : TRUE 
## GARCH-in-Mean        : FALSE 
## 
## Conditional Distribution
## ------------------------------------
## Distribution :  norm 
## Includes Skew    :  FALSE 
## Includes Shape   :  FALSE 
## Includes Lambda  :  FALSE

R nos permite crear nuestro modelo GARCH a partir de un ARMA (1,1), por lo que le especificaremos que nos haga nuestro modelo ARMA que conocemos que es de orden (2,1)

#Estimar el modelo GARCH Al tener estimano nuestro modelo ARMA (2,1) podemos pronosticar nuestro modelo

ugfit = ugarchfit(spec = ugarch2, data = Rendimiento)

ugfit
## 
## *---------------------------------*
## *          GARCH Model Fit        *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## -----------------------------------
## GARCH Model  : sGARCH(1,1)
## Mean Model   : ARFIMA(2,0,1)
## Distribution : norm 
## 
## Optimal Parameters
## ------------------------------------
##         Estimate  Std. Error  t value Pr(>|t|)
## mu      0.000992    0.000175  5.68432 0.000000
## ar1     0.752757    0.086348  8.71771 0.000000
## ar2    -0.009405    0.017893 -0.52563 0.599147
## ma1    -0.795774    0.085130 -9.34778 0.000000
## omega   0.000006    0.000002  3.06251 0.002195
## alpha1  0.083715    0.008026 10.42992 0.000000
## beta1   0.904618    0.009295 97.32315 0.000000
## 
## Robust Standard Errors:
##         Estimate  Std. Error  t value Pr(>|t|)
## mu      0.000992    0.000185  5.35143  0.00000
## ar1     0.752757    0.098949  7.60750  0.00000
## ar2    -0.009405    0.019437 -0.48389  0.62847
## ma1    -0.795774    0.096812 -8.21977  0.00000
## omega   0.000006    0.000005  1.07404  0.28280
## alpha1  0.083715    0.013196  6.34393  0.00000
## beta1   0.904618    0.018540 48.79257  0.00000
## 
## LogLikelihood : 13949.81 
## 
## Information Criteria
## ------------------------------------
##                     
## Akaike       -5.1697
## Bayes        -5.1612
## Shibata      -5.1698
## Hannan-Quinn -5.1668
## 
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
##                          statistic p-value
## Lag[1]                      0.6083 0.43542
## Lag[2*(p+q)+(p+q)-1][8]     5.3204 0.09499
## Lag[4*(p+q)+(p+q)-1][14]    9.0641 0.21354
## d.o.f=3
## H0 : No serial correlation
## 
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                  0.0005221  0.9818
## Lag[2*(p+q)+(p+q)-1][5] 0.8986999  0.8822
## Lag[4*(p+q)+(p+q)-1][9] 3.0829238  0.7452
## d.o.f=2
## 
## Weighted ARCH LM Tests
## ------------------------------------
##             Statistic Shape Scale P-Value
## ARCH Lag[3] 0.0003064 0.500 2.000  0.9860
## ARCH Lag[5] 1.9113676 1.440 1.667  0.4912
## ARCH Lag[7] 3.5643428 2.315 1.543  0.4138
## 
## Nyblom stability test
## ------------------------------------
## Joint Statistic:  1.0529
## Individual Statistics:              
## mu     0.08877
## ar1    0.08206
## ar2    0.11662
## ma1    0.07111
## omega  0.13196
## alpha1 0.25383
## beta1  0.31193
## 
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic:          1.69 1.9 2.35
## Individual Statistic:     0.35 0.47 0.75
## 
## Sign Bias Test
## ------------------------------------
##                    t-value    prob sig
## Sign Bias           0.4904 0.62385    
## Negative Sign Bias  1.7770 0.07563   *
## Positive Sign Bias  1.2865 0.19832    
## Joint Effect        6.8458 0.07698   *
## 
## 
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
##   group statistic p-value(g-1)
## 1    20     134.4    2.098e-19
## 2    30     151.5    1.567e-18
## 3    40     170.6    2.197e-18
## 4    50     178.2    1.410e-16
## 
## 
## Elapsed time : 0.7921159
#Alpha1: coeficiente de los residuales al cuadrado
#Beta1: coeficiente de la varianza al cuadrado con un rezago

Ver coeficientes

Observamos el valor de nuestros coeficientes

ugfit@fit$coef
##            mu           ar1           ar2           ma1         omega 
##  9.924989e-04  7.527572e-01 -9.405248e-03 -7.957738e-01  5.549964e-06 
##        alpha1         beta1 
##  8.371525e-02  9.046185e-01

Imprimir varianza

ug_var = ugfit@fit$var

autoplot(ts(ug_var)) + 
  geom_line(color = "green") + labs(title = "Varianza de nuestro modelo ARMA (2,1)")

Residuales

ug_resid = (ugfit@fit$residuals)^2

autoplot(ts(ug_resid)) + autolayer(ts(ug_resid), series = "Residuales al cuadrado") + autolayer(ts(ug_var), series = "Varianza") + labs(title = "Residuales al cuadrado y Varianza de nuestro modelo ARMA (2,1)") + ylab("") + xlab("Tiempo")

Pronóstico

Por último observamos cuáles serán nuestros valores pronosticados a un mes despues del rendimiento de nuestras acciones de la siguiente forma.

ug_forecast = ugarchforecast(ugfit, n.ahead = 30)

ug_forecast
## 
## *------------------------------------*
## *       GARCH Model Forecast         *
## *------------------------------------*
## Model: sGARCH
## Horizon: 30
## Roll Steps: 0
## Out of Sample: 0
## 
## 0-roll forecast [T0=2021-01-04]:
##         Series   Sigma
## T+1  4.904e-05 0.01580
## T+2  1.735e-05 0.01588
## T+3  2.673e-04 0.01596
## T+4  4.558e-04 0.01605
## T+5  5.953e-04 0.01612
## T+6  6.986e-04 0.01620
## T+7  7.750e-04 0.01628
## T+8  8.315e-04 0.01635
## T+9  8.734e-04 0.01643
## T+10 9.043e-04 0.01650
## T+11 9.273e-04 0.01657
## T+12 9.442e-04 0.01664
## T+13 9.568e-04 0.01671
## T+14 9.661e-04 0.01678
## T+15 9.729e-04 0.01685
## T+16 9.780e-04 0.01692
## T+17 9.818e-04 0.01698
## T+18 9.846e-04 0.01704
## T+19 9.866e-04 0.01711
## T+20 9.882e-04 0.01717
## T+21 9.893e-04 0.01723
## T+22 9.901e-04 0.01729
## T+23 9.907e-04 0.01735
## T+24 9.912e-04 0.01741
## T+25 9.915e-04 0.01747
## T+26 9.918e-04 0.01752
## T+27 9.920e-04 0.01758
## T+28 9.921e-04 0.01764
## T+29 9.922e-04 0.01769
## T+30 9.923e-04 0.01774

Bibliografía