0
$\begingroup$


Hello.
I have been trying to wrap my head around GARCH (via rugarch package) for the past week and been trying to mimic the numbers as shown at vlab nyc's website.
I have not confirmed where they get their price data from but I have used several data sources.
The code in this question will be using yahoo via BatchGetSymbols.
I reached out about some of their parameters, which I've specified in the garchMod object.
I have tried to replicate their forecast on an array of tickers, most are close, few are far off, and all are never exact.
I understand this can be due to a variety of factors, including my data source. However, this example I will be posting seems to be extremely off and I can't figure out why.
As mentioned, I have been trying to wrap my head around GARCH in general the past week and went through many resources.
Where I struggle is usually transferring that knowledge to the rugarch package and it's specifications.

Here are the numbers I will be trying to replicate, or get close to, from nyu's website. This data is on the ticker: "AUR:US". https://i.gyazo.com/6c8531992e5ac617bc9848424443c67e.png
The estimation period ("2021-05-10" to "2022-03-11") is the range of the price data being used.

Here are their predictions via eGARCH.
https://i.gyazo.com/1e63085ea114ce5bf8efed5468ff5dd9.png


Here are some of the variables I was able to confirm: eGARCH (1, 1), ARMA(0 ,0), Normal distribution.

And here is further information about their parameters & calculations:
https://vlab.stern.nyu.edu/help/volatility_summary
https://vlab.stern.nyu.edu/docs/volatility/EGARCH

In this code snippet I will be trying to get close to their 1-Month eGARCH forecast using the rugarch package with data from BatchGetSymbols:

library(BatchGetSymbols)
library(dplyr)
library(rugarch)

ticker <- "AUR"
from <- "2021-05-10"
to <- "2022-03-11"

ohlc <- BatchGetSymbols(
  tickers = ticker,
  first.date = from,
  last.date = to,
  do.cache = FALSE,
  be.quiet = TRUE,
  thresh.bad.data = 0.05)[[2]]

ret <- ohlc %>%
  arrange(ref.date) %>%
  pull(ret.adjusted.prices) %>%
  na.omit()

garchMod <- ugarchspec(
  variance.model = list(
    model = "eGARCH",
    garchOrder = c(1, 1)),
  mean.model = list(armaOrder = c(0, 0)),
  distribution.model = "norm")

fit <- ugarchfit(spec = garchMod, data = ret, solver = "hybrid")
forecast <- ugarchforecast(fit, data = ret, n.ahead = 22)
egarch30d <- mean(forecast@forecast$sigmaFor) * sqrt(252)

If we look at our garch results via the "fit" object, I do not seem to be getting close to their parameters.

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

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

Optimal Parameters
------------------------------------
        Estimate  Std. Error  t value Pr(>|t|)
mu       0.00081    0.000142   5.7018 0.000000
omega   -0.12419    0.091952  -1.3506 0.176822
alpha1   0.35031    0.092040   3.8061 0.000141
beta1    0.96376    0.010346  93.1559 0.000000
gamma1   0.99177    0.099174  10.0003 0.000000

Robust Standard Errors:
        Estimate  Std. Error  t value Pr(>|t|)
mu       0.00081    0.000207   3.9082 0.000093
omega   -0.12419    0.114368  -1.0859 0.277529
alpha1   0.35031    0.219501   1.5960 0.110499
beta1    0.96376    0.017039  56.5606 0.000000
gamma1   0.99177    0.221845   4.4705 0.000008

LogLikelihood : 602.5163 

Information Criteria
------------------------------------
                    
Akaike       -5.6906
Bayes        -5.6109
Shibata      -5.6917
Hannan-Quinn -5.6584

Weighted Ljung-Box Test on Standardized Residuals
------------------------------------
                        statistic p-value
Lag[1]                    0.01181  0.9134
Lag[2*(p+q)+(p+q)-1][2]   0.07626  0.9366
Lag[4*(p+q)+(p+q)-1][5]   0.44580  0.9657
d.o.f=0
H0 : No serial correlation

Weighted Ljung-Box Test on Standardized Squared Residuals
------------------------------------
                        statistic p-value
Lag[1]                     0.3936  0.5304
Lag[2*(p+q)+(p+q)-1][5]    2.8870  0.4281
Lag[4*(p+q)+(p+q)-1][9]    4.3905  0.5240
d.o.f=2

Weighted ARCH LM Tests
------------------------------------
            Statistic Shape Scale P-Value
ARCH Lag[3]     1.749 0.500 2.000  0.1860
ARCH Lag[5]     3.414 1.440 1.667  0.2352
ARCH Lag[7]     4.016 2.315 1.543  0.3443

Nyblom stability test
------------------------------------
Joint Statistic:  0.9021
Individual Statistics:              
mu     0.09599
omega  0.11428
alpha1 0.05447
beta1  0.07967
gamma1 0.14576

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
------------------------------------


Adjusted Pearson Goodness-of-Fit Test:
------------------------------------
  group statistic p-value(g-1)
1    20     89.81    3.585e-11
2    30    112.57    8.678e-12
3    40    124.48    7.358e-11
4    50    143.81    2.974e-11

> Blockquote


My 1-Month forecast (egarch30d) is showing 1.28, whereas nyu has 0.5532.
Any help as to why the numbers are this different is appreciated!

$\endgroup$

1 Answer 1

1
$\begingroup$

The first issue you're going to have here is that the model is a very, very bad fit to the data. Fitting GARCH parameters can be tricky and if the model is especially wrong, different implementations may lead to different (bad) parameter estimates.

You can see why the model doesn't do a good job by plotting the data:

AUR returns

The history is quite short, and you'll notice that the variance of the returns is very small until November 2021, when it suddenly jumps to a much higher level, which is essentially constant after that point. It looks more like two constant-variance processes with a single structural break. This is not really the type of sudden, extreme and permanent changes in volatility where GARCH works well. You can also see that the model does not fit well at all from the extremely small goodness-of-fit p-values (at the very end of your printout).

Incidentally, this is because the data you're looking at is effectively an entirely different company before November 2021: you're looking at a SPAC called Reinvent Technology Partners Y which merged with Aurora at that point in time.

Based on this, you might consider simply using only the post-merger data. If your only goal is to replicate this source, I don't know what they actually did, but it's not immediately obvious to me that it's worth replicating.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.