#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")
Loading required package: 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")
Loading required package: rugarch
there is no package called 㤼㸱rugarch㤼㸲WARNING: Rtools is required to build R packages but is not currently installed. Please download and install the appropriate version of Rtools before proceeding:
https://cran.rstudio.com/bin/windows/Rtools/
also installing the dependencies 㤼㸱truncnorm㤼㸲, 㤼㸱FNN㤼㸲, 㤼㸱kernlab㤼㸲, 㤼㸱mclust㤼㸲, 㤼㸱multicool㤼㸲, 㤼㸱mvtnorm㤼㸲, 㤼㸱DistributionUtils㤼㸲, 㤼㸱GeneralizedHyperbolic㤼㸲, 㤼㸱Rsolnp㤼㸲, 㤼㸱nloptr㤼㸲, 㤼㸱ks㤼㸲, 㤼㸱spd㤼㸲, 㤼㸱chron㤼㸲, 㤼㸱SkewHyperbolic㤼㸲, 㤼㸱expm㤼㸲
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.6/truncnorm_1.0-8.zip'
Content type 'application/zip' length 44098 bytes (43 KB)
downloaded 43 KB
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.6/FNN_1.1.3.zip'
Content type 'application/zip' length 637738 bytes (622 KB)
downloaded 622 KB
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.6/kernlab_0.9-29.zip'
Content type 'application/zip' length 2641401 bytes (2.5 MB)
downloaded 2.5 MB
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.6/mclust_5.4.6.zip'
Content type 'application/zip' length 4570187 bytes (4.4 MB)
downloaded 4.4 MB
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.6/multicool_0.1-11.zip'
Content type 'application/zip' length 649403 bytes (634 KB)
downloaded 634 KB
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.6/mvtnorm_1.1-0.zip'
Content type 'application/zip' length 270703 bytes (264 KB)
downloaded 264 KB
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.6/DistributionUtils_0.6-0.zip'
Content type 'application/zip' length 201316 bytes (196 KB)
downloaded 196 KB
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.6/GeneralizedHyperbolic_0.8-4.zip'
Content type 'application/zip' length 594501 bytes (580 KB)
downloaded 580 KB
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.6/Rsolnp_1.16.zip'
Content type 'application/zip' length 252412 bytes (246 KB)
downloaded 246 KB
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.6/nloptr_1.2.2.1.zip'
Content type 'application/zip' length 1078961 bytes (1.0 MB)
downloaded 1.0 MB
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.6/ks_1.11.7.zip'
Content type 'application/zip' length 1668637 bytes (1.6 MB)
downloaded 1.6 MB
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.6/spd_2.0-1.zip'
Content type 'application/zip' length 162550 bytes (158 KB)
downloaded 158 KB
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.6/chron_2.3-55.zip'
Content type 'application/zip' length 203079 bytes (198 KB)
downloaded 198 KB
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.6/SkewHyperbolic_0.4-0.zip'
Content type 'application/zip' length 173740 bytes (169 KB)
downloaded 169 KB
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.6/expm_0.999-4.zip'
Content type 'application/zip' length 238273 bytes (232 KB)
downloaded 232 KB
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.6/rugarch_1.4-2.zip'
Content type 'application/zip' length 5414014 bytes (5.2 MB)
downloaded 5.2 MB
package ‘truncnorm’ successfully unpacked and MD5 sums checked
package ‘FNN’ successfully unpacked and MD5 sums checked
package ‘kernlab’ successfully unpacked and MD5 sums checked
package ‘mclust’ successfully unpacked and MD5 sums checked
package ‘multicool’ successfully unpacked and MD5 sums checked
package ‘mvtnorm’ successfully unpacked and MD5 sums checked
package ‘DistributionUtils’ successfully unpacked and MD5 sums checked
package ‘GeneralizedHyperbolic’ successfully unpacked and MD5 sums checked
package ‘Rsolnp’ successfully unpacked and MD5 sums checked
package ‘nloptr’ successfully unpacked and MD5 sums checked
package ‘ks’ successfully unpacked and MD5 sums checked
package ‘spd’ successfully unpacked and MD5 sums checked
package ‘chron’ successfully unpacked and MD5 sums checked
package ‘SkewHyperbolic’ successfully unpacked and MD5 sums checked
package ‘expm’ successfully unpacked and MD5 sums checked
package ‘rugarch’ successfully unpacked and MD5 sums checked
The downloaded binary packages are in
C:\Users\chene\AppData\Local\Temp\RtmpusURkF\downloaded_packages
library(prophet)
library(quantmod)
library(forecast)
library(tseries)
library(timeSeries)
library(dplyr)
library(fGarch)
library(lattice)
library(rugarch)
package 㤼㸱rugarch㤼㸲 was built under R version 3.6.3Loading required package: parallel
Attaching package: 㤼㸱rugarch㤼㸲
The following object is masked from 㤼㸱package:purrr㤼㸲:
reduce
The following object is masked from 㤼㸱package:stats㤼㸲:
sigma
getSymbols("^GSPC", src="yahoo", from="2018-01-01")
[1] "^GSPC"
spReturns = diff(log(Cl(GSPC)))
spReturnsN=diff(Cl(GSPC))
spReturns[as.character(head(index(Cl(GSPC)),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, 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")
)
)
)

LS0tDQp0aXRsZTogInN0b2NrIGRpcmVjdGlvbiBmb3JlY2FzdCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyfQ0KI0dldHRpbmcgQU1BWk9OIHN0b2NrIGRhdGFzZXQgYW5kIGxvYWRpbmcgdGhlIG5lZWRlZCBwYWNrYWdlcw0KI2h0dHBzOi8vd3d3LnF1YW50c3RhcnQuY29tL2FydGljbGVzL0FSSU1BLUdBUkNILVRyYWRpbmctU3RyYXRlZ3ktb24tdGhlLVNQNTAwLVN0b2NrLU1hcmtldC1JbmRleC1Vc2luZy1SLw0KaWYoIXJlcXVpcmUocXVhbnRtb2QpKSBpbnN0YWxsLnBhY2thZ2VzKCJxdWFudG1vZCIpDQppZighcmVxdWlyZShmb3JlY2FzdCkpIGluc3RhbGwucGFja2FnZXMoImZvcmVjYXN0IikNCmlmKCFyZXF1aXJlKGxhdHRpY2UpKSBpbnN0YWxsLnBhY2thZ2VzKCJsYXR0aWNlIikNCmlmKCFyZXF1aXJlKHRzZXJpZXMpKSBpbnN0YWxsLnBhY2thZ2VzKCJ0c2VyaWVzIikNCmlmKCFyZXF1aXJlKHRpbWVTZXJpZXMpKSBpbnN0YWxsLnBhY2thZ2VzKCJ0aW1lU2VyaWVzIikNCmlmKCFyZXF1aXJlKGRwbHlyKSkgaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKQ0KaWYoIXJlcXVpcmUoZkdhcmNoKSkgaW5zdGFsbC5wYWNrYWdlcygiZkdhcmNoIikNCmlmKCFyZXF1aXJlKHByb3BoZXQpKSBpbnN0YWxsLnBhY2thZ2VzKCJwcm9waGV0IikNCmlmKCFyZXF1aXJlKHJ1Z2FyY2gpKSBpbnN0YWxsLnBhY2thZ2VzKCJydWdhcmNoIikNCmxpYnJhcnkocHJvcGhldCkNCmxpYnJhcnkocXVhbnRtb2QpDQpsaWJyYXJ5KGZvcmVjYXN0KQ0KbGlicmFyeSh0c2VyaWVzKQ0KbGlicmFyeSh0aW1lU2VyaWVzKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZkdhcmNoKQ0KbGlicmFyeShsYXR0aWNlKQ0KbGlicmFyeShydWdhcmNoKQ0KDQoNCmBgYA0KDQpgYGB7cn0NCmdldFN5bWJvbHMoIl5HU1BDIiwgc3JjPSJ5YWhvbyIsIGZyb209IjIwMTgtMDEtMDEiKQ0Kc3BSZXR1cm5zID0gZGlmZihsb2coQ2woR1NQQykpKQ0Kc3BSZXR1cm5zTj1kaWZmKENsKEdTUEMpKQ0Kc3BSZXR1cm5zW2FzLmNoYXJhY3RlcihoZWFkKGluZGV4KENsKEdTUEMpKSwxKSldID0gMA0KDQpgYGANCg0KYGBge3J9DQp3aW5kb3dMZW5ndGggPSA1MDANCiBmb3JlTGVuZ3RoID0gbGVuZ3RoKHNwUmV0dXJucykgLSB3aW5kb3dMZW5ndGgNCiBmb3JlY2FzdHMgPC0gdmVjdG9yKG1vZGU9ImNoYXJhY3RlciIsIGxlbmd0aD1mb3JlTGVuZ3RoKQ0KYGBgDQoNCmBgYHtyfQ0KZm9yIChkIGluIDA6Zm9yZUxlbmd0aC0xKSB7DQogIHNwUmV0dXJuc09mZnNldCA9IHNwUmV0dXJuc1soMStkKTood2luZG93TGVuZ3RoK2QpXQ0KICAgICBmaW5hbC5haWMgPC0gSW5mDQogICAgZmluYWwub3JkZXIgPC0gYygwLDAsMCkNCiAgICAgZm9yIChwIGluIDA6NSkgZm9yIChxIGluIDA6NSkgew0KICAgICAgICAgaWYgKCBwID09IDAgJiYgcSA9PSAwKSB7DQogICAgICAgICAgICAgbmV4dA0KICAgICAgICAgfQ0KIA0KICAgICAgICAgYXJpbWFGaXQgPSB0cnlDYXRjaCggYXJpbWEoc3BSZXR1cm5zT2Zmc2V0LCBvcmRlcj1jKHAsIDAsIHEpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yPWZ1bmN0aW9uKCBlcnIgKSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmc9ZnVuY3Rpb24oIGVyciApIEZBTFNFICkNCiANCiAgICAgICAgIGlmKCAhaXMubG9naWNhbCggYXJpbWFGaXQgKSApIHsNCiAgICAgICAgICAgICBjdXJyZW50LmFpYyA8LSBBSUMoYXJpbWFGaXQpDQogICAgICAgICAgICAgaWYgKGN1cnJlbnQuYWljIDwgZmluYWwuYWljKSB7DQogICAgICAgICAgICAgICAgIGZpbmFsLmFpYyA8LSBjdXJyZW50LmFpYw0KICAgICAgICAgICAgICAgICBmaW5hbC5vcmRlciA8LSBjKHAsIDAsIHEpDQogICAgICAgICAgICAgICAgIGZpbmFsLmFyaW1hIDwtIGFyaW1hKHNwUmV0dXJuc09mZnNldCwgb3JkZXI9ZmluYWwub3JkZXIpDQogICAgICAgICAgICB9DQogICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgIG5leHQNCiAgICAgICAgIH0NCiAgICAgfQ0KICAgICAgIHNwZWMgPSB1Z2FyY2hzcGVjKA0KICAgICAgICAgICAgICAgICB2YXJpYW5jZS5tb2RlbD1saXN0KGdhcmNoT3JkZXI9YygxLDEpKSwNCiAgICAgICAgICAgICAgICAgbWVhbi5tb2RlbD1saXN0KGFybWFPcmRlcj1jKGZpbmFsLm9yZGVyWzFdLCBmaW5hbC5vcmRlclszXSksIGluY2x1ZGUubWVhbj1UKSwNCiAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uLm1vZGVsPSJzZ2VkIikNCiAgICAgDQogICAgIGZpdCA9IHRyeUNhdGNoKA0KICAgICAgIHVnYXJjaGZpdCgNCiAgICAgICAgIHNwZWMsIHNwUmV0dXJuc09mZnNldCwgc29sdmVyID0gJ2h5YnJpZCcNCiAgICAgICApLCBlcnJvcj1mdW5jdGlvbihlKSBlLCB3YXJuaW5nPWZ1bmN0aW9uKHcpIHcNCiAgICAgKQ0KICAgICAgICAgIGlmKGlzKGZpdCwgIndhcm5pbmciKSkgew0KICAgICAgIGZvcmVjYXN0c1tkKzFdID0gcGFzdGUoaW5kZXgoc3BSZXR1cm5zT2Zmc2V0W3dpbmRvd0xlbmd0aF0pLCAxLCBzZXA9IiwiKQ0KICAgICAgIHByaW50KHBhc3RlKGluZGV4KHNwUmV0dXJuc09mZnNldFt3aW5kb3dMZW5ndGhdKSwgMSwgc2VwPSIsIikpDQogICAgIH0gZWxzZSB7DQogICAgICAgZm9yZSA9IHVnYXJjaGZvcmVjYXN0KGZpdCwgbi5haGVhZD0xKQ0KICAgICAgIGluZCA9IGZvcmVAZm9yZWNhc3Qkc2VyaWVzRm9yDQogICAgICAgZm9yZWNhc3RzW2QrMV0gPSBwYXN0ZShjb2xuYW1lcyhpbmQpLCBpZmVsc2UoaW5kWzFdIDwgMCwgLTEsIDEpLCBzZXA9IiwiKQ0KICAgICAgIHByaW50KHBhc3RlKGNvbG5hbWVzKGluZCksIGlmZWxzZShpbmRbMV0gPCAwLCAtMSwgMSksIHNlcD0iLCIpKSANCiAgICAgfQ0KfQ0Kd3JpdGUuY3N2KGZvcmVjYXN0cywgZmlsZT0iZm9yZWNhc3RzX3Rlc3QuY3N2Iiwgcm93Lm5hbWVzPUZBTFNFKQ0KYGBgDQoNCmBgYHtyfQ0KIyBJbnB1dCB0aGUgUHl0aG9uLXJlZmluZWQgQ1NWIGZpbGUNCnNwQXJpbWFHYXJjaCA9IGFzLnh0cyggDQogIHJlYWQuem9vKA0KICAgIGZpbGU9ImZvcmVjYXN0c19uZXcuY3N2IiwgZm9ybWF0PSIlWS0lbS0lZCIsIGhlYWRlcj1GLCBzZXA9IiwiDQogICkNCikNCiMgQ3JlYXRlIHRoZSBBUklNQStHQVJDSCByZXR1cm5zDQpzcEludGVyc2VjdCA9IG1lcmdlKCBzcEFyaW1hR2FyY2hbLDFdLCBzcFJldHVybnMsIGFsbD1GICkNCnNwQXJpbWFHYXJjaFJldHVybnMgPSBzcEludGVyc2VjdFssMV0gKiBzcEludGVyc2VjdFssMl0NCg0KIyBDcmVhdGUgdGhlIGJhY2t0ZXN0cyBmb3IgQVJJTUErR0FSQ0ggYW5kIEJ1eSAmIEhvbGQNCnNwQXJpbWFHYXJjaEN1cnZlID0gbG9nKCBjdW1wcm9kKCAxICsgc3BBcmltYUdhcmNoUmV0dXJucyApICkNCnNwQnV5SG9sZEN1cnZlID0gbG9nKCBjdW1wcm9kKCAxICsgc3BJbnRlcnNlY3RbLDJdICkgKQ0Kc3BDb21iaW5lZEN1cnZlID0gbWVyZ2UoIHNwQXJpbWFHYXJjaEN1cnZlLCBzcEJ1eUhvbGRDdXJ2ZSwgYWxsPUYgKQ0KDQojIFBsb3QgdGhlIGVxdWl0eSBjdXJ2ZXMNCnh5cGxvdCggDQogIHNwQ29tYmluZWRDdXJ2ZSwNCiAgc3VwZXJwb3NlPVQsDQogIGNvbD1jKCJkYXJrcmVkIiwgImRhcmtibHVlIiksDQogIGx3ZD0yLA0KICBrZXk9bGlzdCggDQogICAgdGV4dD1saXN0KA0KICAgICAgYygiQVJJTUErR0FSQ0giLCAiQnV5ICYgSG9sZCIpDQogICAgKSwNCiAgICBsaW5lcz1saXN0KA0KICAgICAgbHdkPTIsIGNvbD1jKCJkYXJrcmVkIiwgImRhcmtibHVlIikNCiAgICApDQogICkNCikNCmBgYA0KDQo=