#pkges <- c("WDI","tidyverse","tseries","forecast")
#install.packages("pkges")
#lapply(pkges,library,character.only=T)

FORTERRA. INC.

FORTERRA ES UN FABRICANTE LÍDER DE PRODUCTOS DE TUBERÍAS Y PRONÓSTICOS PARA USO EN INFRAESTRUCTURAS RELACIONADAS CON EL AGUA, ASÍ COMO LAS SOLUCIONES DE GESTIÓN DE AGUAS TORMENTAS Y PRODUCTOS DE PRÁCTICAS ARQUITECTÓNICAS, ESTRUCTURALES Y ESPECIALES

El presente informe tiene la finalidad de mostar la resolución de la Práctica Calificada del curso de Análisis de la Gestión del Riesgo tomando la data del precio de las acciones de FORTEARRA. INC.

Empezando con la resolución necesitamos obtener los datos, para ello ejecutamos el siguiente codigo en R:

*(Pregunta 1)

FORTERRA.DB <- pdfetch::pdfetch_YAHOO("FRTA", from = c("2019-01-01"), to = c("2020-01-01"), interval = "1d")
head(FORTERRA.DB) #MOSTRANDO ALGUNOS DATOS DE LA DATAFRAME 
##            FRTA.open FRTA.high FRTA.low FRTA.close FRTA.adjclose FRTA.volume
## 2019-01-02      3.65      4.26    3.650       4.23          4.23      272300
## 2019-01-03      4.12      4.15    3.900       3.90          3.90      223200
## 2019-01-04      3.91      4.28    3.900       4.25          4.25      299000
## 2019-01-07      4.24      4.66    4.170       4.38          4.38      223100
## 2019-01-08      4.46      4.64    4.320       4.63          4.63      152300
## 2019-01-09      4.64      4.72    4.237       4.65          4.65      138400
#Empleamos la función summary para obtener una serie de estadisticos que muestran una nocion de como se distribuye estos datos.
summary(FORTERRA.DB)
##      Index              FRTA.open        FRTA.high         FRTA.low     
##  Min.   :2019-01-02   Min.   : 3.650   Min.   : 4.130   Min.   : 3.400  
##  1st Qu.:2019-04-02   1st Qu.: 4.787   1st Qu.: 4.940   1st Qu.: 4.656  
##  Median :2019-07-02   Median : 5.670   Median : 5.867   Median : 5.500  
##  Mean   :2019-07-02   Mean   : 6.457   Mean   : 6.655   Mean   : 6.283  
##  3rd Qu.:2019-10-01   3rd Qu.: 7.322   3rd Qu.: 7.500   3rd Qu.: 7.200  
##  Max.   :2019-12-31   Max.   :11.840   Max.   :12.000   Max.   :11.560  
##    FRTA.close     FRTA.adjclose     FRTA.volume     
##  Min.   : 3.790   Min.   : 3.790   Min.   :  44100  
##  1st Qu.: 4.795   1st Qu.: 4.795   1st Qu.: 117950  
##  Median : 5.745   Median : 5.745   Median : 180600  
##  Mean   : 6.484   Mean   : 6.484   Mean   : 233202  
##  3rd Qu.: 7.293   3rd Qu.: 7.293   3rd Qu.: 258300  
##  Max.   :11.800   Max.   :11.800   Max.   :1965600
#Trabajaremos con los precios ajustados debido a que arregla el desfase de precios despues de pagar dividendos.
forterra <- FORTERRA.DB[, 5]

#Mediante las siguientes funciones podemos apreciar el primer y el ultimo dato respectivamente.
head(forterra, 1)
##            FRTA.adjclose
## 2019-01-02          4.23
tail(forterra, 1)
##            FRTA.adjclose
## 2019-12-31         11.56
#Una vez obtenidos los valores con los que trabajaremos los volveremos una erie de tiempo mediente la siguiente función.
ts.forterra <- ts(forterra, start = c(2019,1), frequency = 365)
#Obtendremos una idea de como son los datos en terminos cuantitativos mediante la siguiente función:
summary(ts.forterra)
##  FRTA.adjclose   
##  Min.   : 3.790  
##  1st Qu.: 4.795  
##  Median : 5.745  
##  Mean   : 6.484  
##  3rd Qu.: 7.293  
##  Max.   :11.800

PRECIOS Y RENDIMIENTOS

*(Pregunta 2)

Ciertamente, la mayoría de las series financieras presentan un comportamiento errático, en los que se alternan períodos de estabilidad con períodos de turbulencia.

En finanzas se suele considerar, con mucha frecuencia, las series de rentabilidades en lugar de las series de precios. Los argumentos para tomar esta decisión son basicamente dos: -La primera de estos, esta relacionado con los inversores, quienes afirman que la serie de rentabilidades de un activo es una síntesis completa y libre de escala de la oportunidad de inversión. -La segunda razón tiene que ver con el hecho de que, las series de rentabilidades presentan, en general, mejores propiedades estadísticas que las series de precios de activos, las cuales suelen mostrar una tendencia a largo plazo, mientras que a corto plazo o a medio plazo presentan movimientos de crecimiento y decrecimiento. Esto arroja como resultado que al tomar pequeñas muestras de la serie de precios correspondientes a un mismo activo pero tomadas en diferentes períodos estas exhiban medias distintas, con lo cual se dificulta el análisis estadístico.

Redimiento Discreto

El rendimiento discreto es visto como la relacion entre la ganancia en un determinado tiempo respecto de la inversión inicial, esto es en terminos matemáticos de la siguiente forma:

\[r_t=(P_t-P_{t-1})/P_{t-1}\]

Ahora lo aplicaremos a R:

tamano.precios <- length(ts.forterra)
retorno.dis <- numeric(length = tamano.precios)
for (i in 2:tamano.precios) {
  retorno.dis[i] <- (ts.forterra[i]/ts.forterra[i - 1]) - 1
}
ts.plot(retorno.dis)

Rendimiento Continuo

Las entidades financieras, bancos e inversores hacen uso de la rentabilidad simple para sus aplicaciones empíricas. No obstante, las rentabilidades continuas presentan propiedades estadísticas más atractivas en cuanto a que son más manejables. Por esta razón, en el ámbito académico y de investigación son las rentabilidades continuas las de mayor frecuencia. Siendo enmarcado ademas que el avance en modelos econométricos y de predicción han difundido su uso. El rendimiento continuo se calcula de la siguiente forma:

\[R_t=\text{ln}(P_t/P_{t-1})\]

Aplicando la propiedad de logaritmos la ecuación quedaria de la siguiente forma:

\[R_t=\text{ln}(P_t)-\text{ln}(P_{t-1})\]

Aplicando a R:

retorno.con<-diff(log(ts.forterra))
ts.plot(retorno.con)

Análisis de los Retornos

*(Pregunta 3)

Se enfocara el análisis de los retornos continuos debido a las ventajas matemáticas y computacionales respecto del retorno discreto

mean(retorno.con) #Esta función muestra la media de los datos
## [1] 0.004005374
var(retorno.con)  #Esta función muestra la varianza de los datos
##               FRTA.adjclose
## FRTA.adjclose    0.00201069
sd(retorno.con)   #Esta función muestra la desviación estandar de los datos
## [1] 0.04484072

Como se puede observar en los siguientes datos se tiene que la media (el primer valor observado) tiene un valor positivo lo que muestra que en promedio se ha tenido una ganancia por los rendimientos obtenidos, la segunda observación que se puede dar es que en datos aproximados es 0.4% rentable en promedio. Respecto a la Varianza y a la desviación estandar (Segundo y tercer valor observado), estas al ser medidas de dispersión muestran que tanto se aleja de la media los valores observados, que en terminos de inversiones seria cual es la varabilidad de tu rendimiento, como se observa el valor de la desviación estandar es mucho mayor a la media lo que indica una alta volatilidad de los rendimientos, caracteristica típica de las series financieras, consecuente con esta información se debe tener en cuenta que habiendo tomado los precios ajustados, al ser los rendimientos muy volatiles y que estos sean calculados a partir de los precios muestran que los mercados financieros son altamente variantes y que obtener algun tipo de rentabilidad implica una vigilancia en las carteras de inversión.

Observando los Retornos Continuos

*(Pregunta 4)

Una suposición teórica que se suele dar en las finanzas es que los datos analizados siguen una distribución normal, esto se da por la facilidad de cálculo, ademas de poder usar a la varianza como medida de volatilidad porque los datos tendrian una caracterización simetrica, sin embargo en el mundo real las series financieras no siguen este supuesto de normalidad y una de las maneras para constatar si la distribución de nuestros datos sigue la normalidad es graficando la distribución empirica de la data analizada y superponerlo a una grafica de una normal con la misma media y varianza que la data.

Esto en R la grafica se realiza empleando el siguiente codigo:

x<-seq(-0.1,0.1,by=0.01)
hist(
  retorno.con,prob=TRUE,xlim = c(-0.5,0.5), breaks = 50,col = "grey94",
  main = c("Histograma de los Retornos Continuos"),
  xlab = expression("Retornos Continuos"),
  ylab=c("Densidad"),
)
lines(density(retorno.con),lwd=2,lty=1,col=("blue"))
curve(dnorm(x,mean=mean(retorno.con),sd=sd(retorno.con)),lwd=2,lty=1,col="red",add = T)

Siendo la grafica en linea azul la distribución empirica de nuestros datos y la roja la distribución normal simulada con la media y varianza de la data se puede observar que los rendimientos continuos no siguen una distribución normal y se puede catalogar como una distribución leptocúrtica, es decir la mayoria de los datos esta muy agrupado cerca a su media (que tambien es una característica de las series de datos financieras), la distribución al no seguir una distribución normal tendra otro tratamiento y por ende otro tipo de modelización de volatilidad donde el uso de la varianza como medida de esta es ineficiente.

TEST DE NORMALIDAD

*(Pregunta 5)

Se puede tener una noción si los datos siguen una distribución normal a traves de la comparación grafica sin embargo formalmente existen metodos para constatar esta y el camino mas recomendado para constatar esta información. Los test de normalidad son una herramienta eficaz para constatar si tus datos siguen una distribución normal, dependiendo del p valor se aceptara o rechazara una hipotesis nula, si el p valor es menor 5% se rechaza la hipotesis nula y si es mayor se acepta. Presentaremos 3 test de normalidad:

  • Test Jarque-Bera: Hipótesis Nula - curtosis y asimetria de una normal
  tseries::jarque.bera.test(retorno.con)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
## 
##  Jarque Bera Test
## 
## data:  retorno.con
## X-squared = 278.33, df = 2, p-value < 2.2e-16

Se recahaza la Hipótesis Nula

  • Test Spahiro-Wilk: Hipótesis Nula - normalidad
  shapiro.test(retorno.con)
## 
##  Shapiro-Wilk normality test
## 
## data:  retorno.con
## W = 0.91958, p-value = 2.123e-10

Se recahaza la Hipótesis Nula

  • Test Kolmogorov-Smirnov: Hipótesis Nula - normalidad
  ks.test(retorno.con, "pnorm", mean=mean(retorno.con), sd=sd(retorno.con))
## Warning in ks.test(retorno.con, "pnorm", mean = mean(retorno.con), sd =
## sd(retorno.con)): ties should not be present for the Kolmogorov-Smirnov test
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  retorno.con
## D = 0.096715, p-value = 0.01827
## alternative hypothesis: two-sided

Se recahaza la Hipótesis Nula

Como se puede observar se constata lo que anteriormente se habia observado con el análisis gráfico, esta confirmación formal implica que para realizar un alisis de esta serie financiera se tendra que realizar varias peculiaridades como por ejemplo centrarse en el análisis de la kurtosis.

VALUE AT RISK (VALOR EN RIESGO)

*(Pregunta 6)

El valor en riesgo (conocido comúnmente como VaR), es una técnica estadística que mide el grado de exposición ante el riesgo financiero, este valor es en terminos moteraios, y van acompañado de un nivel de confianza y de la medida del tiempo con que se realizo el calculo que suele ser diario, semanal o mensual. En terminos sencillos, el VaR indica la probabilidad (normalmente 1% o 5%) de sufrir una determinada pérdida durante un periodo de tiempo.

Se empleará la data de FORTERRA para calcular el VaR para un nivel de significancia de α1 = 0.01, α2 = 0.05, α3 = 0.1

Hay tres formas de calcular el VaR:

-VAR HISTÓRICO

El metodo para calcular el VaR Histórico consiste en utilizar una serie histórica de la posición de riesgo para construir una serie de tiempo de rendimientos simulados o hipotéticos.

En R ejecutamos el siguiente codigo:

W<-100000

alpha1 <- 0.01
q1 <- quantile(x=retorno.con, alpha1)
mean(exp(q1)-1)
## [1] -0.111415
VAR1 <- W*(exp(q1)-1)
VAR1
##       1% 
## -11141.5
alpha2 <- 0.05
q1 <- quantile(x=retorno.con, alpha2)
mean(exp(q1)-1)
## [1] -0.07039709
VAR2 <- W*(exp(q1)-1)
VAR2
##        5% 
## -7039.709
alpha3 <- 0.1
q1 <- quantile(x=retorno.con, alpha3)
mean(exp(q1)-1)
## [1] -0.04185022
VAR3 <- W*(exp(q1)-1)
VAR3
##       10% 
## -4185.022

Las perdidas monetarias diarias al 1%, 5% y 10% de probabilidad es de 11141.5, 7039.709 y 4185.022 respectivamente.

-VAR PARAMÉTRICO

El método parametrico tiene como característica el supuesto de que los rendimientos del activo en cuestión se distribuyen de acuerdo a una curva de densidad de probabilidad normal. Sin embargo, en la prácica se ha observado que la mayoría de los activos no siguen un comportamiento estrictamente normal, sino que son aproximados a la curva normal y, por tanto, los resultados que se obtienen al medir el riesgo son una aproximación.

En R ejecutamos el siguiente codigo:

VARp1<-qnorm(0.01,mean = mean(retorno.con),sd = sd(retorno.con),lower.tail = T)
VAR.M.1<-(exp(VARp1)-1)*100000
VAR.M.1
## [1] -9544.28
VARp2<-qnorm(0.05,mean = mean(retorno.con),sd = sd(retorno.con),lower.tail = T)
VAR.M.2<-(exp(VARp2)-1)*100000
VAR.M.2
## [1] -6737.402
VARp3<-qnorm(0.1,mean = mean(retorno.con),sd = sd(retorno.con),lower.tail = T)
VAR.M.3<-(exp(VARp3)-1)*100000
VAR.M.3
## [1] -5205.644

Las perdidas monetarias diarias al 1%, 5% y 10% de probabilidad es de 9544.28, 6737.402 y 5205.644 respectivamente.

-VAR MONTE CARLO

El método Monte Carlo para estimar el VaR utiliza un software informático para generar cientos o miles de posibles resultados según unos datos iniciales introducidos por el usuario.

Ejecutamos los siguientes codigos en R para el VaR Monte Carlo con un nivel de confianza de 1%:

VAR.MC.1 <- numeric()
for (i in 1:10000) {
  changes <- rnorm(length(retorno.con),mean=1+mean(retorno.con),sd=sd(retorno.con))
  sim.ts <- cumprod(c(as.numeric(ts.forterra[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.1[i] <- sim.VAR
}
mean(VAR.MC.1)
## [1] -0.09696995
sd(VAR.MC.1)
## [1] 0.009397536
plot(density(VAR.MC.1))

quantile(VAR.MC.1,0.225)
##      22.5% 
## -0.1038943
quantile(VAR.MC.1,0.975)
##       97.5% 
## -0.07976413

Ejecutamos los siguientes codigos en R para el VaR Monte Carlo con un nivel de confianza de 5%:

VAR.MC.2 <- numeric()
for (i in 1:10000) {
  changes <- rnorm(length(retorno.con),mean=1+mean(retorno.con),sd=sd(retorno.con))
  sim.ts <- cumprod(c(as.numeric(ts.forterra[1]),changes))
  sim.R <- diff(log(sim.ts))
  sim.q <- quantile(sim.R,0.05,na.rm = T)
  sim.VAR <- exp(sim.q)-1
  VAR.MC.2[i] <- sim.VAR
}
mean(VAR.MC.2)
## [1] -0.06882962
sd(VAR.MC.2)
## [1] 0.005770019
plot(density(VAR.MC.2))

quantile(VAR.MC.2,0.225)
##       22.5% 
## -0.07308641
quantile(VAR.MC.2,0.975)
##       97.5% 
## -0.05782347

Ejecutamos los siguientes codigos en R para el VaR Monte Carlo con un nivel de confianza de 10%:

VAR.MC.3 <- numeric()
for (i in 1:10000) {
  changes <- rnorm(length(retorno.con),mean=1+mean(retorno.con),sd=sd(retorno.con))
  sim.ts <- cumprod(c(as.numeric(ts.forterra[1]),changes))
  sim.R <- diff(log(sim.ts))
  sim.q <- quantile(sim.R,0.05,na.rm = T)
  sim.VAR <- exp(sim.q)-1
  VAR.MC.3[i] <- sim.VAR
}
mean(VAR.MC.3)
## [1] -0.06887059
sd(VAR.MC.3)
## [1] 0.005821324
plot(density(VAR.MC.3))

quantile(VAR.MC.3,0.225)
##       22.5% 
## -0.07321366
quantile(VAR.MC.3,0.975)
##       97.5% 
## -0.05789071

Modelo Autorregresivo con Heterocedasticidad Condicional Genralizado(GARCH)

*(Pregunta 7)

Cuando se consideran modelos ARCH para caracterizar el comportamiento dinámico de la volatilidad suele ocurrir que el orden p del modelo sea significativamente alto. Esto conlleva a que las restricciones sobre los parámetros, para garantizar la no negatividad de la varianza y la no estacionariedad del proceso, sean muy fuertes. Para estos modelos, la varianza condicional en un instante depende, no solo de los valores pasados de los impulsos al cuadrado sino también de sus propios retardos. Así, un modelo GARCH(p, q) distribuye de la siguiente manera:

\[h_t = \alpha_0 + \alpha_1r^2_{t-1} + \beta h_{t-1}\]

Los errores de la siguiente manera: \[ \varepsilon_t|\Psi \thicksim N(0,\sigma_t^2) \] Para el caso del GARCH (1,1) tenemos una varianza condicional de:

\[ \sigma_t^2=\alpha_0+\delta_1\sigma_{t-1}^2+\alpha_1\varepsilon_{t-1}^2 \] Asi, una vez que tenemos el proceso descrito lo ejecutamos en R:

ts.garch <- tseries::garch(retorno.con,c(1,1))
## 
##  ***** ESTIMATION WITH ANALYTICAL GRADIENT ***** 
## 
## 
##      I     INITIAL X(I)        D(I)
## 
##      1     1.809621e-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.543e+02
##      1    6 -6.544e+02  8.25e-05  3.41e-04  1.0e-03  2.2e+07  1.0e-04  3.80e+03
##      2    7 -6.544e+02  3.87e-05  4.35e-05  9.2e-04  2.0e+00  1.0e-04  1.09e+00
##      3   13 -6.563e+02  2.97e-03  5.35e-03  4.8e-01  2.0e+00  9.3e-02  1.09e+00
##      4   15 -6.576e+02  1.87e-03  1.97e-03  3.0e-01  1.9e+00  9.3e-02  1.40e-01
##      5   16 -6.580e+02  7.40e-04  1.39e-03  2.3e-01  1.8e+00  9.3e-02  1.93e-02
##      6   17 -6.585e+02  7.35e-04  1.60e-03  1.6e-01  1.2e+00  9.3e-02  2.49e-03
##      7   18 -6.586e+02  1.23e-04  1.10e-04  1.7e-02  0.0e+00  1.5e-02  1.10e-04
##      8   19 -6.586e+02  2.98e-05  1.77e-05  1.6e-02  0.0e+00  1.3e-02  1.77e-05
##      9   20 -6.586e+02  2.18e-05  1.92e-05  2.6e-02  0.0e+00  2.1e-02  1.92e-05
##     10   21 -6.586e+02  1.99e-06  1.10e-06  6.5e-03  0.0e+00  4.7e-03  1.10e-06
##     11   48 -6.586e+02  1.73e-16  1.26e-15  1.5e-14  7.6e+07  1.1e-14  1.35e-07
##     12   50 -6.586e+02  3.45e-16  8.16e-16  1.0e-14  1.0e+08  7.2e-15  1.28e-07
##     13   51 -6.586e+02 -1.21e-15  1.63e-15  2.0e-14  5.2e+07  1.4e-14  1.28e-07
## 
##  ***** FALSE CONVERGENCE *****
## 
##  FUNCTION    -6.586457e+02   RELDX        2.001e-14
##  FUNC. EVALS      51         GRAD. EVALS      13
##  PRELDF       1.631e-15      NPRELDF      1.279e-07
## 
##      I      FINAL X(I)        D(I)          G(I)
## 
##      1    9.415951e-04     1.000e+00    -7.429e+01
##      2    1.704457e-01     1.000e+00     6.401e-02
##      3    3.615131e-01     1.000e+00    -6.187e-02

Ahora que tenemos los resultados veremos una descripción por medio de la funcion summary:

summary(ts.garch)
## 
## Call:
## tseries::garch(x = retorno.con, order = c(1, 1))
## 
## Model:
## GARCH(1,1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -3.99103 -0.35140  0.09966  0.56577  6.38457 
## 
## Coefficient(s):
##     Estimate  Std. Error  t value Pr(>|t|)   
## a0 0.0009416   0.0003654    2.577  0.00998 **
## a1 0.1704457   0.0841737    2.025  0.04287 * 
## b1 0.3615131   0.2360365    1.532  0.12562   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Diagnostic Tests:
##  Jarque Bera Test
## 
## data:  Residuals
## X-squared = 551.32, df = 2, p-value < 2.2e-16
## 
## 
##  Box-Ljung test
## 
## data:  Squared.Residuals
## X-squared = 0.2579, df = 1, p-value = 0.6116

Teniendo los parametros del modelo definidos procedemos a calcular la varianza incondicional:

\[h = \alpha_0/(1-\alpha_1-\beta)\] En R ejecutamos el siguiente código:

Coef.garch <- ts.garch$coef
alfa.cero <- Coef.garch[1]
alfa.uno <- Coef.garch[2]
beta <- Coef.garch[3]
Varianza.Incondicional <- (alfa.cero / (1 - alfa.uno - beta))
Varianza.Incondicional
##          a0 
## 0.002011778

Teniendo los parametros del modelo definidos procedemos a calcular la persisencia:

\[\gamma = \alpha_1 + \beta\]

En R ejecutamos el siguiente código:

Prevalencia <- (alfa.uno + beta)
Prevalencia
##        a1 
## 0.5319588

Se puede inferir que la Prevalencia al ser menor a 1 es estacionario, es decir que cuando ocurre un choque de varianza esta vuelve a su valor de largo plazo.