# Library
run_librarys <- function() {
library(readxl)
library(readr)
library(quantmod)
library(xts)
library(zoo)
library(forecast)
#library(quantstrat)
#library(Quandl)
#library(PerformanceAnalytics)
library(TTR)
library(caret)
library(nnet)
print("end........")
}
run_librarys()
## Warning: package 'readxl' was built under R version 3.5.1
## Warning: package 'quantmod' was built under R version 3.5.1
## Loading required package: xts
## Warning: package 'xts' was built under R version 3.5.1
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Loading required package: TTR
## Warning: package 'TTR' was built under R version 3.5.1
## Version 0.4-0 included new data defaults. See ?getSymbols.
## Warning: package 'forecast' was built under R version 3.5.1
## Warning: package 'caret' was built under R version 3.5.1
## Loading required package: lattice
## Loading required package: ggplot2
## Warning: package 'nnet' was built under R version 3.5.1
## [1] "end........"
# load data
data<-read_delim("C:/Users/Sergio Mora/Desktop/Motor/Inversion/files/Master_r/2078OT_10_Codes/Bitcoin.csv",
";", escape_double = FALSE, trim_ws = TRUE)
## Parsed with column specification:
## cols(
## Date = col_character(),
## Open = col_number(),
## High = col_number(),
## Low = col_number(),
## Close = col_number(),
## Volume = col_character(),
## `Market Cap` = col_character()
## )
data2<-data[order(as.Date(data$Date, format="%Y-%m-%d")),]
price<-(data2$Close)
HLC<-matrix(c(data2$High, data2$Low, data2$Close),nrow=length(data2$High))
# calculate log returns
bitcoin.lr<-diff(log(price))
# generate technical indicators
rsi<-RSI(price)
MACD <- MACD(price)
macd<-MACD[,1]
will<-williamsAD(HLC)
cci<-CCI(HLC)
STOCH<-stoch(HLC)
stochK<-STOCH[,1]
stochD<-STOCH[,1]
# create the Input and Target matrix for training and validation dataset
Input<-matrix(c(rsi[700:939], cci[700:939], macd[700:939], will[700:939], stochK[700:939], stochD[700:939]),nrow=240)
Target<-matrix(c(bitcoin.lr[701:940]), nrow=240)
trainingdata <- cbind(Input,Target)
colnames(trainingdata) <- c("RSI","CCI","MACD","WILL","STOCHK","STOCHD", "Return")
# split the dataset 90-10% ratio
trainIndex <- createDataPartition(bitcoin.lr[701:940], p=.9, list=F)
bitcoin.train <- trainingdata[trainIndex, ]
bitcoin.test <- trainingdata[-trainIndex, ]
# derive the best neural network model using rmse criteria
best.network<-matrix(c(5,0.5))
best.rmse<-1
for (i in 5:15) for (j in 1:3) {
bitcoin.fit <- nnet(Return ~ RSI + CCI + MACD + WILL + STOCHK + STOCHD, data = bitcoin.train,
maxit=1000, size=i, decay=0.01*j, linout = 1)
bitcoin.predict <- predict(bitcoin.fit, newdata = bitcoin.test)
bitcoin.rmse <- sqrt(mean((bitcoin.predict - bitcoin.lr[917:940])^2))
if (bitcoin.rmse<best.rmse) {
best.network[1,1]<-i
best.network[2,1]<-j
best.rmse<-bitcoin.rmse
}
}
## # weights: 41
## initial value 266.890991
## iter 10 value 233.818249
## final value 233.817935
## converged
## # weights: 41
## initial value 233.942571
## iter 10 value 233.821446
## iter 20 value 233.818712
## final value 233.818682
## converged
## # weights: 41
## initial value 273.695328
## final value 233.818681
## converged
## # weights: 49
## initial value 1103.542336
## final value 233.818679
## converged
## # weights: 49
## initial value 531.459644
## iter 10 value 233.818139
## iter 20 value 232.051909
## iter 30 value 229.536279
## iter 40 value 229.289255
## iter 50 value 229.282123
## final value 229.282114
## converged
## # weights: 49
## initial value 234.637656
## iter 10 value 233.821429
## iter 20 value 233.818712
## final value 233.818681
## converged
## # weights: 57
## initial value 237.596638
## iter 10 value 233.817962
## iter 20 value 230.970030
## iter 30 value 227.857284
## iter 40 value 227.679425
## final value 227.674986
## converged
## # weights: 57
## initial value 680.907518
## final value 233.818364
## converged
## # weights: 57
## initial value 367.037755
## final value 233.818681
## converged
## # weights: 65
## initial value 272.910187
## final value 233.818679
## converged
## # weights: 65
## initial value 525.073248
## iter 10 value 233.818749
## final value 233.818678
## converged
## # weights: 65
## initial value 347.551427
## iter 10 value 233.818418
## iter 20 value 233.769442
## iter 30 value 229.463786
## iter 40 value 229.324442
## iter 50 value 229.224149
## iter 60 value 229.028614
## iter 70 value 228.699111
## iter 80 value 228.678192
## iter 90 value 227.725795
## iter 100 value 224.206534
## iter 110 value 223.311074
## iter 120 value 222.953551
## iter 130 value 222.905749
## iter 140 value 222.821539
## iter 150 value 222.820680
## iter 160 value 222.819444
## iter 170 value 222.816097
## final value 222.816059
## converged
## # weights: 73
## initial value 508.007233
## iter 10 value 233.818695
## final value 233.818678
## converged
## # weights: 73
## initial value 572.180428
## iter 10 value 233.818821
## final value 233.818679
## converged
## # weights: 73
## initial value 234.211512
## iter 10 value 233.818742
## iter 20 value 233.815020
## iter 30 value 231.731637
## iter 30 value 231.731635
## iter 40 value 230.927295
## iter 50 value 230.745505
## iter 60 value 230.591331
## iter 70 value 230.055227
## iter 80 value 226.858973
## iter 90 value 225.388468
## iter 100 value 221.713226
## iter 110 value 218.941074
## iter 120 value 218.872590
## iter 130 value 218.846823
## iter 140 value 218.380438
## iter 150 value 217.882419
## iter 160 value 214.282845
## iter 170 value 210.518316
## iter 180 value 208.198031
## iter 190 value 207.994584
## iter 200 value 206.493756
## iter 210 value 204.967228
## iter 220 value 204.398724
## iter 230 value 204.363648
## iter 230 value 204.363647
## final value 204.363159
## converged
## # weights: 81
## initial value 276.364747
## iter 10 value 233.817383
## iter 20 value 231.864501
## iter 30 value 229.672649
## iter 40 value 229.380097
## iter 50 value 229.338087
## iter 60 value 229.271679
## iter 70 value 229.262297
## iter 80 value 229.255790
## final value 229.255775
## converged
## # weights: 81
## initial value 417.902490
## final value 233.818679
## converged
## # weights: 81
## initial value 1082.321485
## iter 10 value 233.818433
## final value 233.818260
## converged
## # weights: 89
## initial value 241.758710
## iter 10 value 233.818723
## iter 20 value 233.817749
## iter 30 value 232.059797
## iter 40 value 230.141174
## iter 50 value 228.235130
## iter 60 value 228.116991
## iter 70 value 227.786234
## iter 80 value 227.672459
## iter 90 value 227.670491
## iter 100 value 227.642946
## iter 110 value 227.540674
## iter 120 value 224.299433
## iter 130 value 219.640505
## iter 140 value 217.666936
## iter 150 value 217.577991
## final value 217.577814
## converged
## # weights: 89
## initial value 483.027846
## final value 233.818679
## converged
## # weights: 89
## initial value 236.097307
## iter 10 value 233.818687
## final value 233.818681
## converged
## # weights: 97
## initial value 1493.793866
## final value 233.818519
## converged
## # weights: 97
## initial value 245.284496
## iter 10 value 233.818692
## final value 233.818679
## converged
## # weights: 97
## initial value 264.747442
## final value 233.818680
## converged
## # weights: 105
## initial value 234.174387
## iter 10 value 233.820983
## final value 233.818683
## converged
## # weights: 105
## initial value 741.106451
## iter 10 value 233.818686
## final value 233.818679
## converged
## # weights: 105
## initial value 250.985220
## iter 10 value 233.822429
## iter 20 value 233.818723
## final value 233.818680
## converged
## # weights: 113
## initial value 731.117344
## iter 10 value 233.818168
## final value 233.818161
## converged
## # weights: 113
## initial value 611.188421
## iter 10 value 233.819059
## iter 20 value 233.818683
## iter 20 value 233.818682
## final value 233.818679
## converged
## # weights: 113
## initial value 244.830232
## iter 10 value 233.820012
## final value 233.818680
## converged
## # weights: 121
## initial value 1104.223262
## iter 10 value 233.818472
## iter 20 value 233.801945
## iter 30 value 232.200431
## iter 40 value 230.007180
## iter 50 value 229.500402
## iter 60 value 229.494875
## iter 70 value 229.490012
## final value 229.489664
## converged
## # weights: 121
## initial value 752.958308
## iter 10 value 233.817976
## iter 20 value 229.434646
## iter 30 value 229.330242
## iter 40 value 229.284575
## iter 50 value 229.282117
## iter 50 value 229.282116
## iter 50 value 229.282116
## final value 229.282116
## converged
## # weights: 121
## initial value 524.260823
## final value 233.818679
## converged
# create the Input and Target matrix for test
InputTest<-matrix(c(rsi[940:969], cci[940:969], macd[940:969], will[940:969], stochK[940:969], stochD[940:969]),nrow=30)
TargetTest<-matrix(c(bitcoin.lr[941:970]), nrow=30)
Testdata <- cbind(InputTest,TargetTest)
colnames(Testdata) <- c("RSI","CCI","MACD","WILL","STOCHK","STOCHD", "Return")
# fit the best model on test data
bitcoin.fit <- nnet(Return ~ RSI + CCI + MACD + WILL + STOCHK + STOCHD, data = trainingdata,
maxit=1000, size=best.network[1,1], decay=0.1*best.network[2,1], linout = 1)
## # weights: 41
## initial value 266.323201
## final value 265.732534
## converged
bitcoin.predict1 <- predict(bitcoin.fit, newdata = Testdata)
# repeat and average the model 20 times
for (i in 1:20) {
bitcoin.fit <- nnet(Return ~ RSI + CCI + MACD + WILL + STOCHK + STOCHD, data = trainingdata,
maxit=1000, size=best.network[1,1], decay=0.1*best.network[2,1], linout = 1)
bitcoin.predict<- predict(bitcoin.fit, newdata = Testdata)
bitcoin.predict1<-(bitcoin.predict1+bitcoin.predict)/2
}
## # weights: 41
## initial value 283.717703
## iter 10 value 265.732540
## iter 10 value 265.732537
## final value 265.732533
## converged
## # weights: 41
## initial value 524.888923
## iter 10 value 265.732533
## iter 10 value 265.732533
## iter 10 value 265.732533
## final value 265.732533
## converged
## # weights: 41
## initial value 285.284938
## final value 265.732534
## converged
## # weights: 41
## initial value 279.996955
## final value 265.732537
## converged
## # weights: 41
## initial value 320.456381
## final value 265.732536
## converged
## # weights: 41
## initial value 311.809020
## final value 265.732536
## converged
## # weights: 41
## initial value 269.816249
## final value 265.732533
## converged
## # weights: 41
## initial value 431.386551
## final value 265.732533
## converged
## # weights: 41
## initial value 381.931811
## final value 265.732533
## converged
## # weights: 41
## initial value 597.304127
## final value 265.732528
## converged
## # weights: 41
## initial value 287.511238
## final value 265.732533
## converged
## # weights: 41
## initial value 514.241642
## final value 265.732533
## converged
## # weights: 41
## initial value 282.220800
## iter 10 value 265.732538
## iter 10 value 265.732536
## final value 265.732536
## converged
## # weights: 41
## initial value 310.439251
## final value 265.732538
## converged
## # weights: 41
## initial value 798.495550
## final value 265.732532
## converged
## # weights: 41
## initial value 368.064606
## iter 10 value 265.732546
## final value 265.732533
## converged
## # weights: 41
## initial value 287.680885
## final value 265.732534
## converged
## # weights: 41
## initial value 267.296061
## final value 265.732534
## converged
## # weights: 41
## initial value 274.971498
## final value 265.732533
## converged
## # weights: 41
## initial value 266.261368
## final value 265.732527
## converged
# calculate the buy-and-hold benchmark strategy and neural network profit on the test dataset
money<-matrix(0,31)
money2<-matrix(0,31)
money[1,1]<-100
money2[1,1]<-100
for (i in 2:31) {
if (bitcoin.predict1[i-1]<0) {
direction1<--1
} else {
direction1<-1}
if (TargetTest[i-1]<0) {
direction2<--1
} else {
direction2<-1 }
if ((direction1-direction2)==0) {
money[i,1]<-money[i-1,1]*(1+abs(TargetTest[i-1]))
} else {
money[i,1]<-money[i-1,1]*(1-abs(TargetTest[i-1])) }
money2[i,1]<-100*(price[940+i-1]/price[940])
}
#plot benchmark and neural network profit on the test dataset
x<-1:31
matplot(cbind(money, money2), type = "l", xaxt = "n", ylab = "")
legend("topright", legend = c("Neural network","Benchmark"), pch = 19, col = c("black", "red"))
axis(1, at = c(1,10,20,30), lab = c("2014-04-08", "2014-04-17", "2014-04-27", "2014-05-07" ))
box()
mtext(side = 1, "Test dataset", line = 2)
mtext(side = 2, "Investment value", line = 2)
