6 CHAPTER 6: UNIVARIATE TIME SERIES MODELLING AND FORECASTING

6.1 Load Libraries

library(foreign)
library(moments)
library(leaps)
library(quantreg)
library(rugarch)
library(smooth)

6.2 Screenshot 6.1 Estimating the correlogram (Page 277)

data_ukhp <- read.dta("Dataset/ukhp.dta")
data_ukhp <- na.omit(data_ukhp)

par(mfcol = c(2, 1), mar = c(4, 4, 2, 1), mgp = c(2, 0.5, 0))
acf(data_ukhp$dhp, lag = 12, las = 1, main = "ACF of dhp")
pacf(data_ukhp$dhp, lag = 12, las = 1, main = "PACF of dhp")

6.3 ARIMA (Page 279)

library(forecast)
summary(model <- Arima(data_ukhp$dhp, order = c(1, 0, 1), include.mean = TRUE))
## Series: data_ukhp$dhp 
## ARIMA(1,0,1) with non-zero mean 
## 
## Coefficients:
##          ar1      ma1    mean
##       0.8364  -0.5608  0.4441
## s.e.  0.0622   0.0941  0.1727
## 
## sigma^2 = 1.154:  log likelihood = -398.14
## AIC=804.29   AICc=804.44   BIC=818.65
## 
## Training set error measures:
##                        ME     RMSE       MAE      MPE    MAPE      MASE        ACF1
## Training set 0.0001903891 1.068324 0.8169962 113.6997 205.435 0.8054493 -0.06479526

6.4 Screenshot 6.3 Dynamic forecasts for the percentage changes in house prices (Page 298)

space <- 30
nfore <- 30
ar2.spec <- ugarchspec(mean.model = list(armaOrder = c(1,0)),
                       variance.model = list(garchOrder = c(0,1)))
ar.fit <- ugarchfit(ar2.spec, data_ukhp$dhp[1:(nrow(data_ukhp)-space)])
ar.fore <- ugarchforecast(ar.fit, n.ahead = nfore)

c.mean <- ar.fore@forecast$seriesFor
c.lower <- c.mean - qnorm(0.99) * ar.fore@forecast$sigmaFor
c.upper <- c.mean + qnorm(0.99) * ar.fore@forecast$sigmaFor

plot(c.mean, type = "l", xaxs = "i", las = 1, main = "GARCH Forecast",
     ylim = c(-3, 4), ylab = "", xlab = "")
lines(c.lower, col = "steelblue4")
lines(c.upper, col = "steelblue4")

6.5 Screenshot 6.4 Static forecasts for the percentage changes in house prices (Page 298)

FORE.EX <- FORE.AR2 <- NULL

for (i in 1:space) {
  ar.fit <- ugarchfit(ar2.spec, data_ukhp$dhp[1:(nrow(data_ukhp)-space+i)])
  ar.fore <- ugarchforecast(ar.fit, n.ahead = 1)
  c.mean <- ar.fore@forecast$seriesFor
  c.lower <- c.mean - qnorm(0.99) * ar.fore@forecast$sigmaFor
  c.upper <- c.mean + qnorm(0.99) * ar.fore@forecast$sigmaFor
  FORE.AR2 <- rbind(FORE.AR2, c(c.mean, c.lower, c.upper))
  
  es.fore <- es(data_ukhp$dhp[1:(nrow(data_ukhp)-space+i)], h = 1, holdout = FALSE, silent = TRUE, intervals = "parametric")
  FORE.EX <- rbind(FORE.EX, c(es.fore$forecast, es.fore$lower, es.fore$upper))
}
plot(FORE.EX[,1], type = "l", xaxs = "i", yaxs = "i", las = 1, ylim = c(-3, 4), 
     main = "Rolling Forecast Comparison", ylab = "", xlab = "")
#lines(FORE.EX[,2], col = "steelblue4")
#lines(FORE.EX[,3], col = "steelblue4")
lines(FORE.AR2[,1], lty = 2)
lines(FORE.AR2[,2], col = "steelblue4", lty = 2)
lines(FORE.AR2[,3], col = "steelblue4", lty = 2)
lines(data_ukhp$dhp[-(1:(nrow(data_ukhp)-space+1))], col = "gold3", lwd = 1)


legend("bottom", 
       legend = c("True Movement", "Exponential Smoothing", "AR(2) Forecasts"),
       col = c("gold3", "black", "black"), 
       lty = c(1, 1, 2), 
       box.col = "white",
       xpd = TRUE, 
       inset = c(0, -0.2),
       ncol = 3)