# 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)