ANÁLISIS DE LA SERIE DE TIEMPO

Empezamos cargando las librerías, que serán necesarias para el análisis estadístico posterior.

## [[1]]
## [1] "pdfetch"   "stats"     "graphics"  "grDevices" "utils"     "datasets" 
## [7] "methods"   "base"     
## 
## [[2]]
## [1] "tseries"   "pdfetch"   "stats"     "graphics"  "grDevices" "utils"    
## [7] "datasets"  "methods"   "base"     
## 
## [[3]]
##  [1] "forcats"   "stringr"   "dplyr"     "purrr"     "readr"     "tidyr"    
##  [7] "tibble"    "ggplot2"   "tidyverse" "tseries"   "pdfetch"   "stats"    
## [13] "graphics"  "grDevices" "utils"     "datasets"  "methods"   "base"     
## 
## [[4]]
##  [1] "forecast"  "forcats"   "stringr"   "dplyr"     "purrr"     "readr"    
##  [7] "tidyr"     "tibble"    "ggplot2"   "tidyverse" "tseries"   "pdfetch"  
## [13] "stats"     "graphics"  "grDevices" "utils"     "datasets"  "methods"  
## [19] "base"

Como analizaremos acciones de una compañía internacional, será necesario usar el paquete pdfetch. Ahora, procederemos a importar los datos de la página yahoo finance, el cual es un servicio de Yahoo! que ofrece información financiera de las empresas más relevantes de Estados Unidos.

Para el presente trabajo, analizaremos la serie de precios de la compañía: Superconductor Technologies Inc.; con fecha inicio ’2019-01-01’ y fecha de fin ’2020-01-01’.

Es importante mencionar que la compañía desarrolla, produce y comercializa materiales superconductores de alta temperatura y tecnologías relacionadas en los Unated States.

IMPORTANDO DATOS

SCONdata <- pdfetch_YAHOO("^GSPC",from = as.Date("2019-01-01"),to = as.Date("2020-01-01"), interval = '1d')  #DATOS DE SCON

ANÁLISIS EXPLORATORIO DE LOS DATOS

Despúes de haber cargado los datos al programa, se procederá a realizar un análisis estadístico de las variables, a fin de dar un reconocimiento global de los datos a usar. Para ello usaremos la función summary, que también es muy usada en otros softwares econométricos.

summary(SCONdata)
##      Index              ^GSPC.open     ^GSPC.high     ^GSPC.low   
##  Min.   :2019-01-02   Min.   :2474   Min.   :2493   Min.   :2444  
##  1st Qu.:2019-04-02   1st Qu.:2820   1st Qu.:2837   1st Qu.:2805  
##  Median :2019-07-02   Median :2917   Median :2931   Median :2903  
##  Mean   :2019-07-02   Mean   :2912   Mean   :2924   Mean   :2899  
##  3rd Qu.:2019-10-01   3rd Qu.:3002   3rd Qu.:3008   3rd Qu.:2991  
##  Max.   :2019-12-31   Max.   :3247   Max.   :3248   Max.   :3234  
##   ^GSPC.close   ^GSPC.adjclose  ^GSPC.volume       
##  Min.   :2448   Min.   :2448   Min.   :1296540000  
##  1st Qu.:2822   1st Qu.:2822   1st Qu.:3221990000  
##  Median :2919   Median :2919   Median :3502200000  
##  Mean   :2913   Mean   :2913   Mean   :3540743651  
##  3rd Qu.:3002   3rd Qu.:3002   3rd Qu.:3805892500  
##  Max.   :3240   Max.   :3240   Max.   :6454270000

CREANDO LA SERIE DE TIEMPO

Para empezar con la modelación es necesario crear la serie de tiempo de los datos importados, ello quiere decir, que nos referimos a datos estadísticos que se recopilan o registran en intervalos de tiempo regulares (semana, diario, anual, etc).

tsSCON <- ts(SCONdata$`^GSPC.close`,start = c(2019,1),frequency=356.25)
plot(tsSCON)

CALCULANDO LOS RETORNOS

d_SCON <- diff(tsSCON)/tsSCON[-length(tsSCON)]
plot(d_SCON)

ret_cont_SCON=diff(log(tsSCON))
plot(ret_cont_SCON)

ANÁLISIS DESCRIPTIVO A PARTIR DE LOS RETORNOS CONTINUOS

media_ret_cont=mean(ret_cont_SCON)
media_ret_cont
## [1] 0.001005693
var_ret_cont=var(ret_cont_SCON)
var_ret_cont
##              ^GSPC.close
## ^GSPC.close 0.0000621474
sd_ret_cont=sd(ret_cont_SCON)
sd_ret_cont
## [1] 0.007883362
hist(ret_cont_SCON)

En base al análisis realizado, se tiene que la media de SCON, es: 0.001005693, su varianza es: 0.0000621474 y la desviación estándar: 0.007883362.

Como se sabe, la media es el promdeio de los datos, es decir, la suma de todas las observaciones dividida entre el número de observaciones, su uso frecuente es tomarla como la medida estándar del centro de la distribución de los datos.

También se sabe que la varianza mide qué tan dispersos están los datos alrededor de su media. La varianza es igual a la desviación estándar elevada al cuadrado. Se tiene que tener en cuenta que mayor sea la varianza, mayor será la dispersión de los datos.

Con respecto a la desviación estándar es la medida de dispersión más común, que indica qué tan dispersos están los datos alrededor de la media.

En base al análisis gráfico (histograma), se puede ver que la curtosis (grado de apuntamiento de la distribución de frecuencia, respecto a la curva de la normal que tiene coeficiente 0) se asemeja a una leptocúrtica (se da cuando los datos estan agrupados en un intervalo estrecho, es decir, presenta una dispersión pequeña). Esto está respaldado, por la parte cuantitativa de nuestro análisi, pues la desv. estándar salió muy pequeña, casi nula.

GRÁFICO DE LOS RETORNOS CONTINUOS Vs DISTRIBUCIÓN NORMAL

x<-seq(-0.1,0.1,by=0.01)
hist(
     ret_cont_SCON,prob=TRUE,ylim=c(0,80),xlim = c(-0.1,0.1),breaks = 10,col = "red",
     main = c("Histograma de los retornos continuos"),
     xlab = expression(r==ln(P[t]/P[t-1])),
     ylab=c("Densidad"),
    )
lines(density(ret_cont_SCON),lwd=1.5,lty=2)
curve(dnorm(x,mean=media_ret_cont,sd=sd_ret_cont),lwd=2,lty=2,col="blue",add = T)

En base a la gráfica obtenida, podemos decir que los datos se encuentran agrupados en su mayoría en la media de la distribución, de lo cual podría afirmar que los retornos siguen una distribución normal, pues los datos no se encuentran dispersados; sin embargo, sería necesario realizar los test de normalidad para afirmar con certeza lo anunciado.

TEST DE NORMALIDAD

Para proceder a calcular e interpretar los resultados, es necesario mencionar que todo será analizado bajo un valor de confianza del 95%. También cabe precisar que la hipótesis nula en los tres test de normalidad, es que la distribución de los residuos es normal.

Al obtener un p-value: 0.00000000000000022 (< 0.05), se procede a rechazar la hipótesis nula, por lo tanto concluimos que la serie NO se distribuye de forma NORMAL.

jarque.bera.test(ret_cont_SCON)
## 
##  Jarque Bera Test
## 
## data:  ret_cont_SCON
## X-squared = 125.76, df = 2, p-value < 0.00000000000000022

Nos muestra tambien un p-value menos al nivel de significancia (0.03648) por lo que se RECHAZA la hipotesis nula de NORMALIDAD.

ks.test(ret_cont_SCON, "pnorm", mean=media_ret_cont, sd=sd_ret_cont)
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  ret_cont_SCON
## D = 0.089311, p-value = 0.03648
## alternative hypothesis: two-sided

al obtener un p-value < 0.05 (0.00000002771), rechazamos la hipótesis nula, concluyendo por lo tanto que NO sigue una distribución NORMAL.

shapiro.test(ret_cont_SCON)
## 
##  Shapiro-Wilk normality test
## 
## data:  ret_cont_SCON
## W = 0.94326, p-value = 0.00000002771

CÁLCULO DEL VAR

El Value at Risk (VAR), se puede definir como el valor máximo probable de pérdida, con un intervalo de confianza determinado, y sobre un cierto periodo de tiempo.

Supuesto: para una cartera de 100 000 dólares

Se obtiene que la pérdida máxima sería de -2535.171 dólares

W<-100000

alpha <- 0.01
q1 <- quantile(x=ret_cont_SCON, alpha)
mean(exp(q1)-1)
## [1] -0.02535171
VAR1 <- W*(exp(q1)-1)
VAR1
##        1% 
## -2535.171

Se obtiene que la pérdida máxima sería de -1208.628 dólares

W<-100000

alpha <- 0.05
q1 <- quantile(x=ret_cont_SCON, alpha)
mean(exp(q1)-1)
## [1] -0.01208628
VAR1 <- W*(exp(q1)-1)
VAR1
##        5% 
## -1208.628

Se obtiene que la pérdida máxima sería de -728.274 dólares

W<-100000

alpha <- 0.1
q1 <- quantile(x=ret_cont_SCON, alpha)
mean(exp(q1)-1)
## [1] -0.00728274
VAR1 <- W*(exp(q1)-1)
VAR1
##      10% 
## -728.274
set.seed(1000)
VARp<-qnorm(0.01,mean = media_ret_cont,sd = sd_ret_cont,lower.tail = T);VARp
## [1] -0.01733375
exp(VARp)-1
## [1] -0.01718439
VARp
## [1] -0.01733375
VAR.mc <- numeric()
for (i in 1:10000) {
  changes <- rnorm(length(ret_cont_SCON),mean=1+media_ret_cont,sd=sd_ret_cont)
  sim.ts <- cumprod(c(as.numeric(tsSCON[1]),changes))
  sim.R <- diff(log(sim.ts))
  sim.q <- quantile(sim.R,0.01,na.rm = T)
  sim.VAR <- exp(sim.q)-1
  VAR.mc[i] <- sim.VAR
}
mean(VAR.mc)
## [1] -0.01671881
sd(VAR.mc)
## [1] 0.001669469
plot(density(VAR.mc))

quantile(VAR.mc,0.025)
##        2.5% 
## -0.02024188
quantile(VAR.mc,0.975)
##       97.5% 
## -0.01370132

MODELO GARCH(1, 1)

Los resultados arrojan que nuestro proceso es estacionario y no es volatil.

Retornos <- diff(log(tsSCON))
Retornos <- na.omit(Retornos)
plot.ts(Retornos)

ts.garch <- garch(ret_cont_SCON,c(1,1))
## 
##  ***** ESTIMATION WITH ANALYTICAL GRADIENT ***** 
## 
## 
##      I     INITIAL X(I)        D(I)
## 
##      1     5.593266e-05     1.000e+00
##      2     5.000000e-02     1.000e+00
##      3     5.000000e-02     1.000e+00
## 
##     IT   NF      F         RELDF    PRELDF    RELDX   STPPAR   D*STEP   NPRELDF
##      0    1 -1.093e+03
##      1    8 -1.093e+03  3.30e-04  5.62e-04  4.0e-05  3.8e+10  4.0e-06  1.08e+07
##      2    9 -1.093e+03  3.41e-06  2.56e-06  4.0e-05  2.0e+00  4.0e-06  1.44e+00
##      3   10 -1.093e+03  8.31e-08  2.63e-07  4.0e-05  2.0e+00  4.0e-06  1.44e+00
##      4   18 -1.096e+03  2.46e-03  4.30e-03  4.6e-01  2.0e+00  8.4e-02  1.43e+00
##      5   21 -1.101e+03  4.92e-03  3.57e-03  7.5e-01  1.4e+00  3.4e-01  6.24e-02
##      6   23 -1.103e+03  1.61e-03  1.38e-03  7.9e-02  2.0e+00  6.7e-02  7.46e+00
##      7   25 -1.107e+03  3.33e-03  3.20e-03  1.3e-01  2.0e+00  1.3e-01  6.53e+02
##      8   27 -1.107e+03  6.81e-04  6.60e-04  2.2e-02  2.0e+00  2.7e-02  2.17e+02
##      9   34 -1.108e+03  1.88e-04  3.39e-04  9.1e-07  4.7e+00  1.1e-06  2.64e+01
##     10   35 -1.108e+03  1.94e-06  3.33e-06  9.0e-07  2.0e+00  1.1e-06  1.57e+01
##     11   44 -1.109e+03  1.34e-03  1.83e-03  5.6e-02  2.0e+00  7.4e-02  1.59e+01
##     12   46 -1.109e+03  4.17e-05  1.67e-04  1.0e-02  1.3e+00  1.4e-02  2.56e-04
##     13   47 -1.109e+03  5.00e-05  7.81e-05  9.7e-03  8.1e-01  1.4e-02  8.24e-05
##     14   48 -1.109e+03  1.36e-05  2.00e-05  5.5e-03  0.0e+00  8.3e-03  2.00e-05
##     15   49 -1.109e+03  2.83e-06  1.82e-06  2.0e-03  0.0e+00  3.3e-03  1.82e-06
##     16   50 -1.109e+03  1.04e-06  7.35e-07  1.6e-03  0.0e+00  3.2e-03  7.35e-07
##     17   64 -1.109e+03 -5.94e-14  7.68e-15  7.1e-15  9.7e+04  1.0e-14  3.05e-08
## 
##  ***** FALSE CONVERGENCE *****
## 
##  FUNCTION    -1.109161e+03   RELDX        7.107e-15
##  FUNC. EVALS      64         GRAD. EVALS      17
##  PRELDF       7.678e-15      NPRELDF      3.046e-08
## 
##      I      FINAL X(I)        D(I)          G(I)
## 
##      1    4.768875e-06     1.000e+00    -8.407e+02
##      2    2.152644e-01     1.000e+00     1.665e-01
##      3    7.126709e-01     1.000e+00     9.005e-02
summary(ts.garch)
## 
## Call:
## garch(x = ret_cont_SCON, order = c(1, 1))
## 
## Model:
## GARCH(1,1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.9314 -0.3604  0.1641  0.7641  2.7035 
## 
## Coefficient(s):
##       Estimate  Std. Error  t value             Pr(>|t|)    
## a0 0.000004769 0.000002248    2.121             0.033911 *  
## a1 0.215264377 0.055577200    3.873             0.000107 ***
## b1 0.712670935 0.063949650   11.144 < 0.0000000000000002 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Diagnostic Tests:
##  Jarque Bera Test
## 
## data:  Residuals
## X-squared = 46.168, df = 2, p-value = 0.00000000009437
## 
## 
##  Box-Ljung test
## 
## data:  Squared.Residuals
## X-squared = 1.2821, df = 1, p-value = 0.2575
ts.garch
## 
## Call:
## garch(x = ret_cont_SCON, order = c(1, 1))
## 
## Coefficient(s):
##          a0           a1           b1  
## 0.000004769  0.215264377  0.712670935