Preamble

library("forecast")
library("tseries")

NADAQ Series

Daily Adjusted Close

data <- read.csv("http://ptrckprry.com/course/forecasting/data/nasdaq.csv")
date <- as.Date(data$date)
time <- seq_along(date)
NASDAQ <- data$nasdaq

Log (Adj. Close)

log.NASDAQ <- log(NASDAQ)
plot(date, log.NASDAQ, type="l", col=2)

ACF, PACF of Returns

diff.log.NASDAQ <- c(NA, diff(log.NASDAQ))

par(mfrow=c(1,2))
Acf(diff.log.NASDAQ)
Pacf(diff.log.NASDAQ)

ARIMA Identification

d <- 1

# choose p, q with AICc
for (include.constant in c(FALSE, TRUE)) {
    for (p in 0:4) {
        for (q in 0:4) {
            # work-around bug in R by manually differencing
            fit <- Arima(diff(log.NASDAQ), c(p,0,q),
                         include.constant=include.constant, method="ML")
             cat("ARIMA",
                 "(", p, ",", d, ",", q, ")",
                 "(constant=", include.constant, ")",
                 " : ", fit$aicc, "\n", sep="")
        }
    }
}
ARIMA(0,1,0)(constant=FALSE) : -69264.13
ARIMA(0,1,1)(constant=FALSE) : -69296.54
ARIMA(0,1,2)(constant=FALSE) : -69300.3
ARIMA(0,1,3)(constant=FALSE) : -69300.84
ARIMA(0,1,4)(constant=FALSE) : -69302.25
ARIMA(1,1,0)(constant=FALSE) : -69294.94
ARIMA(1,1,1)(constant=FALSE) : -69300.83
ARIMA(1,1,2)(constant=FALSE) : -69298.38
ARIMA(1,1,3)(constant=FALSE) : -69299
ARIMA(1,1,4)(constant=FALSE) : -69300.19
ARIMA(2,1,0)(constant=FALSE) : -69299.5
ARIMA(2,1,1)(constant=FALSE) : -69299.23
ARIMA(2,1,2)(constant=FALSE) : -69296.9
ARIMA(2,1,3)(constant=FALSE) : -69299.31
ARIMA(2,1,4)(constant=FALSE) : -69298.2
ARIMA(3,1,0)(constant=FALSE) : -69301.84
ARIMA(3,1,1)(constant=FALSE) : -69299.67
ARIMA(3,1,2)(constant=FALSE) : -69299.5
ARIMA(3,1,3)(constant=FALSE) : -69322.59
ARIMA(3,1,4)(constant=FALSE) : -69335.59
ARIMA(4,1,0)(constant=FALSE) : -69302.14
ARIMA(4,1,1)(constant=FALSE) : -69300.2
ARIMA(4,1,2)(constant=FALSE) : -69298.18
ARIMA(4,1,3)(constant=FALSE) : -69335.13
ARIMA(4,1,4)(constant=FALSE) : -69335.2
ARIMA(0,1,0)(constant=TRUE) : -69271.5
ARIMA(0,1,1)(constant=TRUE) : -69302.98
ARIMA(0,1,2)(constant=TRUE) : -69307.12
ARIMA(0,1,3)(constant=TRUE) : -69307.42
ARIMA(0,1,4)(constant=TRUE) : -69308.55
ARIMA(1,1,0)(constant=TRUE) : -69301.37
ARIMA(1,1,1)(constant=TRUE) : -69307.61
ARIMA(1,1,2)(constant=TRUE) : -69305.88
ARIMA(1,1,3)(constant=TRUE) : -69305.56
ARIMA(1,1,4)(constant=TRUE) : -69306.48
ARIMA(2,1,0)(constant=TRUE) : -69306.35
ARIMA(2,1,1)(constant=TRUE) : -69305.66
ARIMA(2,1,2)(constant=TRUE) : -69303.65
ARIMA(2,1,3)(constant=TRUE) : -69305.83
ARIMA(2,1,4)(constant=TRUE) : -69304.5
ARIMA(3,1,0)(constant=TRUE) : -69308.36
ARIMA(3,1,1)(constant=TRUE) : -69306.2
ARIMA(3,1,2)(constant=TRUE) : -69306.25
ARIMA(3,1,3)(constant=TRUE) : -69327.82
ARIMA(3,1,4)(constant=TRUE) : -69339.43
ARIMA(4,1,0)(constant=TRUE) : -69308.43
ARIMA(4,1,1)(constant=TRUE) : -69306.49
ARIMA(4,1,2)(constant=TRUE) : -69304.46
ARIMA(4,1,3)(constant=TRUE) : -69337.68
ARIMA(4,1,4)(constant=TRUE) : -69339.37

Selected ARIMA Model

(fit.mean <- Arima(log.NASDAQ, c(3, 1, 4), include.constant=TRUE, method="ML"))
Series: log.NASDAQ 
ARIMA(3,1,4) with drift         

Coefficients:
Warning in sqrt(diag(x$var.coef)): NaNs produced
         ar1      ar2     ar3      ma1     ma2      ma3      ma4  drift
      0.1747  -0.2358  0.9165  -0.1197  0.2185  -0.8887  -0.0377  3e-04
s.e.     NaN      NaN  0.0244      NaN     NaN   0.0271   0.0100  1e-04

sigma^2 estimated as 0.0001514:  log likelihood=34678.72
AIC=-69339.45   AICc=-69339.43   BIC=-69273.19

Residuals

Time Series Plots

resid <- as.numeric(residuals(fit.mean))
plot(date, abs(resid), type="l", col=3)