Comparing GARCH Forecasts with Parkinson High-Low Volatility
Summary
The document presents a forecasting question about why one-step-ahead volatility estimates from a GARCH(1,1) model for the S&P 500 appear consistently higher than volatility estimated with Parkinson’s high-low range formula. The author also reports that realized volatility calculated from five-minute intraday data is close to the high-low estimate, and that adding a small adjustment to the latter makes it visually resemble the GARCH forecast.
The included R workflow downloads adjusted, high, and low index prices, calculates log returns, fits a normal-innovation GARCH(1,1) model, and produces rolling one-step forecasts over an out-of-sample period. It then computes a high-low range measure for comparison. The document does not include a reply explaining the discrepancy, diagnostic results, or a formal test of forecast accuracy. It therefore frames a methodological question rather than establishing that either estimator is biased; differences in measurement, scaling, forecast targets, or implementation would need investigation.
Key ideas
- The document compares one-step GARCH(1,1) forecasts with a Parkinson high-low range estimate for S&P 500 volatility.
- The author reports that five-minute realized volatility is close to the high-low measure.
- The example fits a normal-distribution GARCH model and generates rolling out-of-sample forecasts.
- The document gives no explanation or statistical test establishing why the estimates differ.
- Comparisons require checking that the measures use compatible definitions, scaling, and forecast horizons.
Tags
Full text
# GARCH(1,1) one-step ahead volatility forecast biased, higher than Parkinson's HL volatility
# GARCH(1,1) one-step ahead volatility forecast biased, higher than Parkinson's HL volatility
I am trying to create one-step ahead forecasts for the S&P500 using a GARCH(1,1) model. I am using the rugarch package in R.
As you can see, the forecasted points are consistently higher than the volatility suggested by Parkinson's HL volatility formula. I have also checked Realized Volatility measures using 5-min intraday data, and I found that it is very close to the Parkinson HL.
I found that if I adjust the Parkinson's HL vol by 0.0025, it fits very close to the volatility suggested by the GARCH(1,1) model.
What could be the issue that makes the GARCH model volatility forecasts higher?
```
library(quantmod)
library(xts)
library(forecast)
library(rugarch)
library(fGarch)
library(tseries)
library(ggplot2)
###########################################################
###########################################################
df <- getSymbols("^GSPC",auto.assign = FALSE, from = "2004-12-31", to= "2019-03-31")
price = coredata(df$GSPC.Adjusted)
df$logret <- diff(log(df$GSPC.Adjusted))
logreturns = df$logret[-1,]
df2<-df[2:3585]
T <- nrow(logreturns)
T_train <- round(2/3*T)
T_test <- T - T_train
dates_out_of_sample <- tail(index(logreturns), T_test)
dates_all <- index(logreturns)
dates_in_sample <- dates_all[1:T_train]
model1=ugarchspec(
variance.model = list(model = "sGARCH", garchOrder = c(1, 1)),
mean.model = list(armaOrder = c(0, 0), include.mean = TRUE),
distribution.model = "norm")
garch1.fit <- ugarchfit(spec=model1,data=logreturns, out.sample = T_test)
garch1.forecast <- ugarchforecast(garch1.fit, n.ahead = 1, n.roll = T_test - 1 )
HLVol <- (log(df$GSPC.High[2:3585]) - log(df$GSPC.Low[2:3585]))/(4*log(2))
```Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)
This summary was written by Stratmill's research agent from the original; it is not a copy of the source.