Econometrics 2.1 (1)

Author

Vladyslava Bondarenko, Viktoriia Prokopoie, Hlib Usovych, BFE25

Robusta coffee prices

Selecting the data

library(readxl)
mydata <- read_excel("C:/Users/User/Desktop/CMO-Historical-Data-Monthly.xlsx", sheet = "Monthly Prices",  skip = 4, col_names = TRUE)
New names:
• `` -> `...1`
mydata <- mydata[-1, ]

head(mydata)
# A tibble: 6 × 72
  ...1    `Crude oil, average` `Crude oil, Brent` `Crude oil, Dubai`
  <chr>   <chr>                <chr>              <chr>             
1 1960M01 1.63000011444        1.63000011444      1.63000011444     
2 1960M02 1.63000011444        1.63000011444      1.63000011444     
3 1960M03 1.63000011444        1.63000011444      1.63000011444     
4 1960M04 1.63000011444        1.63000011444      1.63000011444     
5 1960M05 1.63000011444        1.63000011444      1.63000011444     
6 1960M06 1.63000011444        1.63000011444      1.63000011444     
# ℹ 68 more variables: `Crude oil, WTI` <chr>, `Coal, Australian` <chr>,
#   `Coal, South African **` <chr>, `Natural gas, US` <chr>,
#   `Natural gas, Europe` <chr>, `Liquefied natural gas, Japan` <chr>,
#   `Natural gas index` <chr>, Cocoa <chr>, `Coffee, Arabica` <chr>,
#   `Coffee, Robusta` <chr>, `Tea, avg 3 auctions` <chr>, `Tea, Colombo` <chr>,
#   `Tea, Kolkata` <chr>, `Tea, Mombasa` <chr>, `Coconut oil` <chr>,
#   Groundnuts <chr>, `Fish meal` <chr>, `Groundnut oil **` <chr>, …
library(dplyr)

Attaching package: 'dplyr'

The following objects are masked from 'package:stats':

    filter, lag

The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
robusta <- mydata %>% select(1, `Coffee, Robusta`)

Constructing time series

dates <- robusta$...1  
values <- as.numeric(robusta$`Coffee, Robusta`)  

start_year <- as.numeric(substr(dates[1], 1, 4))  
start_month <- as.numeric(substr(dates[1], 6, 7)) 


robusta_ts <- ts(values, start = c(start_year, start_month), frequency = 12)

plot.ts(robusta_ts, main = "Prices over time", xlab = "Time", ylab = "Price ($/unit)")

Cheking if data needs transforming

#  ADF test
library(tseries)
Registered S3 method overwritten by 'quantmod':
  method            from
  as.zoo.data.frame zoo 
library(forecast)
adf.test(robusta_ts) # Test for stationarity in the time series

    Augmented Dickey-Fuller Test

data:  robusta_ts
Dickey-Fuller = -2.8812, Lag order = 9, p-value = 0.2053
alternative hypothesis: stationary
plot(robusta_ts, main = "Raw Robusta Prices", ylab = "Price", xlab = "Time")

# Box-Cox transformation
lambda <- BoxCox.lambda(robusta_ts) 
robusta_transformed <- BoxCox(robusta_ts, lambda) 
plot(robusta_transformed, main = "Box-Cox Transformed Robusta Prices", ylab = "Transformed Price", xlab = "Time")

robusta_transformed_stl <- stl(robusta_transformed, s.window = "periodic")
plot(robusta_transformed_stl, main = "STL Decomposition of Transformed Data")

The p-value is greater than the common significance level of 0.05, so we fail to reject the null hypothesis. This suggests that the time series is not stationary. We shall apply differencing

robusta_diff <- diff(robusta_ts) 
adf.test(robusta_diff)      
Warning in adf.test(robusta_diff): p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  robusta_diff
Dickey-Fuller = -7.1375, Lag order = 9, p-value = 0.01
alternative hypothesis: stationary
plot(robusta_diff, main = "Differenced Time Series", ylab = "Differenced Prices")

Since the p-value (0.01) is less than the standard threshold (0.05), we reject the null hypothesis. This indicates that the differenced series is stationary.

Cheking ARIMA models

library(forecast)
model1 <- Arima(robusta_ts, order = c(1, 1, 1))
summary(model1)
Series: robusta_ts 
ARIMA(1,1,1) 

Coefficients:
         ar1     ma1
      0.3129  0.0185
s.e.  0.0984  0.1029

sigma^2 = 0.02291:  log likelihood = 366.36
AIC=-726.73   AICc=-726.7   BIC=-712.75

Training set error measures:
                      ME      RMSE        MAE        MPE     MAPE      MASE
Training set 0.004009412 0.1510789 0.08679787 0.07988763 4.261407 0.1948081
                      ACF1
Training set -0.0001176458
model2 <- Arima(robusta_ts, order = c(1, 1, 0))
summary(model2)
Series: robusta_ts 
ARIMA(1,1,0) 

Coefficients:
         ar1
      0.3294
s.e.  0.0338

sigma^2 = 0.02288:  log likelihood = 366.35
AIC=-728.69   AICc=-728.68   BIC=-719.38

Training set error measures:
                      ME      RMSE        MAE        MPE     MAPE      MASE
Training set 0.003988237 0.1510821 0.08681053 0.08035099 4.261834 0.1948366
                    ACF1
Training set 0.002028933
auto_model <- auto.arima(robusta_ts)
summary(auto_model)
Series: robusta_ts 
ARIMA(1,1,0) 

Coefficients:
         ar1
      0.3294
s.e.  0.0338

sigma^2 = 0.02288:  log likelihood = 366.35
AIC=-728.69   AICc=-728.68   BIC=-719.38

Training set error measures:
                      ME      RMSE        MAE        MPE     MAPE      MASE
Training set 0.003988237 0.1510821 0.08681053 0.08035099 4.261834 0.1948366
                    ACF1
Training set 0.002028933
cat("AIC for ARIMA(1,1,1):", AIC(model1), "\n")
AIC for ARIMA(1,1,1): -726.7262 
cat("AIC for ARIMA(1,1,0):", AIC(model2), "\n")
AIC for ARIMA(1,1,0): -728.6937 
cat("AIC for Auto ARIMA:", AIC(auto_model), "\n")
AIC for Auto ARIMA: -728.6937 

ARIMA(1,1,0) is the best model based on the lowest AIC value (−728.6937)

Residual Diagnostics for ARIMA(1,1,0)

checkresiduals(model2)


    Ljung-Box test

data:  Residuals from ARIMA(1,1,0)
Q* = 63.636, df = 23, p-value = 1.12e-05

Model df: 1.   Total lags used: 24

The residuals fluctuate around zero with no visible trend, which is a good sign. Most of the autocorrelations are within the confidence bounds. A very small p-value indicates that the null hypothesis (residuals are white noise) is rejected.

Forecasting with ARIMA(1,1,0)

forecast_values <- forecast(model2, h = 12) 
plot(forecast_values, main = "Forecast for Robusta Coffee Prices")

forecast_table <- as.data.frame(forecast_values)
print(forecast_table)
         Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
Jan 2025       5.296119 5.102251 5.489987 4.999623 5.592615
Feb 2025       5.321523 4.999019 5.644027 4.828296 5.814750
Mar 2025       5.329891 4.903608 5.756174 4.677947 5.981835
Apr 2025       5.332647 4.819483 5.845812 4.547830 6.117464
May 2025       5.333555 4.745111 5.922000 4.433607 6.233504
Jun 2025       5.333854 4.678393 5.989316 4.331412 6.336296
Jul 2025       5.333953 4.617618 6.050288 4.238413 6.429493
Aug 2025       5.333985 4.561529 6.106442 4.152615 6.515356
Sep 2025       5.333996 4.509219 6.158774 4.072608 6.595384
Oct 2025       5.334000 4.460025 6.207974 3.997371 6.670628
Nov 2025       5.334001 4.413454 6.254548 3.926145 6.741856
Dec 2025       5.334001 4.369126 6.298876 3.858353 6.809650

The ARIMA(1,1,0) model provides a reasonable and stable forecast for Robusta coffee prices. The predictions can be trusted as long as no unforeseen external events (e.g., market shocks, policy changes) occur.

MP4

Logarithmic returns

log_returns <- 100 * diff(log(robusta_ts))
plot.ts(log_returns, main = "Logarithmic Returns of Robusta Coffee Prices", 
        xlab = "Time", ylab = "Log Returns")

adf.test(log_returns)
Warning in adf.test(log_returns): p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  log_returns
Dickey-Fuller = -6.8838, Lag order = 9, p-value = 0.01
alternative hypothesis: stationary

With this small p-value, logarithmic returns are stationary, so data is suitable for the future modelling.

Experiment with different ARMA models

arma_models <- list()

for (p in 0:3) {
  for (q in 0:3) {
    if (p == 0 & q == 0) next
    model <- Arima(robusta_ts, order = c(p, 1, q))
    arma_models[[paste0("ARMA(", p, ",", q, ")")]] <- model
  }
}

model_comparisons <- data.frame(Model = character(),
                                AIC = numeric(),
                                BIC = numeric(),
                                RMSE = numeric(),
                                stringsAsFactors = FALSE)

for (name in names(arma_models)) {
  model <- arma_models[[name]]
  model_comparisons <- rbind(model_comparisons,
                             data.frame(Model = name,
                                        AIC = AIC(model),
                                        BIC = BIC(model),
                                        RMSE = sqrt(mean(residuals(model)^2))))
}

model_comparisons <- model_comparisons[order(model_comparisons$AIC), ]
print(model_comparisons)
       Model       AIC       BIC      RMSE
11 ARMA(2,3) -730.7549 -702.8068 0.1500828
4  ARMA(1,0) -728.6937 -719.3777 0.1510821
8  ARMA(2,0) -726.7303 -712.7563 0.1510785
5  ARMA(1,1) -726.7262 -712.7522 0.1510789
2  ARMA(0,2) -726.2662 -712.2922 0.1511237
3  ARMA(0,3) -725.4634 -706.8313 0.1510071
12 ARMA(3,0) -725.0858 -706.4537 0.1510439
6  ARMA(1,2) -724.9330 -706.3009 0.1510588
9  ARMA(2,1) -724.7088 -706.0768 0.1510806
7  ARMA(1,3) -724.4378 -701.1477 0.1509121
10 ARMA(2,2) -723.9973 -700.7072 0.1509551
13 ARMA(3,1) -723.8613 -700.5712 0.1509684
14 ARMA(3,2) -721.2222 -693.2741 0.1510306
1  ARMA(0,1) -720.8738 -711.5577 0.1518440
15 ARMA(3,3) -720.7458 -688.1397 0.1508820
best_model_name <- model_comparisons$Model[1]
best_model <- arma_models[[best_model_name]]


checkresiduals(best_model)


    Ljung-Box test

data:  Residuals from ARIMA(2,1,3)
Q* = 55.946, df = 19, p-value = 1.663e-05

Model df: 5.   Total lags used: 24
best_model_name2 <- model_comparisons$Model[2]
best_model2 <- arma_models[[best_model_name2]]


checkresiduals(best_model2)


    Ljung-Box test

data:  Residuals from ARIMA(1,1,0)
Q* = 63.636, df = 23, p-value = 1.12e-05

Model df: 1.   Total lags used: 24
forecast_values_best <- forecast(best_model, h = 12)
plot(forecast_values_best, main = paste("Forecast with", best_model_name))

forecast_values_best2 <- forecast(best_model2, h = 12)
plot(forecast_values_best2, main = paste("Forecast with", best_model_name2))

The first two selected models, ARMA(2,3) and ARMA(1,0), are the best based on AIC, BIC, and RMSE. ARMA(2,3) has the lowest AIC and BIC, meaning it offers a good balance between fit and complexity. Its RMSE is also the lowest, indicating it fits the data well. ARMA(1,0) is simpler but still performs well with a close AIC and BIC. Its RMSE is slightly higher, but still competitive. These models are the best because they provide the best fit without overfitting. Previously we identified ARMA (1, 0) as the best, so we continue working with it.

library(FinTS)
Loading required package: zoo

Attaching package: 'zoo'
The following objects are masked from 'package:base':

    as.Date, as.Date.numeric

Attaching package: 'FinTS'
The following object is masked from 'package:forecast':

    Acf
residuals_best2 <- residuals(best_model2)
arch_test_best2 <- ArchTest(residuals_best2, lags = 10)
print(arch_test_best2)

    ARCH LM-test; Null hypothesis: no ARCH effects

data:  residuals_best2
Chi-squared = 160.78, df = 10, p-value < 2.2e-16

Low p-value suggests the presence of ARCH effects, meaning volatility clustering exists, and we need a GARCH model.

library(rugarch)
Loading required package: parallel

Attaching package: 'rugarch'
The following object is masked from 'package:stats':

    sigma
garch_spec <- ugarchspec(
  variance.model = list(model = "sGARCH", garchOrder = c(1,1)),
  mean.model = list(armaOrder = c(1,0), include.mean = TRUE),
  distribution.model = "norm" 
)

garch_fit <- ugarchfit(spec = garch_spec, data = residuals_best2)

print(garch_fit)

*---------------------------------*
*          GARCH Model Fit        *
*---------------------------------*

Conditional Variance Dynamics   
-----------------------------------
GARCH Model : sGARCH(1,1)
Mean Model  : ARFIMA(1,0,0)
Distribution    : norm 

Optimal Parameters
------------------------------------
        Estimate  Std. Error  t value Pr(>|t|)
mu      0.001420    0.001654  0.85856  0.39058
ar1    -0.032889    0.042053 -0.78209  0.43416
omega   0.000081    0.000024  3.41423  0.00064
alpha1  0.209826    0.019160 10.95133  0.00000
beta1   0.789174    0.016264 48.52285  0.00000

Robust Standard Errors:
        Estimate  Std. Error  t value Pr(>|t|)
mu      0.001420    0.001831  0.77557  0.43800
ar1    -0.032889    0.051753 -0.63550  0.52510
omega   0.000081    0.000058  1.41645  0.15665
alpha1  0.209826    0.039569  5.30273  0.00000
beta1   0.789174    0.034949 22.58100  0.00000

LogLikelihood : 758.1834 

Information Criteria
------------------------------------
                    
Akaike       -1.9312
Bayes        -1.9014
Shibata      -1.9313
Hannan-Quinn -1.9198

Weighted Ljung-Box Test on Standardized Residuals
------------------------------------
                        statistic p-value
Lag[1]                      1.570  0.2102
Lag[2*(p+q)+(p+q)-1][2]     1.677  0.3455
Lag[4*(p+q)+(p+q)-1][5]     4.111  0.2083
d.o.f=1
H0 : No serial correlation

Weighted Ljung-Box Test on Standardized Squared Residuals
------------------------------------
                        statistic p-value
Lag[1]                     0.6194  0.4313
Lag[2*(p+q)+(p+q)-1][5]    4.1773  0.2328
Lag[4*(p+q)+(p+q)-1][9]    6.7087  0.2248
d.o.f=2

Weighted ARCH LM Tests
------------------------------------
            Statistic Shape Scale P-Value
ARCH Lag[3]     1.321 0.500 2.000  0.2505
ARCH Lag[5]     1.857 1.440 1.667  0.5038
ARCH Lag[7]     2.327 2.315 1.543  0.6484

Nyblom stability test
------------------------------------
Joint Statistic:  4.4099
Individual Statistics:              
mu     0.08972
ar1    0.24006
omega  0.38391
alpha1 2.08966
beta1  0.86900

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.002962 0.9976    
Negative Sign Bias 1.083596 0.2789    
Positive Sign Bias 1.344802 0.1791    
Joint Effect       4.417329 0.2198    


Adjusted Pearson Goodness-of-Fit Test:
------------------------------------
  group statistic p-value(g-1)
1    20     54.97    2.345e-05
2    30     66.77    8.279e-05
3    40     92.92    2.702e-06
4    50    105.51    5.091e-06


Elapsed time : 0.168014 

Other models

# GARCH(2,1)
garch_spec_21 <- ugarchspec(
  variance.model = list(model = "sGARCH", garchOrder = c(2,1)),
  mean.model = list(armaOrder = c(1,0), include.mean = TRUE),
  distribution.model = "norm"
)

garch_fit_21 <- ugarchfit(spec = garch_spec_21, data = residuals_best2)
print(garch_fit_21)

*---------------------------------*
*          GARCH Model Fit        *
*---------------------------------*

Conditional Variance Dynamics   
-----------------------------------
GARCH Model : sGARCH(2,1)
Mean Model  : ARFIMA(1,0,0)
Distribution    : norm 

Optimal Parameters
------------------------------------
        Estimate  Std. Error   t value Pr(>|t|)
mu      0.001456    0.001671  0.871604 0.383425
ar1    -0.032967    0.042547 -0.774846 0.438431
omega   0.000083    0.000025  3.304164 0.000953
alpha1  0.209793    0.040201  5.218595 0.000000
alpha2  0.000000    0.044973  0.000003 0.999998
beta1   0.789207    0.019400 40.680207 0.000000

Robust Standard Errors:
        Estimate  Std. Error   t value Pr(>|t|)
mu      0.001456    0.001827  0.797180 0.425346
ar1    -0.032967    0.050911 -0.647548 0.517277
omega   0.000083    0.000058  1.434615 0.151397
alpha1  0.209793    0.069809  3.005224 0.002654
alpha2  0.000000    0.069250  0.000002 0.999999
beta1   0.789207    0.040410 19.529997 0.000000

LogLikelihood : 756.2612 

Information Criteria
------------------------------------
                    
Akaike       -1.9237
Bayes        -1.8879
Shibata      -1.9239
Hannan-Quinn -1.9100

Weighted Ljung-Box Test on Standardized Residuals
------------------------------------
                        statistic p-value
Lag[1]                      1.577  0.2092
Lag[2*(p+q)+(p+q)-1][2]     1.685  0.3419
Lag[4*(p+q)+(p+q)-1][5]     4.116  0.2075
d.o.f=1
H0 : No serial correlation

Weighted Ljung-Box Test on Standardized Squared Residuals
------------------------------------
                         statistic p-value
Lag[1]                      0.6282 0.42800
Lag[2*(p+q)+(p+q)-1][8]     5.1644 0.33094
Lag[4*(p+q)+(p+q)-1][14]   12.4535 0.07667
d.o.f=3

Weighted ARCH LM Tests
------------------------------------
            Statistic Shape Scale P-Value
ARCH Lag[4]    0.6446 0.500 2.000  0.4221
ARCH Lag[6]    1.1197 1.461 1.711  0.7137
ARCH Lag[8]    1.5253 2.368 1.583  0.8349

Nyblom stability test
------------------------------------
Joint Statistic:  4.5297
Individual Statistics:              
mu     0.08833
ar1    0.24112
omega  0.39119
alpha1 2.05622
alpha2 1.51519
beta1  0.85458

Asymptotic Critical Values (10% 5% 1%)
Joint Statistic:         1.49 1.68 2.12
Individual Statistic:    0.35 0.47 0.75

Sign Bias Test
------------------------------------
                    t-value   prob sig
Sign Bias          0.000943 0.9992    
Negative Sign Bias 1.073796 0.2832    
Positive Sign Bias 1.359889 0.1743    
Joint Effect       4.449057 0.2169    


Adjusted Pearson Goodness-of-Fit Test:
------------------------------------
  group statistic p-value(g-1)
1    20     55.13    2.222e-05
2    30     65.77    1.123e-04
3    40     96.21    9.754e-07
4    50    108.46    2.184e-06


Elapsed time : 0.1450341 
# GARCH(2,2)
garch_spec_22 <- ugarchspec(
  variance.model = list(model = "sGARCH", garchOrder = c(2,2)),
  mean.model = list(armaOrder = c(1,0), include.mean = TRUE),
  distribution.model = "norm"
)

garch_fit_22 <- ugarchfit(spec = garch_spec_22, data = residuals_best2)
print(garch_fit_22)

*---------------------------------*
*          GARCH Model Fit        *
*---------------------------------*

Conditional Variance Dynamics   
-----------------------------------
GARCH Model : sGARCH(2,2)
Mean Model  : ARFIMA(1,0,0)
Distribution    : norm 

Optimal Parameters
------------------------------------
        Estimate  Std. Error   t value Pr(>|t|)
mu      0.001382    0.001648  0.838552 0.401721
ar1    -0.040936    0.043180 -0.948029 0.343115
omega   0.000096    0.000020  4.928678 0.000001
alpha1  0.246094    0.011386 21.613212 0.000000
alpha2  0.000001    0.070050  0.000019 0.999985
beta1   0.581220    0.225078  2.582302 0.009814
beta2   0.171684    0.170698  1.005779 0.314522

Robust Standard Errors:
        Estimate  Std. Error   t value Pr(>|t|)
mu      0.001382    0.001756  0.787008 0.431277
ar1    -0.040936    0.052553 -0.778939 0.436015
omega   0.000096    0.000079  1.224942 0.220597
alpha1  0.246094    0.065767  3.741941 0.000183
alpha2  0.000001    0.164901  0.000008 0.999994
beta1   0.581220    0.541456  1.073439 0.283074
beta2   0.171684    0.421343  0.407469 0.683664

LogLikelihood : 757.461 

Information Criteria
------------------------------------
                    
Akaike       -1.9243
Bayes        -1.8824
Shibata      -1.9244
Hannan-Quinn -1.9082

Weighted Ljung-Box Test on Standardized Residuals
------------------------------------
                        statistic p-value
Lag[1]                      1.945  0.1631
Lag[2*(p+q)+(p+q)-1][2]     2.065  0.1921
Lag[4*(p+q)+(p+q)-1][5]     4.462  0.1610
d.o.f=1
H0 : No serial correlation

Weighted Ljung-Box Test on Standardized Squared Residuals
------------------------------------
                         statistic p-value
Lag[1]                      0.1951 0.65873
Lag[2*(p+q)+(p+q)-1][11]    9.3147 0.12717
Lag[4*(p+q)+(p+q)-1][19]   15.7244 0.07465
d.o.f=4

Weighted ARCH LM Tests
------------------------------------
            Statistic Shape Scale P-Value
ARCH Lag[5]   0.02174 0.500 2.000 0.88277
ARCH Lag[7]   0.62597 1.473 1.746 0.86268
ARCH Lag[9]   7.55650 2.402 1.619 0.08671

Nyblom stability test
------------------------------------
Joint Statistic:  5.8999
Individual Statistics:              
mu     0.08165
ar1    0.22891
omega  0.39338
alpha1 2.02622
alpha2 1.57959
beta1  0.83745
beta2  0.76061

Asymptotic Critical Values (10% 5% 1%)
Joint Statistic:         1.69 1.9 2.35
Individual Statistic:    0.35 0.47 0.75

Sign Bias Test
------------------------------------
                   t-value   prob sig
Sign Bias            0.201 0.8408    
Negative Sign Bias   1.229 0.2196    
Positive Sign Bias   1.239 0.2156    
Joint Effect         3.995 0.2620    


Adjusted Pearson Goodness-of-Fit Test:
------------------------------------
  group statistic p-value(g-1)
1    20     59.18    5.214e-06
2    30     78.15    2.151e-06
3    40     93.95    1.970e-06
4    50    115.38    2.817e-07


Elapsed time : 0.3812141 

While all models have similar performance, the GARCH(1,1) model stands out with the highest LogLikelihood and the lowest AIC. Thus, based on these criteria, the GARCH(1,1) model is the best fit for the data.

Forecasting

garch_forecast_11 <- ugarchforecast(garch_fit, n.ahead = length(residuals_best2))

forecast_volatility <- sigma(garch_forecast_11)

par(mfrow = c(1, 2))

plot(residuals_best2^2, type = "l", col = "blue", main = "Squared Residuals", ylab = "Squared Residuals", xlab = "Time")

plot(forecast_volatility, type = "l", col = "red", main = "Forecasted Volatility (GARCH(1,1))", ylab = "Volatility", xlab = "Time")

legend("topright", legend = c("Squared Residuals", "Forecasted Volatility"), col = c("blue", "red"), lty = 1)

The left plot shows squared residuals, which highlight volatility clustering. Spikes in volatility, especially around the late 1970s and early 2000s, indicate significant financial events. Calm periods, such as the 1960s and early 1990s, show low squared residuals, suggesting stable volatility.

The right plot shows forecasted volatility using the GARCH(1,1) model. This forecast suggests that volatility will gradually decrease and stabilize, following an exponential decay. The high starting volatility reflects past high residuals, but the GARCH model predicts a return to lower levels unless new shocks occur.