Para ello instalamos el paquete quantmod y luego lo activamos con el comando library
#install.packages("quantmod")
library(quantmod)
## Loading required package: xts
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Loading required package: TTR
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
## Version 0.4-0 included new data defaults. See ?getSymbols.
Descargamos la base de datos solicitada con el comando getSymbols, para la empresa BBQ Holdings Inc.
getSymbols("BBQ",from="2019-01-01",to="2020-01-01")
## 'getSymbols' currently uses auto.assign=TRUE by default, but will
## use auto.assign=FALSE in 0.5-0. You will still be able to use
## 'loadSymbols' to automatically load data. getOption("getSymbols.env")
## and getOption("getSymbols.auto.assign") will still be checked for
## alternate defaults.
##
## This message is shown once per session and may be disabled by setting
## options("getSymbols.warning4.0"=FALSE). See ?getSymbols for details.
## [1] "BBQ"
BBQ = BBQ[,"BBQ.Adjusted"]
plot(BBQ)
Para dicho calculo instalamos el paquete PerformanceAnalytics
#install.packages("PerformanceAnalytics")
library(PerformanceAnalytics)
##
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
##
## legend
rend_cont = Return.calculate(BBQ, method="log")
plot(rend_cont)
rend_dis = Return.calculate(BBQ, method="discrete")
plot(rend_dis)
Observamos que la media es cercana cero y que la dispersión medida por la varianza o la desviación estándar no es muy alta.
Media
media = mean(na.omit(rend_cont))
media
## [1] -0.000712841
Varianza
varianza=var(na.omit(rend_cont))
varianza
## BBQ.Adjusted
## BBQ.Adjusted 0.001395896
Desviación Estándar
desv=sd(na.omit(rend_cont))
desv
## [1] 0.03736169
La gráfica de la distribución de los retornos se asemejan a una curva normal. Se observa que en el primer histograma los datos se encuentran concentrados en la media, es decir no se observa una alta dispersión de los datos.El promedio de los retornos es cercano a cero. Con respecto a la simulación esta tiene una distribución normal, comparándola con la distribución de los retornos, se observa que los retornos tienen menos valores extremos, pero que superan a la linea normal que se le ha dibujado. Para evaluar la normalidad será necesario realizar pruebas formales.
hist(rend_cont, density=20, breaks=20, prob=TRUE,
xlab="x-variable", ylim=c(0, 13),
main="normal curve over histogram")
curve(dnorm(x, mean=media, sd=desv),
col="darkblue", lwd=2, add=TRUE, yaxt="n")
Ahora simulamos un distribución normal a partir de la media y la varianza de los retornos obtenidos. La simulación tendrá el mismo tamaño que el de los retornos continuos y finalmente gráficaremos su histograma.
set.seed(1)
dato = rnorm(521,media,desv)
hist(dato, density=20, breaks=20, prob=TRUE,
xlab="x-variable", ylim=c(0, 13),
main="normal curve over histogram")
curve(dnorm(x, mean=media, sd=desv),
col="darkblue", lwd=2, add=TRUE, yaxt="n")
El test de Jarque-Bera se formula bajo la hipótesis nula de la normalidad de los residuos, al obtener un p-value < 0.05 (2.2e-16), rechazamos la hipótesis nula, por lo tanto concluimos que la serie en análisis de los retornos continuos del rendimiento de las acciones de BBQ Holding Inc, no se distribuyen normalmente.
Para ello instalamos el paquete normtest
#install.packages("normtest")
library(normtest)
jb.norm.test(na.omit(rend_cont))
##
## Jarque-Bera test for normality
##
## data: na.omit(rend_cont)
## JB = 195.53, p-value < 2.2e-16
El test de Kolgomorov se formula bajo la hipótesis nula de que el conjunto de datos siguen una distribución normal, al obtener una p-value < 0.05 (2.2e-16), rechazamos la hipótesis nula, concluyendo por lo tanto en que los datos de la serie no siguen una distribución normal.
Para ello instalamos el comando nortest
#install.packages("nortest")
library(nortest)
lillie.test(na.omit(rend_cont))
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: na.omit(rend_cont)
## D = 0.92126, p-value < 2.2e-16
El test de Shapiro-Wilk, se formula bajo la hipótesis nula de que la muestra proviene de una distribución normal, al obtener un p-value < 0.05 (3.168e-08), rechazamos la hipótesis nula, concluyendo por lo tanto en que la muestra obtenida no proviene de una muestra normal.
shapiro.test(as.vector(rend_cont))
##
## Shapiro-Wilk normality test
##
## data: as.vector(rend_cont)
## W = 0.94384, p-value = 3.168e-08
Para alpha=0.01
El Value at Risk se entiende como la pérdida que se podría sufrir en condiciones normales de tiempo, en un intervalo de tiempo y con cierto nivel de probabilidad, para este ejemplo de alpha = 0.01. De lo ejecutado se observa que la máxima pérdida que se puede sufrir o el Value at Risk es de -84,603.08 dólares.
VaR1=VaR(na.omit(rend_cont), p=0.99, method="historical")
VaR1
## BBQ.Adjusted
## VaR -0.08460308
VaR1_en_monto = VaR1*1000000
VaR1_en_monto
## BBQ.Adjusted
## VaR -84603.08
Para alpha=0.05
Para este ejemplo de alpha = 0.05, se observa que la máxima pérdida que se puede sufrir o el Value at Risk es de -56,181.48 dólares.
VaR2=VaR(na.omit(rend_cont), p=0.95, method="historical")
VaR2
## BBQ.Adjusted
## VaR -0.05618148
VaR2_en_monto = VaR2*1000000
VaR2_en_monto
## BBQ.Adjusted
## VaR -56181.48
Para alpha=0.1
Para este ejemplo de alpha = 0.1, se observa que la máxima pérdida que se puede sufrir o el Value at Risk es de -39,220.71 dólares.
VaR3=VaR(na.omit(rend_cont), p=0.90, method="historical")
VaR3
## BBQ.Adjusted
## VaR -0.03922071
VaR3_en_monto = VaR3*1000000
VaR3_en_monto
## BBQ.Adjusted
## VaR -39220.71
Asumiendo la media y la varianza calculados de los retornos continuos, y un valor de alpha de 0.01 calculamos el Value at Risk, obteniendo un valor de -87,455.81 dólares.
VaR4 = VaR(na.omit(rend_cont), p=.99, method="gaussian")
VaR4
## BBQ.Adjusted
## VaR -0.08745581
VaR4_en_monto = VaR4*1000000
VaR4_en_monto
## BBQ.Adjusted
## VaR -87455.81
Para alpha=0.01
VAR_montecarlo1 = numeric()
for (i in 1:10000) {
changes = rnorm(length(na.omit(rend_cont)),mean=1+media,sd=desv)
sim.ts = cumprod(c(as.numeric(na.omit(rend_cont[1])),changes))
sim.R = diff(log(sim.ts))
sim.q = quantile(sim.R,0.01,na.rm = T)
sim.VAR1 = exp(sim.q)-1
VAR_montecarlo1[i] = sim.VAR1
}
Calculamos la media de los VaR simulados
mean(VAR_montecarlo1)
## [1] -0.08500598
Calculamos la desviación estándar de los VaR simulados
sd(VAR_montecarlo1)
## [1] 0.007950918
Nos piden gráficar la distribución de los VaR simulados
plot(density(VAR_montecarlo1))
Calculamos el percentil 0.025
quantile(VAR_montecarlo1,0.025)
## 2.5%
## -0.1018092
Calculamos el percentil 0.975
quantile(VAR_montecarlo1,0.975)
## 97.5%
## -0.07039818
Calculamos el Value at Risk
sim.VAR1*100000
## 1%
## -8679.963
Para alpha=0.05
VAR_montecarlo2 = numeric()
for (i in 1:10000) {
changes = rnorm(length(na.omit(rend_cont)),mean=1+media,sd=desv)
sim.ts = cumprod(c(as.numeric(na.omit(rend_cont[1])),changes))
sim.R = diff(log(sim.ts))
sim.q = quantile(sim.R,0.05,na.rm = T)
sim.VAR2 = exp(sim.q)-1
VAR_montecarlo2[i] = sim.VAR2
}
Calculamos la media de los VaR simulados
mean(VAR_montecarlo2)
## [1] -0.06149044
Calculamos la desviación estándar de los vaR simulados
sd(VAR_montecarlo2)
## [1] 0.004891306
Nos piden gráficar la distribución de los VaR simulados
plot(density(VAR_montecarlo2))
Calculamos el precentil 0.025
quantile(VAR_montecarlo2,0.025)
## 2.5%
## -0.07138649
Calculamos el percentil 0.975
quantile(VAR_montecarlo2,0.975)
## 97.5%
## -0.0521258
Calculamos el VaR
sim.VAR2*100000
## 5%
## -4995.784
Para alpha=0.1
VAR_montecarlo3 = numeric()
for (i in 1:10000) {
changes = rnorm(length(na.omit(rend_cont)),mean=1+media,sd=desv)
sim.ts = cumprod(c(as.numeric(na.omit(rend_cont[1])),changes))
sim.R = diff(log(sim.ts))
sim.q = quantile(sim.R,0.1,na.rm = T)
sim.VAR3 = exp(sim.q)-1
VAR_montecarlo3[i] = sim.VAR3
}
Calculamos la media de los VaR simulados
mean(VAR_montecarlo3)
## [1] -0.04811254
Calculamos la desviación estándar de los vaR simulados
sd(VAR_montecarlo3)
## [1] 0.003976978
Nos piden gráficar la distribución de los VaR simulados
plot(density(VAR_montecarlo3))
Calculamos el precentil 0.025
quantile(VAR_montecarlo3,0.025)
## 2.5%
## -0.05590937
Calculamos el percentil 0.975
quantile(VAR_montecarlo3,0.975)
## 97.5%
## -0.04054616
Calculamos el VaR
sim.VAR3*100000
## 10%
## -4493.537
La prevalencia es 0.001223 Sobre la varianza incondiconal esta se observa constante
Instalamos el paquete tseries
#install.packages("tseries")
Primero activamos el paquete tseries
library(tseries)
Estimamos el modelo GARCH(1,1)
GARCH_BBQ=diff(log(BBQ))
GARCH11= garch(na.omit(GARCH_BBQ), order = c(1, 1))
##
## ***** ESTIMATION WITH ANALYTICAL GRADIENT *****
##
##
## I INITIAL X(I) D(I)
##
## 1 1.256306e-03 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 -6.996e+02
## 1 7 -6.997e+02 9.03e-05 1.65e-04 4.0e-04 7.3e+07 4.0e-05 5.98e+03
## 2 13 -7.007e+02 1.44e-03 1.97e-03 2.9e-01 2.0e+00 4.1e-02 8.15e-01
## 3 15 -7.008e+02 1.90e-04 2.02e-04 2.2e-01 1.7e+00 4.1e-02 7.64e-03
## 4 18 -7.008e+02 4.74e-06 4.79e-06 4.3e-03 2.0e+00 8.2e-04 3.34e-03
## 5 21 -7.008e+02 1.66e-05 1.67e-05 1.7e-02 1.9e+00 3.3e-03 3.16e-03
## 6 23 -7.008e+02 4.21e-06 4.21e-06 3.4e-03 2.0e+00 6.5e-04 2.15e-03
## 7 25 -7.009e+02 9.17e-06 9.18e-06 6.8e-03 2.0e+00 1.3e-03 2.14e-03
## 8 27 -7.009e+02 1.95e-06 1.95e-06 1.4e-03 2.0e+00 2.6e-04 2.32e-03
## 9 29 -7.009e+02 3.90e-06 3.91e-06 2.7e-03 2.0e+00 5.2e-04 2.30e-03
## 10 31 -7.009e+02 7.84e-06 7.84e-06 5.4e-03 2.0e+00 1.0e-03 2.30e-03
## 11 33 -7.009e+02 1.60e-06 1.60e-06 1.1e-03 2.0e+00 2.1e-04 2.24e-03
## 12 36 -7.009e+02 4.78e-08 4.76e-08 2.1e-05 2.0e+00 4.2e-06 2.24e-03
## 13 38 -7.009e+02 7.84e-08 7.84e-08 4.2e-05 2.0e+00 8.4e-06 2.24e-03
## 14 40 -7.009e+02 2.88e-08 2.87e-08 7.6e-06 2.0e+00 1.7e-06 2.24e-03
## 15 41 -7.009e+02 3.92e-08 3.92e-08 1.5e-05 2.0e+00 3.3e-06 2.24e-03
## 16 43 -7.009e+02 6.78e-08 6.78e-08 3.4e-05 2.0e+00 6.7e-06 2.24e-03
## 17 46 -7.009e+02 3.66e-09 3.66e-09 6.1e-07 1.0e+01 1.3e-07 2.24e-03
## 18 48 -7.009e+02 6.79e-09 6.79e-09 1.3e-06 4.1e+00 2.7e-07 2.24e-03
## 19 50 -7.009e+02 1.36e-08 1.36e-08 2.8e-06 1.8e+03 5.3e-07 2.24e-03
## 20 53 -7.009e+02 2.72e-10 2.72e-10 5.6e-08 2.8e+05 1.1e-08 2.24e-03
## 21 55 -7.009e+02 5.43e-10 5.43e-10 1.1e-07 3.7e+04 2.1e-08 2.24e-03
## 22 57 -7.009e+02 1.09e-10 1.09e-10 2.2e-08 8.9e+05 4.3e-09 2.24e-03
## 23 59 -7.009e+02 2.17e-10 2.17e-10 4.5e-08 1.1e+05 8.6e-09 2.24e-03
## 24 61 -7.009e+02 4.35e-10 4.35e-10 9.0e-08 6.1e+04 1.7e-08 2.24e-03
## 25 63 -7.009e+02 8.69e-11 8.69e-11 1.8e-08 1.4e+06 3.4e-09 2.24e-03
## 26 65 -7.009e+02 1.74e-11 1.74e-11 3.6e-09 7.2e+06 6.8e-10 2.24e-03
## 27 67 -7.009e+02 3.48e-11 3.48e-11 7.2e-09 9.0e+05 1.4e-09 2.24e-03
## 28 69 -7.009e+02 6.96e-12 6.95e-12 1.4e-09 1.8e+07 2.7e-10 2.24e-03
## 29 71 -7.009e+02 1.39e-12 1.39e-12 2.9e-10 9.1e+07 5.5e-11 2.24e-03
## 30 73 -7.009e+02 2.78e-12 2.78e-12 5.7e-10 1.1e+07 1.1e-10 2.24e-03
## 31 75 -7.009e+02 5.56e-13 5.56e-13 1.1e-10 2.3e+08 2.2e-11 2.24e-03
## 32 77 -7.009e+02 1.11e-13 1.11e-13 2.3e-11 1.1e+09 4.4e-12 2.24e-03
## 33 79 -7.009e+02 2.23e-13 2.23e-13 4.6e-11 1.4e+08 8.8e-12 2.24e-03
## 34 82 -7.009e+02 2.60e-15 4.45e-15 9.2e-13 2.9e+10 1.8e-13 2.24e-03
## 35 84 -7.009e+02 9.73e-15 8.90e-15 1.8e-12 3.6e+09 3.5e-13 2.23e-03
## 36 86 -7.009e+02 1.78e-15 1.78e-15 3.7e-13 7.1e+10 7.0e-14 2.24e-03
## 37 88 -7.009e+02 4.87e-16 3.56e-16 7.3e-14 3.6e+11 1.4e-14 2.23e-03
## 38 90 -7.009e+02 3.24e-16 7.12e-17 1.5e-14 1.8e+12 2.8e-15 2.23e-03
## 39 92 -7.009e+02 4.87e-16 1.42e-16 2.9e-14 2.3e+11 5.6e-15 2.26e-03
## 40 94 -7.009e+02 -4.87e-16 9.08e-17 1.9e-14 1.4e+12 3.6e-15 2.24e-03
##
## ***** FALSE CONVERGENCE *****
##
## FUNCTION -7.008635e+02 RELDX 1.871e-14
## FUNC. EVALS 94 GRAD. EVALS 40
## PRELDF 9.076e-17 NPRELDF 2.241e-03
##
## I FINAL X(I) D(I) G(I)
##
## 1 1.222725e-03 1.000e+00 -1.037e-01
## 2 9.494946e-02 1.000e+00 -1.772e+01
## 3 1.825897e-15 1.000e+00 1.798e+00
summary(GARCH11)
##
## Call:
## garch(x = na.omit(GARCH_BBQ), order = c(1, 1))
##
## Model:
## GARCH(1,1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.54778 -0.52214 -0.06725 0.39997 4.36580
##
## Coefficient(s):
## Estimate Std. Error t value Pr(>|t|)
## a0 1.223e-03 8.081e-04 1.513 0.130
## a1 9.495e-02 6.669e-02 1.424 0.155
## b1 1.826e-15 6.373e-01 0.000 1.000
##
## Diagnostic Tests:
## Jarque Bera Test
##
## data: Residuals
## X-squared = 235.97, df = 2, p-value < 2.2e-16
##
##
## Box-Ljung test
##
## data: Squared.Residuals
## X-squared = 0.2709, df = 1, p-value = 0.6027