Estimating Seasonal ARIMA-GARCH Models for Electricity Prices
Summary
The document addresses how to estimate and forecast a seasonal ARIMA model with GARCH errors for daily electricity prices, including a holiday indicator in the mean equation. The question arises because the R base ARIMA function supports seasonal terms, while the GARCH packages considered by the asker accept only ordinary ARMA specifications for the mean.
One answer points to MATLAB’s seasonal ARIMA support and its ability to combine that mean model with a GARCH variance specification. Another writes out the seasonal lag structure, describes fitting with the holiday variable and presample observations, and illustrates forecasting. A further suggestion approximates the seasonal structure in rugarch by using an expanded ordinary ARMA model and fixing many coefficients to zero. These are software-specific approaches rather than a comparison of estimation quality; the document supplies no fit diagnostics or forecast evaluation, and the expanded ARMA workaround may be cumbersome.
Key ideas
- Seasonal ARIMA terms can be represented with seasonal autoregressive and moving-average lags in a mean equation.
- A GARCH variance specification can be combined with a seasonal ARIMA mean model in the described MATLAB workflow.
- The MATLAB example uses a holiday regressor and presample response observations when estimating the model.
- An alternative rugarch suggestion represents the seasonal pattern with an ordinary ARMA order and constrains selected coefficients to zero.
- The responses offer implementation paths but provide no empirical comparison or forecast accuracy evidence.
Tags
Full text
# Is there any way to easily estimate and forecast seasonal ARIMA-GARCH model in any software?
# Is there any way to easily estimate and forecast seasonal ARIMA-GARCH model in any software?
I use R to estimate a seasonal ARIMA(8,0,0)(5,0,1)[7] model for the seasonal differences of logs of daily electricity prices:
```
daily.fit <- arima(sd_l_daily_adj$Price,
order=c(8,0,0),
seasonal=list(order=c(5,0,1), period=7),
xreg = sd_l_daily_adj$Holiday,
include.mean=FALSE)
```
Problem is that from all the packages I've tried, only the R's base arima function allows for the seasonal specification. Packages with GARCH estimation functions such as fGarch and rugarch only allow for ordinary ARMA(p, q) specification for the mean equation.
Any suggestions for any kind of software are welcome,
Thanks
## Answer by Quantopik (score 4, accepted)
https://quant.stackexchange.com/a/15929
You can use Matlab too, that, in my humble opinion, is simpler than R from a syntax point of view.
The model you need for is run by the Matlab function `arima` that can be used with `seasonality` option to do what you have to do.
Here you can find an example and a brief explanation of the model.
Type ctrl + F and search for:
"Specify a seasonal ARIMA model"
You will find how to do that explained in the example.
If you want to combine ARIMA with GARCH you can also do that, as described in the MATLAB help.
## Answer by stofer (score 2)
https://quant.stackexchange.com/a/15946
The mean equation specification for ARIMAX(8,0,0)(5,0,1)[7] (as in the R code above): $$ (1 - \phi_1L^1 - \ldots - \phi_8L^8)(1-\Phi_1L^7 - \Phi_2L^{14} - \ldots - \Phi_5L^{35})y_t = \beta x_t + (1 + \Theta_1L^7)\varepsilon_t $$ where $x_t$ is the holiday dummy variable.
Equivalent ARIMA fit in Matlab (+ GARCH and forecasting):
```
% specify seasonal ARIMA(8,0,0)(5,0,1)[7]-GARCH(1,1) model
Md2 = arima('Constant', 0, 'D', 0, 'ARLags', [1,2,3,4,5,6,8],'SARLags', [7,14,21,28,35], 'SMALags', 7, 'Variance', garch(1,1))
% estimate (use Holiday as exogenous variable)
[fitT_garch,~,LogLT_garch] = estimate(Md2, Price(44:end), 'X', Holiday, 'Y0', Price(1:43))
% forecast 30 periods ahead
V = forecast(fitT_garch, 30, 'Y0', Price, 'X0', Holiday, 'XF', zeros(30, 1))
```
Matlab will need the first 43 observations as a presample response data.
## Answer by Kian (score 0)
https://quant.stackexchange.com/a/15975
Use the R package fgarch. Hope this is helpful to you.
## Answer by Manuel (score 0)
https://quant.stackexchange.com/a/17134
You can try:
```
daily.fit=ugarchspec(variance.model = list(model = "sGARCH", garchOrder = c(1, 1)),
mean.model = list(armaOrder = c(35, 7), include.mean = T, arfima=F),
fixed.pars=list(ar9=0,ar10=0,...,ar13=0,ar15=0,...,ar20=0,ar22=0,...,ar27=0,ar29=0,...,ar34=0,ma1=0,...,ma6=0))
```
from rugarch package.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.