library(fpp)
## Loading required package: forecast
## Warning: package 'forecast' was built under R version 3.4.4
## Loading required package: fma
## Loading required package: expsmooth
## Loading required package: lmtest
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 3.4.3
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Loading required package: tseries
## Warning: package 'tseries' was built under R version 3.4.3
library(forecast)
library(xts)
## Warning: package 'xts' was built under R version 3.4.3
library(tseries)
library(readr)
IBM.data<-read_csv("~/Dropbox/Boston College/Predictive Analytics/monthly-returns-ibm-common-stock.csv")
## Warning: Missing column names filled in: 'X3' [3]
## Parsed with column specification:
## cols(
## Month = col_character(),
## `Monthly returns, IBM common stock, Jan. 1961 ? Dec. 1967` = col_character(),
## X3 = col_character()
## )
Organizing data
#Rename
names(IBM.data)[2]<-"returns"
str(IBM.data)
## Classes 'tbl_df', 'tbl' and 'data.frame': 86 obs. of 3 variables:
## $ Month : chr "1961-01" "1961-02" "1961-03" "1961-04" ...
## $ returns: chr "0.073" "0.063" "0.03" "0.027" ...
## $ X3 : chr NA NA NA NA ...
## - attr(*, "spec")=List of 2
## ..$ cols :List of 3
## .. ..$ Month : list()
## .. .. ..- attr(*, "class")= chr "collector_character" "collector"
## .. ..$ Monthly returns, IBM common stock, Jan. 1961 ? Dec. 1967: list()
## .. .. ..- attr(*, "class")= chr "collector_character" "collector"
## .. ..$ X3 : list()
## .. .. ..- attr(*, "class")= chr "collector_character" "collector"
## ..$ default: list()
## .. ..- attr(*, "class")= chr "collector_guess" "collector"
## ..- attr(*, "class")= chr "col_spec"
IBM.data$returns<-as.numeric(IBM.data$returns)
## Warning: NAs introduced by coercion
head(IBM.data)
## # A tibble: 6 x 3
## Month returns X3
## <chr> <dbl> <chr>
## 1 1961-01 0.073 <NA>
## 2 1961-02 0.063 <NA>
## 3 1961-03 0.030 <NA>
## 4 1961-04 0.027 <NA>
## 5 1961-05 0.028 <NA>
## 6 1961-06 0.027 <NA>
tail(IBM.data)
## # A tibble: 6 x 3
## Month returns X3
## <chr> <dbl> <chr>
## 1 1967-09 0.097 <NA>
## 2 1967-10 0.083 <NA>
## 3 1967-11 0.033 <NA>
## 4 1967-12 0.025 <NA>
## 5 <NA> NA <NA>
## 6 Monthly returns NA Jan. 1961 ? Dec. 1967
#Separate into train and test
IBM.train<-IBM.data[1:69,]
IBM.test<-IBM.data[70:84,]
#Time series
IBM.train.ts<-ts(IBM.train$returns, frequency=12, start=c(1961, 1))
IBM.test.ts<-ts(IBM.test$returns, frequency=12, start=c(1966, 10))
plot(IBM.train.ts)
plot(IBM.test.ts)
Neural Net: Model NNAR(12,1,6)[12]
IBM.nnet<-nnetar(IBM.train.ts)
summary(IBM.nnet)
## Length Class Mode
## x 69 ts numeric
## m 1 -none- numeric
## p 1 -none- numeric
## P 1 -none- numeric
## scalex 2 -none- list
## size 1 -none- numeric
## subset 69 -none- numeric
## model 20 nnetarmodels list
## nnetargs 0 -none- list
## fitted 69 ts numeric
## residuals 69 ts numeric
## lags 12 -none- numeric
## series 1 -none- character
## method 1 -none- character
## call 2 -none- call
IBM.nnet
## Series: IBM.train.ts
## Model: NNAR(12,1,6)[12]
## Call: nnetar(y = IBM.train.ts)
##
## Average of 20 networks, each of which is
## a 12-6-1 network with 85 weights
## options were - linear output units
##
## sigma^2 estimated as 2.966e-07
Forecast
forecast<-forecast(IBM.nnet, h=15)
plot(forecast)
lines(IBM.test.ts, col="red")
accuracy(forecast, IBM.test.ts)
## ME RMSE MAE MPE MAPE
## Training set -6.216473e-06 0.0005445725 0.000360423 -0.7006989 1.844143
## Test set 1.963375e-02 0.0484784112 0.041236586 -12.2084950 104.067294
## MASE ACF1 Theil's U
## Training set 0.008270576 0.2901007 NA
## Test set 0.946250151 -0.5166793 1.047062
The forecast in blue shows similar movement to the test data in red. Pretty good MAE on the test set of 0.039, meaning this was a good predictor.