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.
SCONdata <- pdfetch_YAHOO("^GSPC",from = as.Date("2019-01-01"),to = as.Date("2020-01-01"), interval = '1d') #DATOS DE SCON
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
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)
d_SCON <- diff(tsSCON)/tsSCON[-length(tsSCON)]
plot(d_SCON)
ret_cont_SCON=diff(log(tsSCON))
plot(ret_cont_SCON)
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.
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.
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
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
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