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.