#Getting AMAZON stock dataset and loading the needed packages
#https://www.quantstart.com/articles/ARIMA-GARCH-Trading-Strategy-on-the-SP500-Stock-Market-Index-Using-R/
if(!require(quantmod)) install.packages("quantmod")
if(!require(forecast)) install.packages("forecast")
if(!require(lattice)) install.packages("lattice")
if(!require(tseries)) install.packages("tseries")
if(!require(timeSeries)) install.packages("timeSeries")
if(!require(dplyr)) install.packages("dplyr")
if(!require(fGarch)) install.packages("fGarch")
if(!require(prophet)) install.packages("prophet")
if(!require(rugarch)) install.packages("rugarch")
library(prophet)
library(quantmod)
library(forecast)
library(tseries)
library(timeSeries)
library(dplyr)
library(fGarch)
library(lattice)
library(rugarch)
#getSymbols("^GSPC", src="yahoo", from="2018-01-01")
getSymbols("AAPL", src="yahoo", from="2018-01-01")
[1] "AAPL"
spReturns = diff(log(Cl(AAPL)))
spReturnsN=diff(Cl(AAPL))
spReturns[as.character(head(index(Cl(AAPL)),1))] = 0
windowLength = 500
 foreLength = length(spReturns) - windowLength
 forecasts <- vector(mode="character", length=foreLength)
for (d in 0:foreLength-1) {
  spReturnsOffset = spReturns[(1+d):(windowLength+d)]
     final.aic <- Inf
    final.order <- c(0,0,0)
     for (p in 0:5) for (q in 0:5) {
         if ( p == 0 && q == 0) {
             next
         }
 
         arimaFit = tryCatch( arima(spReturnsOffset, order=c(p, 0, q)),
                              error=function( err ) FALSE,
                              warning=function( err ) FALSE )
 
         if( !is.logical( arimaFit ) ) {
             current.aic <- AIC(arimaFit)
             if (current.aic < final.aic) {
                 final.aic <- current.aic
                 final.order <- c(p, 0, q)
                 final.arima <- arima(spReturnsOffset, order=final.order)
            }
         } else {
             next
         }
     }
       spec = ugarchspec(
                 variance.model=list(garchOrder=c(1,1)),
                 mean.model=list(armaOrder=c(final.order[1], final.order[3]), include.mean=T),
                 distribution.model="sged")
     
     fit = tryCatch(
       ugarchfit(
         spec, spReturnsOffset, solver = 'hybrid'
       ), error=function(e) e, warning=function(w) w
     )
          if(is(fit, "warning")) {
       forecasts[d+1] = paste(index(spReturnsOffset[windowLength]), 1, sep=",")
       print(paste(index(spReturnsOffset[windowLength]), 1, sep=","))
     } else {
       fore = ugarchforecast(fit, n.ahead=1)
       ind = fore@forecast$seriesFor
       forecasts[d+1] = paste(colnames(ind), ifelse(ind[1] < 0, -1, 1), sep=",")
       print(paste(colnames(ind), ifelse(ind[1] < 0, -1, 1), sep=",")) 
     }
}
[1] "2019-12-24,1"
[1] "2019-12-26,1"
[1] "2019-12-27,1"
[1] "2019-12-30,1"
[1] "2019-12-31,1"
[1] "2020-01-02,1"
[1] "2020-01-03,-1"
[1] "2020-01-06,1"
[1] "2020-01-07,1"
[1] "2020-01-08,1"
[1] "2020-01-09,1"
[1] "2020-01-10,1"
[1] "2020-01-13,1"
[1] "2020-01-14,1"
[1] "2020-01-15,1"
[1] "2020-01-16,1"
[1] "2020-01-17,1"
[1] "2020-01-21,1"
[1] "2020-01-22,1"
[1] "2020-01-23,1"
[1] "2020-01-24,1"
[1] "2020-01-27,1"
[1] "2020-01-28,1"
[1] "2020-01-29,1"
[1] "2020-01-30,1"
[1] "2020-01-31,1"
[1] "2020-02-03,1"
[1] "2020-02-04,1"
[1] "2020-02-05,1"
[1] "2020-02-06,-1"
[1] "2020-02-07,1"
[1] "2020-02-10,1"
[1] "2020-02-11,1"
[1] "2020-02-12,1"
[1] "2020-02-13,1"
[1] "2020-02-14,1"
[1] "2020-02-18,1"
[1] "2020-02-19,1"
[1] "2020-02-20,1"
[1] "2020-02-21,1"
[1] "2020-02-24,1"
[1] "2020-02-25,1"
[1] "2020-02-26,1"
[1] "2020-02-27,-1"
[1] "2020-02-28,1"
[1] "2020-03-02,-1"
[1] "2020-03-03,-1"
[1] "2020-03-04,-1"
[1] "2020-03-05,-1"
[1] "2020-03-06,1"
[1] "2020-03-09,1"
[1] "2020-03-10,1"
[1] "2020-03-11,1"
[1] "2020-03-12,1"
[1] "2020-03-13,1"
[1] "2020-03-16,1"
[1] "2020-03-17,1"
[1] "2020-03-18,1"
[1] "2020-03-19,-1"
[1] "2020-03-20,1"
[1] "2020-03-23,-1"
[1] "2020-03-24,-1"
[1] "2020-03-25,1"
[1] "2020-03-26,-1"
[1] "2020-03-27,1"
[1] "2020-03-30,1"
[1] "2020-03-31,-1"
[1] "2020-04-01,1"
[1] "2020-04-02,-1"
[1] "2020-04-03,1"
[1] "2020-04-06,-1"
[1] "2020-04-07,1"
[1] "2020-04-08,-1"
[1] "2020-04-09,-1"
[1] "2020-04-13,1"
[1] "2020-04-14,-1"
[1] "2020-04-15,1"
[1] "2020-04-16,-1"
[1] "2020-04-17,1"
[1] "2020-04-20,1"
[1] "2020-04-21,-1"
[1] "2020-04-22,1"
[1] "2020-04-23,-1"
[1] "2020-04-24,1"
[1] "2020-04-27,-1"
[1] "2020-04-28,1"
[1] "2020-04-29,-1"
[1] "2020-04-30,-1"
[1] "2020-05-01,1"
[1] "2020-05-04,1"
[1] "2020-05-05,1"
[1] "2020-05-06,-1"
[1] "2020-05-07,1"
[1] "2020-05-08,1"
[1] "2020-05-11,-1"
[1] "2020-05-12,1"
[1] "2020-05-13,-1"
[1] "2020-05-14,1"
[1] "2020-05-15,1"
[1] "2020-05-18,1"
[1] "2020-05-19,1"
[1] "2020-05-20,-1"
[1] "2020-05-21,1"
[1] "2020-05-22,-1"
[1] "2020-05-26,1"
write.csv(forecasts, file="forecasts_test.csv", row.names=FALSE)
# Input the Python-refined CSV file
spArimaGarch = as.xts( 
  read.zoo(
    file="forecasts_new.csv", format="%Y-%m-%d", header=F, sep=","
  )
)
# Create the ARIMA+GARCH returns
spIntersect = merge( spArimaGarch[,1], spReturns,AAPL$AAPL.Close, spReturnsN, all=F )
spArimaGarchReturns = spIntersect[,1] * spIntersect[,2]

# Create the backtests for ARIMA+GARCH and Buy & Hold
spArimaGarchCurve = log( cumprod( 1 + spArimaGarchReturns ) )
spBuyHoldCurve = log( cumprod( 1 + spIntersect[,2] ) )
spCombinedCurve = merge( spArimaGarchCurve, spBuyHoldCurve, all=F )

# Plot the equity curves
xyplot( 
  spCombinedCurve,
  superpose=T,
  col=c("darkred", "darkblue"),
  lwd=2,
  key=list( 
    text=list(
      c("ARIMA+GARCH", "Buy & Hold")
    ),
    lines=list(
      lwd=2, col=c("darkred", "darkblue")
    )
  )
)


dygraph(spCombinedCurve)%>% dyRangeSelector()

dygraph(spReturns)%>% dyRangeSelector()

spCombinedCurve1 = merge( spArimaGarchCurve, spBuyHoldCurve,spReturns, all=F )
dygraph(spCombinedCurve1)%>% dyRangeSelector()

dygraph(spIntersect[,"AAPL.Close.1"])%>% dyRangeSelector()
LS0tDQp0aXRsZTogInN0b2NrIGRpcmVjdGlvbiBmb3JlY2FzdCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyfQ0KI0dldHRpbmcgQU1BWk9OIHN0b2NrIGRhdGFzZXQgYW5kIGxvYWRpbmcgdGhlIG5lZWRlZCBwYWNrYWdlcw0KI2h0dHBzOi8vd3d3LnF1YW50c3RhcnQuY29tL2FydGljbGVzL0FSSU1BLUdBUkNILVRyYWRpbmctU3RyYXRlZ3ktb24tdGhlLVNQNTAwLVN0b2NrLU1hcmtldC1JbmRleC1Vc2luZy1SLw0KaWYoIXJlcXVpcmUocXVhbnRtb2QpKSBpbnN0YWxsLnBhY2thZ2VzKCJxdWFudG1vZCIpDQppZighcmVxdWlyZShmb3JlY2FzdCkpIGluc3RhbGwucGFja2FnZXMoImZvcmVjYXN0IikNCmlmKCFyZXF1aXJlKGxhdHRpY2UpKSBpbnN0YWxsLnBhY2thZ2VzKCJsYXR0aWNlIikNCmlmKCFyZXF1aXJlKHRzZXJpZXMpKSBpbnN0YWxsLnBhY2thZ2VzKCJ0c2VyaWVzIikNCmlmKCFyZXF1aXJlKHRpbWVTZXJpZXMpKSBpbnN0YWxsLnBhY2thZ2VzKCJ0aW1lU2VyaWVzIikNCmlmKCFyZXF1aXJlKGRwbHlyKSkgaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKQ0KaWYoIXJlcXVpcmUoZkdhcmNoKSkgaW5zdGFsbC5wYWNrYWdlcygiZkdhcmNoIikNCmlmKCFyZXF1aXJlKHByb3BoZXQpKSBpbnN0YWxsLnBhY2thZ2VzKCJwcm9waGV0IikNCmlmKCFyZXF1aXJlKHJ1Z2FyY2gpKSBpbnN0YWxsLnBhY2thZ2VzKCJydWdhcmNoIikNCmxpYnJhcnkocHJvcGhldCkNCmxpYnJhcnkocXVhbnRtb2QpDQpsaWJyYXJ5KGZvcmVjYXN0KQ0KbGlicmFyeSh0c2VyaWVzKQ0KbGlicmFyeSh0aW1lU2VyaWVzKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZkdhcmNoKQ0KbGlicmFyeShsYXR0aWNlKQ0KbGlicmFyeShydWdhcmNoKQ0KDQoNCmBgYA0KDQpgYGB7cn0NCiNnZXRTeW1ib2xzKCJeR1NQQyIsIHNyYz0ieWFob28iLCBmcm9tPSIyMDE4LTAxLTAxIikNCmdldFN5bWJvbHMoIkFBUEwiLCBzcmM9InlhaG9vIiwgZnJvbT0iMjAxOC0wMS0wMSIpDQoNCnNwUmV0dXJucyA9IGRpZmYobG9nKENsKEFBUEwpKSkNCnNwUmV0dXJuc049ZGlmZihDbChBQVBMKSkNCnNwUmV0dXJuc1thcy5jaGFyYWN0ZXIoaGVhZChpbmRleChDbChBQVBMKSksMSkpXSA9IDANCg0KYGBgDQoNCmBgYHtyfQ0Kd2luZG93TGVuZ3RoID0gNTAwDQogZm9yZUxlbmd0aCA9IGxlbmd0aChzcFJldHVybnMpIC0gd2luZG93TGVuZ3RoDQogZm9yZWNhc3RzIDwtIHZlY3Rvcihtb2RlPSJjaGFyYWN0ZXIiLCBsZW5ndGg9Zm9yZUxlbmd0aCkNCmBgYA0KDQpgYGB7cn0NCmZvciAoZCBpbiAwOmZvcmVMZW5ndGgtMSkgew0KICBzcFJldHVybnNPZmZzZXQgPSBzcFJldHVybnNbKDErZCk6KHdpbmRvd0xlbmd0aCtkKV0NCiAgICAgZmluYWwuYWljIDwtIEluZg0KICAgIGZpbmFsLm9yZGVyIDwtIGMoMCwwLDApDQogICAgIGZvciAocCBpbiAwOjUpIGZvciAocSBpbiAwOjUpIHsNCiAgICAgICAgIGlmICggcCA9PSAwICYmIHEgPT0gMCkgew0KICAgICAgICAgICAgIG5leHQNCiAgICAgICAgIH0NCiANCiAgICAgICAgIGFyaW1hRml0ID0gdHJ5Q2F0Y2goIGFyaW1hKHNwUmV0dXJuc09mZnNldCwgb3JkZXI9YyhwLCAwLCBxKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcj1mdW5jdGlvbiggZXJyICkgRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nPWZ1bmN0aW9uKCBlcnIgKSBGQUxTRSApDQogDQogICAgICAgICBpZiggIWlzLmxvZ2ljYWwoIGFyaW1hRml0ICkgKSB7DQogICAgICAgICAgICAgY3VycmVudC5haWMgPC0gQUlDKGFyaW1hRml0KQ0KICAgICAgICAgICAgIGlmIChjdXJyZW50LmFpYyA8IGZpbmFsLmFpYykgew0KICAgICAgICAgICAgICAgICBmaW5hbC5haWMgPC0gY3VycmVudC5haWMNCiAgICAgICAgICAgICAgICAgZmluYWwub3JkZXIgPC0gYyhwLCAwLCBxKQ0KICAgICAgICAgICAgICAgICBmaW5hbC5hcmltYSA8LSBhcmltYShzcFJldHVybnNPZmZzZXQsIG9yZGVyPWZpbmFsLm9yZGVyKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICBuZXh0DQogICAgICAgICB9DQogICAgIH0NCiAgICAgICBzcGVjID0gdWdhcmNoc3BlYygNCiAgICAgICAgICAgICAgICAgdmFyaWFuY2UubW9kZWw9bGlzdChnYXJjaE9yZGVyPWMoMSwxKSksDQogICAgICAgICAgICAgICAgIG1lYW4ubW9kZWw9bGlzdChhcm1hT3JkZXI9YyhmaW5hbC5vcmRlclsxXSwgZmluYWwub3JkZXJbM10pLCBpbmNsdWRlLm1lYW49VCksDQogICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbi5tb2RlbD0ic2dlZCIpDQogICAgIA0KICAgICBmaXQgPSB0cnlDYXRjaCgNCiAgICAgICB1Z2FyY2hmaXQoDQogICAgICAgICBzcGVjLCBzcFJldHVybnNPZmZzZXQsIHNvbHZlciA9ICdoeWJyaWQnDQogICAgICAgKSwgZXJyb3I9ZnVuY3Rpb24oZSkgZSwgd2FybmluZz1mdW5jdGlvbih3KSB3DQogICAgICkNCiAgICAgICAgICBpZihpcyhmaXQsICJ3YXJuaW5nIikpIHsNCiAgICAgICBmb3JlY2FzdHNbZCsxXSA9IHBhc3RlKGluZGV4KHNwUmV0dXJuc09mZnNldFt3aW5kb3dMZW5ndGhdKSwgMSwgc2VwPSIsIikNCiAgICAgICBwcmludChwYXN0ZShpbmRleChzcFJldHVybnNPZmZzZXRbd2luZG93TGVuZ3RoXSksIDEsIHNlcD0iLCIpKQ0KICAgICB9IGVsc2Ugew0KICAgICAgIGZvcmUgPSB1Z2FyY2hmb3JlY2FzdChmaXQsIG4uYWhlYWQ9MSkNCiAgICAgICBpbmQgPSBmb3JlQGZvcmVjYXN0JHNlcmllc0Zvcg0KICAgICAgIGZvcmVjYXN0c1tkKzFdID0gcGFzdGUoY29sbmFtZXMoaW5kKSwgaWZlbHNlKGluZFsxXSA8IDAsIC0xLCAxKSwgc2VwPSIsIikNCiAgICAgICBwcmludChwYXN0ZShjb2xuYW1lcyhpbmQpLCBpZmVsc2UoaW5kWzFdIDwgMCwgLTEsIDEpLCBzZXA9IiwiKSkgDQogICAgIH0NCn0NCndyaXRlLmNzdihmb3JlY2FzdHMsIGZpbGU9ImZvcmVjYXN0c190ZXN0LmNzdiIsIHJvdy5uYW1lcz1GQUxTRSkNCmBgYA0KDQpgYGB7cn0NCiMgSW5wdXQgdGhlIFB5dGhvbi1yZWZpbmVkIENTViBmaWxlDQpzcEFyaW1hR2FyY2ggPSBhcy54dHMoIA0KICByZWFkLnpvbygNCiAgICBmaWxlPSJmb3JlY2FzdHNfbmV3LmNzdiIsIGZvcm1hdD0iJVktJW0tJWQiLCBoZWFkZXI9Riwgc2VwPSIsIg0KICApDQopDQojIENyZWF0ZSB0aGUgQVJJTUErR0FSQ0ggcmV0dXJucw0Kc3BJbnRlcnNlY3QgPSBtZXJnZSggc3BBcmltYUdhcmNoWywxXSwgc3BSZXR1cm5zLEFBUEwkQUFQTC5DbG9zZSwgc3BSZXR1cm5zTiwgYWxsPUYgKQ0Kc3BBcmltYUdhcmNoUmV0dXJucyA9IHNwSW50ZXJzZWN0WywxXSAqIHNwSW50ZXJzZWN0WywyXQ0KDQojIENyZWF0ZSB0aGUgYmFja3Rlc3RzIGZvciBBUklNQStHQVJDSCBhbmQgQnV5ICYgSG9sZA0Kc3BBcmltYUdhcmNoQ3VydmUgPSBsb2coIGN1bXByb2QoIDEgKyBzcEFyaW1hR2FyY2hSZXR1cm5zICkgKQ0Kc3BCdXlIb2xkQ3VydmUgPSBsb2coIGN1bXByb2QoIDEgKyBzcEludGVyc2VjdFssMl0gKSApDQpzcENvbWJpbmVkQ3VydmUgPSBtZXJnZSggc3BBcmltYUdhcmNoQ3VydmUsIHNwQnV5SG9sZEN1cnZlLCBhbGw9RiApDQoNCiMgUGxvdCB0aGUgZXF1aXR5IGN1cnZlcw0KeHlwbG90KCANCiAgc3BDb21iaW5lZEN1cnZlLA0KICBzdXBlcnBvc2U9VCwNCiAgY29sPWMoImRhcmtyZWQiLCAiZGFya2JsdWUiKSwNCiAgbHdkPTIsDQogIGtleT1saXN0KCANCiAgICB0ZXh0PWxpc3QoDQogICAgICBjKCJBUklNQStHQVJDSCIsICJCdXkgJiBIb2xkIikNCiAgICApLA0KICAgIGxpbmVzPWxpc3QoDQogICAgICBsd2Q9MiwgY29sPWMoImRhcmtyZWQiLCAiZGFya2JsdWUiKQ0KICAgICkNCiAgKQ0KKQ0KYGBgDQpgYGB7cn0NCg0KZHlncmFwaChzcENvbWJpbmVkQ3VydmUpJT4lIGR5UmFuZ2VTZWxlY3RvcigpDQpkeWdyYXBoKHNwUmV0dXJucyklPiUgZHlSYW5nZVNlbGVjdG9yKCkNCnNwQ29tYmluZWRDdXJ2ZTEgPSBtZXJnZSggc3BBcmltYUdhcmNoQ3VydmUsIHNwQnV5SG9sZEN1cnZlLHNwUmV0dXJucywgYWxsPUYgKQ0KZHlncmFwaChzcENvbWJpbmVkQ3VydmUxKSU+JSBkeVJhbmdlU2VsZWN0b3IoKQ0KZHlncmFwaChzcEludGVyc2VjdFssIkFBUEwuQ2xvc2UuMSJdKSU+JSBkeVJhbmdlU2VsZWN0b3IoKQ0KYGBgDQoNCg==