1 Introduction to ARCH model

You have to read my note “Introducción a modelos ARCH”.

An ARCH model is designed to model daily variance of financial instruments. We will start with the ARCH(1) model. Assume that \(Y_t\) is the daily continuously compounded return of a financial instrument, then we can model its variance as follows:

\[ Y_{t}=\beta_{0}+\varepsilon_{t} \] In this case, we are interested on the shock or error of the series, not on the actual mean return of the series. This is the reason I indicated that the daily value of Y is about a mean value \(B_0\) plus a random shock (error). This error is supposed to behave like a normal distributed variable with a specific variance and mean equal to zero. Then, I will now focus on how to model the variance of this daily error series:

The shock follows a normal distribution with mean 0 and volatility = square root of h: \[ \varepsilon_{t}\thicksim N(0,\sqrt{h}_{t}) \] Now we will model variance \(h_t\) as an autoregressive process similar to an MA process:

\[ h_{t}=\alpha_{0}+\alpha_{1}\varepsilon_{t-1}^{2} \] We see that the variance of today is equal to a coefficient \(\alpha_0\) plus \(\alpha_1\) times the squared shock of yesterday.

\[ \alpha_{0}>=0;0<=\alpha_{1}<1 \]

This model is called ARCH(1) since we are considering only the lag 1 of the shock as a factor that impacts the return variance of today.

We can see that \(\alpha_1\) is like a filter with values from 0 to 1. If \(\alpha_1\) is close to 1, then almost all information of the previous shock squared will pass to the variance of today. Then, the higher the value of \(\alpha_1\), the higher the impact of the shock of yesterday to the return variance of today.

We will play with a simulation to better understand this ARCH(1) model.

1.1 Simulating ARCH(1)

Now you have to simulate 2 ARCH(1) models using 500 periods (days) with the following specifications:

For model 1 use \(\beta_0=0\), \(\alpha_0=1\), and \(\alpha_1=0.90\). You can do this simulation in R as follows:

alpha0=1
alpha1= 0.9
B0= 0

I create empty vectors for the 500 variances and shocks:

n = 500
error = single(length=n)
h = single(length=n)

The single function creates a numeric vector with a specific length and with zero values.

I generate the first random shock following the specifications:

h[1] = alpha0 + alpha1*0 
# Since there is no shock at day 0, I will assign 0 to this shock, so I only
#   consider alpha for the formula of the variance

error[1] = rnorm(n = 1, mean=0, sd=sqrt(h[1]))

Now create the Y variable, which will be an ARCH(1) process. Assign the value for Y for the first day:

Y= single(length=n)
Y[1]= B0 + error[1]

Now fill out the Y values for the rest of the days

for (i in 2:n){
  h[i] <- alpha0 + alpha1*((error[i-1]^2))
  error[i] <- rnorm(n=1, 0, sqrt(h[i]))
}

We can see the first values of h and error:

head(error)
## [1]  0.2398045 -0.1093199  0.7450560  1.0516638 -1.4913706  0.2722053
head(h)
## [1] 1.000000 1.051756 1.010756 1.499598 1.995397 3.001768

Now I create the Y values from day 2 to day 500:

for (i in 2:n){
Y[i] <- B0 + error[i]
}
plot(Y,  type="l", col="blue")


Now using the same dataset SIMULATE model 2 (as Y2) as another ARCH(1). Use alpha0=0.1 and alpha1=0.1.


Here is the simulation of Y2 as an ARCH(1) model with alpha0=0.1 and alpha1=0.1.

I follow the same logic and steps I did for Y:

SOLUTION for this simulation:

I start re-defining the parameters of this ARCH(1) model:

alpha0=0.1
alpha1= 0.1
B0= 0

I create again empty vectors for the 500 variances and shocks. I will use the same R variables I used for Y, so the previous values will be replaced with the new ones:

n = 500
error = single(n)
h = single(n)

The single function creates a numeric vector with zero values.

I generate the first random shock following the specifications:

h[1] = alpha0 + alpha1*0 
# Since there is no shock at day 0, I will assign 0 to this shock, so I only
#   consider alpha for the formula of the variance

error[1] = rnorm(n = 1, mean=0, sd=sqrt(h[1]))

Now create the Y2 variable, which will be an ARCH(1) process. Assign the value for Y for the first day:

Y2= single(length=n)
Y[1]= B0 + error[1]

Now fill out the Y2 values for the rest of the days.

I start filling the values for the variances from day 2 to day N.

# I do a look to estimate the changing variances from day 2 to N
for (i in 2:n){
  # For each iteration, I create the variance according to the ARCH(1) equation
  h[i] <- alpha0 + alpha1*((error[i-1]^2))
  # Using the calculated variance for day i, h[i], now I randomly create a shock/error
  #   that follows a normal distribution with mean = 0 and standard deviation= sqrt(h[i])
  error[i] <- rnorm(n=1, 0, sqrt(h[i]))
}

We can see the first values of h and error:

head(error)
## [1] -0.71363680 -0.22334989  0.45022941  0.05687703  0.09529039 -0.54821941
head(h)
## [1] 0.1000000 0.1509277 0.1049885 0.1202707 0.1003235 0.1009080

Now I create the Y2 values from day 2 to day 500:

for (i in 2:n){
Y2[i] <- B0 + error[i]
}

plot(Y2,  type="l", col="blue")


WHAT IS THE DIFFERENCE BETWEEN THE SERIES Y AND Y2?


THE MAIN DIFFERENCE IS THAT Y2 HAS A MORE HOMOGENEOUS VARIANCE COMPARED WITH Y. Y HAS CHANGING VOLATILITY OVER TIME, WHILE Y2 SEEMS TO HAVE ABOUT THE SAME VARIANCE OVER TIME.


Looking at the original ARCH equation, EXPLAIN why do you think both series are different?


THE ARCH(1) EQUATION IS:

\[ Y_{t}=\beta_{0}+\varepsilon_{t} \]

The shock follows a normal distribution with mean 0 and volatility = square root of h: \[ \varepsilon_{t}\thicksim N(0,\sqrt{h}_{t}) \]

Now we will model variance \(h_t\) as an autoregressive process similar to an MA process:

\[ h_{t}=\alpha_{0}+\alpha_{1}\varepsilon_{t-1}^{2} \]

We see that the variance of today is equal to a coefficient \(\alpha_0\) plus \(\alpha_1\) times the squared shock of yesterday.


FOR Y, WE USED AN ALPHA1=0.9, AND FOR Y2 WE USED AN ALPHA1=0.1. THIS MEANS THAT FOR Y2, ONLY ABOUT 10% OF THE SQUARED ERRORS OF YESTERDAY ARE PASSED TO THE VARIANCE OF TODAY. WE CAN SEE THAT AS ALPHA1 IS CLOSE TO ZERO, THEN THE VARIANCE WILL BE ABOUT THE SAME FOR THE WHOLE PERIOD.


2 Further understanding of volatility

In this exercise we analyze volatility of financial returns using rolling windows. It has been shown that volatility of financial instruments changeS over time. As we practiced in previous exercise, family ARCH models are designed to model the changing volatility, which is the standard deviation of returns (actually, these models analyze the changing variance, but the volatility is the squared root of the variance). In this part, we will use daily returns of a market index, and calculate rolling means and rolling standard deviations using a moving/rolling windows of 20 business days.

  1. Download daily returns of the IPyC (from Jan 2008 to date) from Yahoo Finance.
#Load the quantmod library to use the getsymbols command:
library(quantmod)
IPC <- getSymbols("^MXX", from="2008-01-01",auto.assign = FALSE)[,6]
# auto.assign=FALSE since I want the dataset to be called IPC, not MXX
# I indicate to get the column 6 of the dataset, which is the adjusted price

# I calculate cc returns of the IPCyC index:

ipc_ret <- na.omit(diff(log(IPC)))
  1. Using the rollapply() function from the zoo package, and a moving window of 20 business days (one month), generate a dataset with the rolling mean and rolling volatility of the IPyC continuously compounded returns:
library(zoo)
roll_mean <- na.omit(rollapply(ipc_ret, 20, mean))
roll_sd <- na.omit(rollapply(ipc_ret, 20, sd))

ipc_mean_vol <- merge(roll_mean, roll_sd)
colnames(ipc_mean_vol) <- c("roll_mean", "roll_sd")
  1. R will generate a new dataset that contains one time window for each row. Now plot both variables. The average 20-day volatility and the average 20-day returns: (The sd will be the red line and the mean, the black line):
plot(ipc_mean_vol)


WHAT DO YOU OBSERVE? In which periods you observe more volatility?


I SEE MORE VOLATILITY IN 2008 AND 2020 (THE 2 YEARS OF FINANCIAL CRISIS).


Describe with your words, if you see a relationship between volatility and average returns.


WE CAN SEE THAT IN BOTH PLOTS, FOR HIGH PERIODS OF VOLATILITY, USUALLY WE SEE DAYS WITH VERY NEGATIVE RETURNS. THE HIGHER THE VOLATILITY THE MORE THE PROBABILITY TO HAVE VERY NEGATIVE RETURNS.


  1. Do the same steps 2 and 3, but now move the window to 5 days. Report your responses to the same questions and compare the results with the 20-day window results.

Now I use a rolling window of only 5 days:

roll_mean2 <- na.omit(rollapply(ipc_ret, 5, mean))
roll_sd2 <- na.omit(rollapply(ipc_ret, 5, sd))

ipc_mean_vol2 <- merge(roll_mean2, roll_sd2)
colnames(ipc_mean_vol2) <- c("roll_mean", "roll_sd")

I plot this new means and volatilities with a rolling window of 5 days:

(The sd will be the red line and the mean, the black line):

plot(ipc_mean_vol2)


COMPARED WITH THE PREVIOUS PLOT OF 20-DAY ROLLING MEANS AND VOLATILITY, WE SEE THAT THE 5-DAY ROLLING MEANS AND VOLATILITIES HAVE A WIDER RANGE OF MOVEMENT OVER TIME. THIS IS EXPECTED SINCE THE VARIABILITY OF THE MEAN OF ONLY 5 DAYS SHOULD BE BIGGER COMPARED WITH THE VARIABILITY OF THE MEAN OF 20 DAYS; THE MORE THE DAYS WE USE FOR THE COMPUTING THE MEAN, THE LESS THE VARIABILITY OF THE MEANS. THEN, WE WOULD FIND MORE VOLATILITY OF THE MEAN OF DAILY RETURNS FOR SHORTER PERIODS OF TIME.


3 Modeling the IPCyC returns with an ARCH model

  1. Download daily data of the IPyC from Yahoo Finance from Jan 1, 2013 to date. Check whether the IPCyC cc returns are heteroscedastic. In other words, check whether the IPCyC returns follow an ARCH(1) process.
# I run the getSymbols indicating that I only want the column 6, 
#   and I do not want to name the object automatically (auto.assign=FALSE)
IPC13 <- getSymbols("^MXX", from="2013-01-01",
                    to="2021-10-01", auto.assign = FALSE)[,6]

# I calculate cc returns:
ipc_ret13 <- na.omit(diff(log(IPC13)))

colnames(ipc_ret13) <- c("r")
plot(ipc_ret13)

Now we check whether the IPCyC returns are heteroscedastic. You can do this by testing whether the cc IPCyC returns follows an ARCH process. Do this test and interpret it.

We do this test with the ArchTest function from the FinTS package (Install this package)

library(FinTS)
## Warning: package 'FinTS' was built under R version 4.1.3
ArchTest(ipc_ret13$r)
## 
##  ARCH LM-test; Null hypothesis: no ARCH effects
## 
## data:  ipc_ret13$r
## Chi-squared = 453.65, df = 12, p-value < 2.2e-16

INTERPRETATION:

Since the p-value of this test is less than 0.05, we can reject the NULL hypothesis that states that there is NO ARCH effects. In sum, we can have statistical evidence to say that the IPCyC returns has heteroscedasticity in its variance.

  1. Check if an ARCH(1) model fits the series.

We need to install the fGarch package first.

library(fGarch)
arch.fit <- garchFit(~garch(1,0), data = ipc_ret13$r, trace = F)
summary(arch.fit)
## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(1, 0), data = ipc_ret13$r, trace = F) 
## 
## Mean and Variance Equation:
##  data ~ garch(1, 0)
## <environment: 0x0000000016e40f08>
##  [data = ipc_ret13$r]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##         mu       omega      alpha1  
## 5.6089e-05  6.7850e-05  3.0349e-01  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## mu     5.609e-05   1.923e-04    0.292    0.771    
## omega  6.785e-05   2.807e-06   24.174  < 2e-16 ***
## alpha1 3.035e-01   3.755e-02    8.083 6.66e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  7128.66    normalized:  3.249161 
## 
## Description:
##  Wed Apr 27 08:44:30 2022 by user: Alberto 
## 
## 
## Standardised Residuals Tests:
##                                 Statistic p-Value    
##  Jarque-Bera Test   R    Chi^2  559.519   0          
##  Shapiro-Wilk Test  R    W      0.9780604 0          
##  Ljung-Box Test     R    Q(10)  26.51314  0.003108016
##  Ljung-Box Test     R    Q(15)  31.12279  0.008458383
##  Ljung-Box Test     R    Q(20)  40.08945  0.004866927
##  Ljung-Box Test     R^2  Q(10)  240.4888  0          
##  Ljung-Box Test     R^2  Q(15)  381.8752  0          
##  Ljung-Box Test     R^2  Q(20)  437.1344  0          
##  LM Arch Test       R    TR^2   201.9747  0          
## 
## Information Criterion Statistics:
##       AIC       BIC       SIC      HQIC 
## -6.495588 -6.487803 -6.495592 -6.492743

We can also run the same ARCH model using the ugarchfit from the rugarch package.

library(FinTS)
library(rugarch)
#ARCH(1) 

Espec1=ugarchspec(variance.model= list(model= "sGARCH", garchOrder= c(1, 0), 
submodel= NULL,  variance.targeting= FALSE), 
mean.model= list(armaOrder= c(0, 0), include.mean= TRUE, archm= FALSE, 
archpow= 0, arfima= FALSE, external.regressors= NULL, archex= FALSE), 
distribution.model= "norm", start.pars= list(), fixed.pars= list())

#Running the ARCH model with the specifications:
arch1<- ugarchfit(spec=Espec1, data=ipc_ret13$r)
arch1
## 
## *---------------------------------*
## *          GARCH Model Fit        *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## -----------------------------------
## GARCH Model  : sGARCH(1,0)
## Mean Model   : ARFIMA(0,0,0)
## Distribution : norm 
## 
## Optimal Parameters
## ------------------------------------
##         Estimate  Std. Error  t value Pr(>|t|)
## mu      0.000056    0.000192  0.29162  0.77058
## omega   0.000068    0.000003 24.16390  0.00000
## alpha1  0.303952    0.037609  8.08184  0.00000
## 
## Robust Standard Errors:
##         Estimate  Std. Error  t value Pr(>|t|)
## mu      0.000056    0.000195  0.28781 0.773488
## omega   0.000068    0.000005 13.36853 0.000000
## alpha1  0.303952    0.077328  3.93068 0.000085
## 
## LogLikelihood : 7128.665 
## 
## Information Criteria
## ------------------------------------
##                     
## Akaike       -6.4956
## Bayes        -6.4878
## Shibata      -6.4956
## Hannan-Quinn -6.4927
## 
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
##                         statistic   p-value
## Lag[1]                      8.314 0.0039342
## Lag[2*(p+q)+(p+q)-1][2]     9.512 0.0025732
## Lag[4*(p+q)+(p+q)-1][5]    14.153 0.0007492
## d.o.f=0
## H0 : No serial correlation
## 
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
##                         statistic   p-value
## Lag[1]                       1.85 1.738e-01
## Lag[2*(p+q)+(p+q)-1][2]     17.10 2.567e-05
## Lag[4*(p+q)+(p+q)-1][5]     71.70 0.000e+00
## d.o.f=1
## 
## Weighted ARCH LM Tests
## ------------------------------------
##             Statistic Shape Scale   P-Value
## ARCH Lag[2]     30.45 0.500 2.000 3.422e-08
## ARCH Lag[4]     82.53 1.397 1.611 0.000e+00
## ARCH Lag[6]    106.39 2.222 1.500 0.000e+00
## 
## Nyblom stability test
## ------------------------------------
## Joint Statistic:  2.6786
## Individual Statistics:              
## mu     0.08615
## omega  2.11360
## alpha1 1.10579
## 
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic:          0.846 1.01 1.35
## Individual Statistic:     0.35 0.47 0.75
## 
## Sign Bias Test
## ------------------------------------
##                    t-value   prob sig
## Sign Bias           0.7212 0.4709    
## Negative Sign Bias  0.6669 0.5049    
## Positive Sign Bias  0.8604 0.3897    
## Joint Effect        1.1950 0.7542    
## 
## 
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
##   group statistic p-value(g-1)
## 1    20     71.07    6.105e-08
## 2    30     79.35    1.439e-06
## 3    40     95.48    1.224e-06
## 4    50    108.28    2.303e-06
## 
## 
## Elapsed time : 0.2081809

Both functions get the same estimations for the ARCH coefficients.


INTERPRET the OUTPUT of the ARCH(1) model. You have to interpret the omega, alpha and mu coefficients. The omega coefficient is equivalent to the \(\alpha_0\) coefficient of our model, and the mu coefficient is actually our \(\beta_0\) coefficient.


THE aplpha1 COEFFICIENT IS 0.3039519, which means that the squared error of yesterday is positively and significantly related with the return variance of today. In other words,30.3951852% of the squared error of yesterday is passed to the return variance of today.

The mu coefficient of 5.6075049^{-5} is the mean daily return (in decimal) of the IPCyC over time. The average daily return of the IPCyC is about 0.0056075%.

The omega coefficient represents the fixed daily amount of variance, which together with the effect of the changing shock of yesterday filtered by the alpha1 coefficient defines the variance of today.

  1. Check if a GARCH(1,1) fits the series. Run the model :
garch.fit <- garchFit(~garch(1,1), data = ipc_ret13$r, trace = F)
## Warning: Using formula(x) is deprecated when x is a character vector of length > 1.
##   Consider formula(paste(x, collapse = " ")) instead.
summary(garch.fit)
## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(1, 1), data = ipc_ret13$r, trace = F) 
## 
## Mean and Variance Equation:
##  data ~ garch(1, 1)
## <environment: 0x0000000022fc2990>
##  [data = ipc_ret13$r]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##         mu       omega      alpha1       beta1  
## 1.4819e-04  3.0712e-06  1.0725e-01  8.6075e-01  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## mu     1.482e-04   1.709e-04    0.867 0.385747    
## omega  3.071e-06   8.159e-07    3.764 0.000167 ***
## alpha1 1.073e-01   1.535e-02    6.985 2.85e-12 ***
## beta1  8.608e-01   2.023e-02   42.554  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  7258.084    normalized:  3.308151 
## 
## Description:
##  Wed Apr 27 08:44:32 2022 by user: Alberto 
## 
## 
## Standardised Residuals Tests:
##                                 Statistic p-Value     
##  Jarque-Bera Test   R    Chi^2  90.55653  0           
##  Shapiro-Wilk Test  R    W      0.9916117 6.063078e-10
##  Ljung-Box Test     R    Q(10)  21.1889   0.0198142   
##  Ljung-Box Test     R    Q(15)  24.45307  0.05778823  
##  Ljung-Box Test     R    Q(20)  33.26706  0.03153197  
##  Ljung-Box Test     R^2  Q(10)  22.45179  0.01296136  
##  Ljung-Box Test     R^2  Q(15)  25.66922  0.04164662  
##  Ljung-Box Test     R^2  Q(20)  32.40996  0.03912116  
##  LM Arch Test       R    TR^2   24.37233  0.01809386  
## 
## Information Criterion Statistics:
##       AIC       BIC       SIC      HQIC 
## -6.612656 -6.602276 -6.612663 -6.608863

We can also run the same model using the other function:

Espec2=ugarchspec(variance.model= list(model= "sGARCH", garchOrder= c(1, 1), 
submodel= NULL, external.regressors= NULL, variance.targeting= FALSE), 
mean.model= list(armaOrder= c(0, 0), include.mean= TRUE, archm= FALSE, 
archpow= 0, arfima= FALSE, external.regressors= NULL, archex= FALSE), 
distribution.model= "norm", start.pars= list(), fixed.pars= list())

#Estimación del GARCH(1,1) 
garch1<- ugarchfit(spec=Espec2, data=ipc_ret13$r)
garch1
## 
## *---------------------------------*
## *          GARCH Model Fit        *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## -----------------------------------
## GARCH Model  : sGARCH(1,1)
## Mean Model   : ARFIMA(0,0,0)
## Distribution : norm 
## 
## Optimal Parameters
## ------------------------------------
##         Estimate  Std. Error  t value Pr(>|t|)
## mu      0.000149    0.000171  0.87276 0.382794
## omega   0.000003    0.000002  1.64866 0.099218
## alpha1  0.107037    0.014045  7.62125 0.000000
## beta1   0.861658    0.019241 44.78187 0.000000
## 
## Robust Standard Errors:
##         Estimate  Std. Error  t value Pr(>|t|)
## mu      0.000149    0.000154  0.96719 0.333449
## omega   0.000003    0.000009  0.33013 0.741305
## alpha1  0.107037    0.024700  4.33344 0.000015
## beta1   0.861658    0.073294 11.75614 0.000000
## 
## LogLikelihood : 7258.083 
## 
## Information Criteria
## ------------------------------------
##                     
## Akaike       -6.6127
## Bayes        -6.6023
## Shibata      -6.6127
## Hannan-Quinn -6.6089
## 
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
##                         statistic  p-value
## Lag[1]                      7.815 0.005180
## Lag[2*(p+q)+(p+q)-1][2]     8.455 0.004901
## Lag[4*(p+q)+(p+q)-1][5]    11.738 0.003261
## d.o.f=0
## H0 : No serial correlation
## 
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                    0.09676  0.7558
## Lag[2*(p+q)+(p+q)-1][5]   3.00646  0.4059
## Lag[4*(p+q)+(p+q)-1][9]   8.89785  0.0853
## d.o.f=2
## 
## Weighted ARCH LM Tests
## ------------------------------------
##             Statistic Shape Scale P-Value
## ARCH Lag[3]     2.720 0.500 2.000 0.09913
## ARCH Lag[5]     4.907 1.440 1.667 0.10796
## ARCH Lag[7]    10.185 2.315 1.543 0.01667
## 
## Nyblom stability test
## ------------------------------------
## Joint Statistic:  8.4682
## Individual Statistics:              
## mu     0.03748
## omega  1.84301
## alpha1 0.22295
## beta1  0.21146
## 
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic:          1.07 1.24 1.6
## Individual Statistic:     0.35 0.47 0.75
## 
## Sign Bias Test
## ------------------------------------
##                    t-value   prob sig
## Sign Bias           0.5793 0.5624    
## Negative Sign Bias  1.0922 0.2749    
## Positive Sign Bias  0.7063 0.4801    
## Joint Effect        1.9257 0.5880    
## 
## 
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
##   group statistic p-value(g-1)
## 1    20     42.24    1.643e-03
## 2    30     57.01    1.432e-03
## 3    40     82.39    6.116e-05
## 4    50     96.93    5.409e-05
## 
## 
## Elapsed time : 0.1290929

We can plot the volatility estimations over time according to the GARCH(1,1) model:

plot(garch1,which=3)

This plot is very similar to the plot we did with rolling standard deviations. The difference is that in this plot, the volatility is estimated according to the GARCH(1,1) model, instead of using rolling windows.

I indicated which=3 in the plot to see the conditional volatility. There are 12 different plots we can do. You can run in your console: plot(garch1), and you can select which plot you want.


INTERPRET the model output.

What does each coefficient mean?


THE beta1 COEFFICIENT IS 0.8616583, AND IT IS SIGNIFICANTLY DIFFERENT THAN ZERO. THIS MEANS THAT ABOUT 86.1658298% OF THE RETURN VARIANCE OF YESTERDAY IS PASSED TO THE RETURN VARIANCE OF TODAY, BESIDES THE IMPACT OF THE YESTERDA’S SQUARED ERROR. SINCE THIS COEFFICIENT IS GREATER THAN 0.7, THIS IS A SIGN OF CLUSTERING OF VOLATILITY.

IN THIS CASE, CONSIDERING THE VARIANCE OF YESTERDAY, THE SQUARED ERROR OF YESTERDAY IMPACTS THE RETURN VARIANCE OF TODAY IN A POSITIVE AND SIGNIFICANT WAY, BUT ONLY ABOUT 10.703728% OF THE SQUARED ERROR OF YESTERDAY IS PASSED TO THE VARIANCE OF TODAY. WE CAN SEE THAT AFTER WE INCLUDED THE GARCH TERM, THE MAGNITUDE OF THE ALPHA COEFFICIENT WENT DOWN SIGNIFICANTLY.

  1. Do a forecast of the volatility of 5 days in the future, and do a graph to show this prediction.

If we do a forecast of the daily return with this model, we will end up with the value of mu (or \(\beta_0\) according to our mathematical definition for an ARCH model) for the next future days. The reason is that for the mean model we did not include any regressor or explanatory variable, and also we did not include ARMA terms. Then, the mean model was basically the value of the mu coefficient, which is 1.4925263^{-4}.

We can do a prediction with the GARCH(1,1) model for the daily future 10 return days, and we will see that the predictions will be the same for the future days, and equal to the mu coefficient. We can do this by applying the predict function to the object garch.fit, which was generated with the garchFit function (from the fGarch package):

#predict(garch.fit, n.ahead=10, plot=TRUE)
garch.fit.pred<-predict(garch.fit, n.ahead=10, plot=TRUE)

# garch.fit.pred stores the predictions for daily returns and daily volatility for 
#    the future 10 days

The predict function plots the historical values of the daily returns of the series (IPyC returns), and for the future values, it plots the predicted returns for the next days. We see the same prediction, which is equal to the mu coefficient. Also, we see the 95% confidence interval for the daily future returns for the IPyC, which are plotted in blue.

We can see the future predicted volatility as follows:

garch.fit.pred$standardDeviation
##  [1] 0.008897539 0.008927721 0.008956841 0.008984940 0.009012056 0.009038226
##  [7] 0.009063488 0.009087874 0.009111417 0.009134150

We can also use the rugarch package to do the predictions. We use the function ugarchforecast from the uGarchfit function:

garch1.prediction <- ugarchforecast(garch1,n.ahead= 10)

garch1.prediction will be a very special R class: an uGARCHforecast class. This is special R class object that stores information about the GARCH prediction.

For this type of R class objects, we use the @ character to access to the content of each element stored in this object.

The forecast for the daily return is stored in:

garch1.prediction@forecast$seriesFor
##        2021-09-30
## T+1  0.0001492526
## T+2  0.0001492526
## T+3  0.0001492526
## T+4  0.0001492526
## T+5  0.0001492526
## T+6  0.0001492526
## T+7  0.0001492526
## T+8  0.0001492526
## T+9  0.0001492526
## T+10 0.0001492526

The forecast for the standard deviation of returns (volatility) is stored in:

garch1.prediction@forecast$sigmaFor
##       2021-09-30
## T+1  0.008901842
## T+2  0.008932142
## T+3  0.008961396
## T+4  0.008989643
## T+5  0.009016922
## T+6  0.009043268
## T+7  0.009068717
## T+8  0.009093301
## T+9  0.009117052
## T+10 0.009140001

We can plot the historic and future volatility:

plot(garch1.prediction,which = 3)

I indicated which=3 to plot the historical and predicted volatility according to the GARCH model.

4 Estimating the market model under heterogeneity of variance

  1. Download the daily returns of CEMEX and the IPCyC (from Jan 2015 to date) from Yahoo finance. Save the variable as datacemex.

I download daily prices:

getSymbols(Symbols=c("CEMEXCPO.MX","^MXX"),from="2015-01-01",
           to="2021-10-11")
## [1] "CEMEXCPO.MX" "^MXX"

I calculate returns:

prices<-merge(Ad(CEMEXCPO.MX),Ad(MXX))
r <- na.omit(diff(log(prices)))
names(r) <- c("CEMEX","MXX")
  1. Run a simple market model to estimate a beta coefficient of CEMEX. As comments, adequately interpret the beta coefficient, the Jensen alpha coefficient, and their p-values.
m1<-lm(r$CEMEX ~ r$MXX)
plot.default(x=r$MXX,y=r$CEMEX)

m1sum<-summary(m1)
m1sum
## 
## Call:
## lm(formula = r$CEMEX ~ r$MXX)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.090026 -0.010191 -0.000749  0.009095  0.112417 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -0.0001281  0.0004538  -0.282    0.778    
## r$MXX        1.4714069  0.0454250  32.392   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.01872 on 1700 degrees of freedom
## Multiple R-squared:  0.3816, Adjusted R-squared:  0.3813 
## F-statistic:  1049 on 1 and 1700 DF,  p-value: < 2.2e-16

INTERPRETATION:

BETA0 OR ALPHA OF JENSEN IS NOT SIGNIFICANTLY DIFFERENT THAN ZERO. THIS MEANS THAT CEMEX IS NOT OFFERING RETURNS SIGNIFICANTLY ABOVE THE MARKET.

BETA1 IS 1.4714069, AND ITS pvalue IS 1.1120591^{-179}. THIS MEANS THAT CEMEX RETURNS ARE POSITIVELY AND SIGNIFICANTLY RELATED TO THE MARKET RETURNS.

TO CHECK WHETHER CEMEX IS SIGNIFICANTLY RISKIER THAN THE MARKET, WE HAVE TO CHECK WHETHER BETA1 IS SIGNIFICANTLY GREATER THAN 1 (B1>1). ON AVERAGE, IT IS GREATER THAN ONE. TO SEE WHETHER B1 IS SIGNIFICANTLY >1, WE NEED TO ESTIMATE ITS 95% CONFIDENCE INTERVAL. WE CAN DO THIS WITH THE confint FUNCTION:

cim1<-confint(m1)
cim1
##                    2.5 %       97.5 %
## (Intercept) -0.001018204 0.0007620046
## r$MXX        1.382312067 1.5605017725

WE SEE THAT THE 95% C.I. FOR B1 GOES FROM 1.3823121 to 1.5605018, SO WE CAN SAY THAT 95% OF THE TIME, B1 WILL BE GREATER THAN 1. IN OTHER WORDS, IT IS SIGNIFICANTLY RISKIER THAN THE MARKET.

  1. The OLS regression method you used in the previous point is adequate when we assume no autocorrelation of errors and also homogeneity of variance is assumed for any OLS regresson model. If these assumptions do not hold then the OLS coefficients might be accurate but its standard error will not be reliable. You have to examine the data to check for both autocorrelation and heterogeneity of variance. Do the following:

WE CAN CHECK WHETHER THERE IS SIGNIFICANTLY AUTOCORRELATIONS OF DAILY RETURNS JUT BY DOING AN AICF AND PACF PLOT:

library(astsa)
acf2(r$CEMEX)

##      [,1]  [,2]  [,3]  [,4] [,5]  [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
## ACF  0.03 -0.02 -0.03 -0.02 0.03 -0.04 0.06 0.03    0 -0.03 -0.01  0.04 -0.02
## PACF 0.03 -0.02 -0.02 -0.02 0.03 -0.04 0.06 0.02    0 -0.03  0.00  0.04 -0.02
##      [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25]
## ACF   0.02     0  0.00 -0.01  0.01  0.00  0.06  0.03  0.01  0.01 -0.01  0.02
## PACF  0.02     0 -0.01 -0.01  0.02 -0.01  0.06  0.03  0.01  0.01  0.00  0.02
##      [,26] [,27] [,28] [,29] [,30] [,31] [,32] [,33] [,34] [,35] [,36] [,37]
## ACF  -0.01 -0.03 -0.01 -0.02 -0.02  0.01 -0.01     0     0     0  0.01 -0.01
## PACF -0.02 -0.03 -0.01 -0.02 -0.03  0.02 -0.02     0     0     0  0.01  0.00
##      [,38] [,39] [,40] [,41] [,42] [,43] [,44] [,45] [,46] [,47] [,48] [,49]
## ACF   0.03  0.04  0.00 -0.02 -0.01  0.05  0.01  0.03 -0.01 -0.02  0.00 -0.02
## PACF  0.03  0.04 -0.01 -0.01 -0.01  0.04  0.01  0.03 -0.02 -0.02  0.01  0.00
##      [,50] [,51] [,52]
## ACF  -0.01 -0.01 -0.03
## PACF -0.02 -0.01 -0.03

WE CAN SEE THAT THERE IS POSITIVE AND SIGNIFICANT AUTOCORRELATION WITH ITS OWN RETURN 7 DAYS AGO AND 20 DAYS AGO.

NOW I DO THE TEST TO CHECK WHETHER THERE IS HETEROGENEITY OF VARIANCE:

ArchTest(r$CEMEX)
## 
##  ARCH LM-test; Null hypothesis: no ARCH effects
## 
## data:  r$CEMEX
## Chi-squared = 174.25, df = 12, p-value < 2.2e-16

SINCE P-VALUE OF THE TEST IS <0.05, THEN THERE IS STATISTICAL EVIDENCE FOR HETEROGENEITY OF VARIANCE.

  1. Check evidence for homogeneity of error variance in the market model. Do the corresponding test and interpret it. (test whether the residuals of the regression follows an ARCH process)

I CAN CHECK WHETHER THE ERRORS (RESIDUALS) OF THE MARKET REGRESSION MODEL HAVE HETEROGENEITY OF VARIANCE:

ArchTest(m1$residuals)
## 
##  ARCH LM-test; Null hypothesis: no ARCH effects
## 
## data:  m1$residuals
## Chi-squared = 101.57, df = 12, p-value = 2.745e-16

SINCE P-VALUE<-0.05, THEN THE RESIDUALS OF THE MARKET MODEL HAVE HETEROGENEITY OF VARIANCE.

  1. Run a market model with ARCH / GARCH effects:
  1. Run an ARCH(5) market model (hint: use the ugarchfit function including the market returns as external regressor)
Espec1=ugarchspec(variance.model= list(model= "sGARCH", 
  garchOrder= c(5, 0), #Here we specify that we want 5 arch terms and 0 GARCH terms
  submodel= NULL,   variance.targeting= FALSE), 
  mean.model= list(armaOrder= c(0, 0), # no AR nor MA terms for the mean model
  include.mean= TRUE, archm= FALSE, 
  archpow= 0, arfima= FALSE,   
  external.regressors= r$MXX, #This is the explanatory variable, the market return
  archex= FALSE), 
  distribution.model= "norm", start.pars= list(), fixed.pars= list())

#Estimación del ARCH(5)

arch5<- ugarchfit(spec=Espec1, data=r$CEMEX)
arch5
## 
## *---------------------------------*
## *          GARCH Model Fit        *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## -----------------------------------
## GARCH Model  : sGARCH(5,0)
## Mean Model   : ARFIMA(0,0,0)
## Distribution : norm 
## 
## Optimal Parameters
## ------------------------------------
##         Estimate  Std. Error  t value Pr(>|t|)
## mu     -0.000507    0.000412  -1.2314 0.218159
## mxreg1  1.474010    0.047060  31.3221 0.000000
## omega   0.000206    0.000015  13.3730 0.000000
## alpha1  0.159569    0.031266   5.1036 0.000000
## alpha2  0.101581    0.030709   3.3079 0.000940
## alpha3  0.093867    0.034476   2.7227 0.006476
## alpha4  0.046707    0.025676   1.8191 0.068898
## alpha5  0.032137    0.026755   1.2012 0.229686
## 
## Robust Standard Errors:
##         Estimate  Std. Error  t value Pr(>|t|)
## mu     -0.000507    0.000427 -1.18819 0.234759
## mxreg1  1.474010    0.058356 25.25887 0.000000
## omega   0.000206    0.000030  6.83966 0.000000
## alpha1  0.159569    0.041027  3.88941 0.000100
## alpha2  0.101581    0.044116  2.30260 0.021301
## alpha3  0.093867    0.049449  1.89827 0.057661
## alpha4  0.046707    0.036976  1.26316 0.206531
## alpha5  0.032137    0.045863  0.70072 0.483477
## 
## LogLikelihood : 4421.732 
## 
## Information Criteria
## ------------------------------------
##                     
## Akaike       -5.1865
## Bayes        -5.1610
## Shibata      -5.1866
## Hannan-Quinn -5.1771
## 
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                     0.0304  0.8616
## Lag[2*(p+q)+(p+q)-1][2]    0.8366  0.5544
## Lag[4*(p+q)+(p+q)-1][5]    1.7423  0.6804
## d.o.f=0
## H0 : No serial correlation
## 
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
##                          statistic  p-value
## Lag[1]                      0.2492 0.617655
## Lag[2*(p+q)+(p+q)-1][14]   14.3695 0.033328
## Lag[4*(p+q)+(p+q)-1][24]   27.6988 0.001987
## d.o.f=5
## 
## Weighted ARCH LM Tests
## ------------------------------------
##              Statistic Shape Scale   P-Value
## ARCH Lag[6]     0.1361 0.500 2.000 0.7122309
## ARCH Lag[8]     0.1829 1.480 1.774 0.9751318
## ARCH Lag[10]   19.4717 2.424 1.650 0.0002247
## 
## Nyblom stability test
## ------------------------------------
## Joint Statistic:  3.0008
## Individual Statistics:              
## mu     0.07756
## mxreg1 0.20946
## omega  1.07625
## alpha1 0.21328
## alpha2 0.54889
## alpha3 0.16572
## alpha4 0.74542
## alpha5 1.18395
## 
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic:          1.89 2.11 2.59
## Individual Statistic:     0.35 0.47 0.75
## 
## Sign Bias Test
## ------------------------------------
##                    t-value   prob sig
## Sign Bias           0.7182 0.4727    
## Negative Sign Bias  0.1444 0.8852    
## Positive Sign Bias  0.4626 0.6437    
## Joint Effect        0.8960 0.8264    
## 
## 
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
##   group statistic p-value(g-1)
## 1    20     88.67    5.703e-11
## 2    30    102.65    3.664e-10
## 3    40    112.48    4.750e-09
## 4    50    127.26    7.014e-09
## 
## 
## Elapsed time : 0.5825009

INTERPRETATION:

THE ALPHA COEFFICIENTS FOR THE PREVIUOS 3 DAYS INDICATE THAT THERE IS A POSITIVE AND SIGNIFICANTLY RELATIONSHIP BETWEEN THE SQUARED ERRORS OF THE PREVIOUS 3 DAYS AND THE RETURN VARIANCE OF TODAY.

SINCE alpha5 IS ALSO POSITIVE AND SIGNFICANT THEN WE CAN SAY THAT THE SQUARED ERRORS OF 5 DAYS AGO ARE RELATED TO THE RETURN VARIANCE OF TODAY.

REGARDING THE BETA1 COEFFICIENT WE SEE THAT BETA1 = 1.4740103, WHICH IS VERY CLOSE TO THE BETA1 WE ESTIMATED USING LINEAR REGRESSION. THE DIFFERENCE IS THAT THE STANDARD ERROR OF BETA1 IN THE ARCH MODEL IS A LITTLE BIT BIGGER (FROM 0.045 TO 0.060), BUT THE CONCLUSIONS ABOUT THE RISKINESS OF THE STOCK IS THE SAME: THERE IS STATISTICAL EVIDENCE TO SAY THAT AFTER CONSIDERING THE EFFECT OF PREVIOUS SHOCKS ON RETURN VARIANCE, CEMEX IS SIGNIFICANTLY RISKIER THAN THE MARKET.

  1. Run a GARCH(1,1) market model:

I will start running a GARCH(1,1) model WITHOUT including the market return as explanatory variable (regressor), and then compare with the GARCH(1,1) market model:

Especgarch1=ugarchspec(variance.model= list(model= "sGARCH", 
  garchOrder= c(1, 1), # arch terms=1 and garch terms=1
  submodel= NULL,  variance.targeting= FALSE), 
  mean.model= list(armaOrder= c(0, 0), #With no AR nor MA terms for the mean model
  include.mean= TRUE, archm= FALSE, 
  archpow= 0, arfima= FALSE,  
  external.regressors= NULL, #With no explanatory variable
  archex= FALSE), 
  distribution.model= "norm", start.pars= list(), fixed.pars= list())

#Estimación del GARCH(1,1)

garch1<- ugarchfit(spec=Especgarch1, data=r$CEMEX)
garch1
## 
## *---------------------------------*
## *          GARCH Model Fit        *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## -----------------------------------
## GARCH Model  : sGARCH(1,1)
## Mean Model   : ARFIMA(0,0,0)
## Distribution : norm 
## 
## Optimal Parameters
## ------------------------------------
##         Estimate  Std. Error   t value Pr(>|t|)
## mu     -0.000180    0.000494  -0.36449 0.715495
## omega   0.000010    0.000002   4.69002 0.000003
## alpha1  0.067871    0.006397  10.61050 0.000000
## beta1   0.915010    0.008921 102.56949 0.000000
## 
## Robust Standard Errors:
##         Estimate  Std. Error  t value Pr(>|t|)
## mu     -0.000180    0.000499 -0.36031 0.718615
## omega   0.000010    0.000004  2.79029 0.005266
## alpha1  0.067871    0.009257  7.33165 0.000000
## beta1   0.915010    0.010869 84.18528 0.000000
## 
## LogLikelihood : 4070.661 
## 
## Information Criteria
## ------------------------------------
##                     
## Akaike       -4.7787
## Bayes        -4.7659
## Shibata      -4.7787
## Hannan-Quinn -4.7740
## 
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                       2.48  0.1153
## Lag[2*(p+q)+(p+q)-1][2]      2.51  0.1906
## Lag[4*(p+q)+(p+q)-1][5]      3.78  0.2829
## d.o.f=0
## H0 : No serial correlation
## 
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                      5.051 0.02461
## Lag[2*(p+q)+(p+q)-1][5]     5.810 0.09965
## Lag[4*(p+q)+(p+q)-1][9]     7.319 0.17386
## d.o.f=2
## 
## Weighted ARCH LM Tests
## ------------------------------------
##             Statistic Shape Scale P-Value
## ARCH Lag[3] 0.0002709 0.500 2.000  0.9869
## ARCH Lag[5] 1.4155766 1.440 1.667  0.6148
## ARCH Lag[7] 2.6768371 2.315 1.543  0.5765
## 
## Nyblom stability test
## ------------------------------------
## Joint Statistic:  9.652
## Individual Statistics:              
## mu     0.08873
## omega  0.89905
## alpha1 0.16904
## beta1  0.29997
## 
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic:          1.07 1.24 1.6
## Individual Statistic:     0.35 0.47 0.75
## 
## Sign Bias Test
## ------------------------------------
##                    t-value    prob sig
## Sign Bias           0.1328 0.89440    
## Negative Sign Bias  2.2105 0.02720  **
## Positive Sign Bias  1.0471 0.29519    
## Joint Effect        7.4339 0.05928   *
## 
## 
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
##   group statistic p-value(g-1)
## 1    20     60.12    3.711e-06
## 2    30     71.67    1.788e-05
## 3    40     85.50    2.501e-05
## 4    50    107.28    3.069e-06
## 
## 
## Elapsed time : 0.1358349

Now I run the same GARCH(1,1), but including the market return as a regressor in the model:

Especgarch2=ugarchspec(variance.model= list(model= "sGARCH", 
  garchOrder= c(1, 1), # GARCH(1,1) or arch terms=1 and garch term =1
  submodel= NULL,  variance.targeting= FALSE), 
  mean.model= list(armaOrder= c(0, 0), # no AR nor MA terms for the mean model
  include.mean= TRUE, archm= FALSE, 
  archpow= 0, arfima= FALSE,  archex= FALSE,
  external.regressors= r$MXX), # The explanatory variable for the mean model is
                               #  the market return
  distribution.model= "norm", start.pars= list(), fixed.pars= list())

#Estimación del GARCH(1,1)

garch2<- ugarchfit(spec=Especgarch2, data=r$CEMEX)
garch2
## 
## *---------------------------------*
## *          GARCH Model Fit        *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## -----------------------------------
## GARCH Model  : sGARCH(1,1)
## Mean Model   : ARFIMA(0,0,0)
## Distribution : norm 
## 
## Optimal Parameters
## ------------------------------------
##         Estimate  Std. Error  t value Pr(>|t|)
## mu     -0.000405    0.000401  -1.0108 0.312129
## mxreg1  1.462358    0.047625  30.7059 0.000000
## omega   0.000006    0.000002   3.6680 0.000244
## alpha1  0.050223    0.005775   8.6973 0.000000
## beta1   0.932371    0.007437 125.3743 0.000000
## 
## Robust Standard Errors:
##         Estimate  Std. Error  t value Pr(>|t|)
## mu     -0.000405    0.000387  -1.0466  0.29531
## mxreg1  1.462358    0.066028  22.1475  0.00000
## omega   0.000006    0.000004   1.5833  0.11335
## alpha1  0.050223    0.008796   5.7101  0.00000
## beta1   0.932371    0.011622  80.2239  0.00000
## 
## LogLikelihood : 4451.226 
## 
## Information Criteria
## ------------------------------------
##                     
## Akaike       -5.2247
## Bayes        -5.2087
## Shibata      -5.2247
## Hannan-Quinn -5.2188
## 
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                    0.01192  0.9131
## Lag[2*(p+q)+(p+q)-1][2]   0.38112  0.7522
## Lag[4*(p+q)+(p+q)-1][5]   1.58218  0.7197
## d.o.f=0
## H0 : No serial correlation
## 
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
##                         statistic  p-value
## Lag[1]                      7.084 0.007778
## Lag[2*(p+q)+(p+q)-1][5]     7.724 0.034497
## Lag[4*(p+q)+(p+q)-1][9]    10.210 0.045226
## d.o.f=2
## 
## Weighted ARCH LM Tests
## ------------------------------------
##             Statistic Shape Scale P-Value
## ARCH Lag[3]  0.007677 0.500 2.000  0.9302
## ARCH Lag[5]  1.734761 1.440 1.667  0.5328
## ARCH Lag[7]  3.402052 2.315 1.543  0.4410
## 
## Nyblom stability test
## ------------------------------------
## Joint Statistic:  5.6176
## Individual Statistics:              
## mu     0.06669
## mxreg1 0.34319
## omega  0.19351
## alpha1 0.19142
## beta1  0.29543
## 
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic:          1.28 1.47 1.88
## Individual Statistic:     0.35 0.47 0.75
## 
## Sign Bias Test
## ------------------------------------
##                    t-value    prob sig
## Sign Bias           0.8327 0.40512    
## Negative Sign Bias  1.6533 0.09846   *
## Positive Sign Bias  0.7255 0.46824    
## Joint Effect        3.4763 0.32384    
## 
## 
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
##   group statistic p-value(g-1)
## 1    20     68.74    1.488e-07
## 2    30     78.75    1.761e-06
## 3    40     96.21    9.727e-07
## 4    50     95.77    7.358e-05
## 
## 
## Elapsed time : 0.247927

WHEN I INCLUDED THE MARKET RETURN AS A REGRESSOR, THE COEFFICIENT OF GARCH(1) INCREASED AND THE COEFFICIENT OF ARCH(1) DECREASED.

With your words, INTERPRET the coefficients of each model.

INTERPRETATION:

NOTE THAT IN THIS GARCH(1,1) MARKET MODEL, IT IS CONFUSING THAT BETA1 COEFFICIENT REFERS TO THE GARCH(1) TERM, NOT TO THE MARKET! THE MARKET BETA COEFFICIENT IS DISPLAYED AS mxreg1, AND IT IS EQUAL TO 1.4623581. COMPARED TO THE MARKET REGRESSION MODEL, BETA1 IN THIS GARCH MODEL DECREASED A LITTLE BIT, BUT THE CONCLUSION IS THE SAME: WE HAVE STATISTICAL EVIDENCE TO SAY THAT CEMEX IS SIGNIFICANTLY RISKIER THAN THE MARKET SINCE ITS 95% C.I. IS BIGGER THAN 1.

AFTER CONSIDERING THE EFFECT OF THE MARKET RETURN, WE SEE STATISTICAL EVIDENCE OF CLUSTERING OF VOLATILITY SINCE THE GARCH COEFFICIENT IS GREATER THAN 0.9, AND IT IS VERY SIGNIFICANT. IN OTHER WORDS, ABOUT 93.2371385% OF THE 1-DAY AGO RETURN VARIANCE IS PASSED TO THE RETURN VARIANCE OF TODAY.

WE ALSO SEE THAT THE SQUARED ERROR OF YESTERDAY IS POSITIVELY AND SIGNIFICANTLY RELATED TO THE RETURN VARIANCE OF TODAY. ABOUT 5.0223041% OF THE 1-DAY AGO SQUARED ERROR IS PASSED TO THE RETURN VARIANCE OF TODAY.

WE SEE THAT WHEN WE INCLUDE A GARCH TERM, THE MAGNITUD OF THE ARCH COEFFICIENT OF 1 DAY AGO DIMINISHES A LOT. THIS IS EXPECTED SIINCE THE GARCH(1) TERM CAPTURES THE LONG-TERM EFFECT OF PREVIOUS RETURN VARIANCES ON THE RETURN VARIANCE OF TODAY, WHILE THE ARCH(1) TERM CAPTURES THE SHORT-TERM EFFECT OF THE 1-DAY AGO ERROR.

ONLY FOR DAILY RETURN DATA, WE CAN ESTIMATE A MARKET REGRESSION MODEL WITH ARCH EFFECTS USING AN ARCH(N) OR GARCH(1,1). THE GARCH(1,1) IS USUALLY SUPERIOR THAN THE ARCH(1) OR THE ARCH(5) MODEL SINCE THE GARCH(1,1) BETTER MODEL THE CLUSTERING OF VOLATILITY THAT IS VERY COMMON IN ANY STOCK DAILY RETURN DATA.

WHEN WE RUN A MARKET MODEL USING A GARCH(1,1), THE ESTIMATION OF THE MARKET BETA1 AND ITS STANDARD ERROR IS MORE RELIABLE COMPARED TO THE TRADITIONAL LINEAR OLS REGRESSION THAT DOES NOT MODEL VOLATILITY. THE ESTIMATION OF THE MARKET BETA WILL BE VERY SIMILAR, BUT THE STANDARD ERROR CAN CHANGE MORE SIGNIFICANTLY BETWEEN BOTH MODELS.