GARCH Forecasting Model

GARCH Forecasting Model

This is a GARCH forecasting model problem which needs to be completed in R.

The Westinghouse file is attached.  The question is:

Using the stock data, build GARCH models either using the fGARCH or other packages and compare. 

Solution 

#read the file

library(readr)

WAB <- read_csv(“~/Desktop/Krista 26th/WAB.csv”) #change as per the location i your PC

x <-WAB

#code to transform date into the variable TIME , taking 15th Sep 2015  as TIME=0.

DF <- data.frame(Date = x$Date)

DF$Date<- as.Date(x$Date, “%m/%d/%Y”)

Diff <- function(x, start) as.numeric(x – as.Date(cut(start, “year”)))

y<-transform(DF, NumDays = Diff(Date, Date), TotalDays = Diff(Date, Date[1]))

z=y$TotalDays-257

x$Date=z

#filling missing values . There are lots of dates for which Adj close price isn’t available

a <- c(rep(“NA”,731))

for(i in 0:730) for ( j in 1:505) {

if (x$Date[j]==i) a[i+1]=x$`Adj Close`[j]

} #this a represents the ts of CLOSE with missing values.

TIME=c(0:730)

df<-data.frame(TIME,a)

library(zoo)

ts<-na.approx(df)[,2] #data for all dates are filled by interpolatrion

# ts ready for working on

#fitting GARCH model- default GARCH(1,1)

library(fGarch)

gfit.fg<- garchFit(data=ts) #this is the GARCH(1,1) model

coef(gfit.fg) #gives the coefficients of the GARCH model

volatility(gfit.fg) #Extracts conditional volatility from a fitted ???fGARCH??? object

formula(gfit.fg) #Extracts formula expression from a fitted ???fGARCH??? object.

summary(gfit.fg)

z <-predict(gfit.fg,30)

z$standardDeviation #gives predicted volatility(standard deviation) for next 30 days

#find RMSE of this GARCH(1,1) MODEL

res<- residuals(gfit.fg) #residuals

RSS <- sum(res^2) #residual sum of squares

MSE <- RSS/length(ts) #mean sqaure error

rmsegarch11 <- sqrt(MSE)#root mean sqaure error RMSE

print(rmsegarch11)#prints RMSE for GARCH(1,1)

#GARCH(2,2)

fit2 <-garchFit(~garch(2,2),ts)

summary(fit2)

res<- residuals(fit2) #residuals

RSS <- sum(res^2) #residual sum of squares

MSE <- RSS/length(ts) #mean sqaure error

rmsegarch22 <- sqrt(MSE)#root mean sqaure error RMSE

print(rmsegarch22)#prints RMSE for GARCH(2,2)

# comparison with prev models such as ARIMA , ETS etc.

#auto.arima

library(forecast)

arima<- auto.arima(ts)

accuracy(arima)#look at the RMSE VALUE for comparison purpose

#ets model

ETS <-ets(ts)

accuracy(ETS)#look at the RMSE VALUE for comparison purpose

#building my own ARIMA ,i.e. to choose p , d , q . Call it myarima

y=ts

azfinal.aic<- Inf #initiation with large value

azfinal.order<- c(0,0,0)

for (p in 0:3) for (d in 0:1) for (q in 0:3) {

azcurrent.aic<- AIC(Arima(y, order=c(p, d, q)))

if (azcurrent.aic<azfinal.aic) {

azfinal.aic<- azcurrent.aic

azfinal.order<- c(p, d, q)

azfinal.arima<- Arima(y, order=azfinal.order)

}

} #we are taking  d=0,1, p=0,1,2,3 , q=0,1,2,3 and choosing which combination of p,d,qminimises the AIC

myarima<-azfinal.arima

accuracy(myarima)#look at the RMSE VALUE for comparison purpose

#NOTE:

# arima and myarima are basically the same model , i.e. ARIMA(1,1,0).

#This is because the function auto.arima chooses the order (p,d,q) by AIC minimzation only,

#which was done manually while building myarima

#ANSWER:

#Lower the RMSE , better is the model . GARCH models have extremely high RMSE compared to ETS & ARIMA models here.

#So,by comparing RMSE , our order is , RMSE_ARIMA < RMSE_ETS << RMSE_GARCH(2,2) < RMSE_GARCH(1,1)

# So , order of performance : ARIMA > ETS > GARCH(2,2) >GARCH(1,1)

#So,for this dataset , ETS & ARIMA models perform far better than the GARCH models