library(randomForest) #алгоритм предварительной обработки цен #0: без изменений #1: шкалирование в 0-1 #2: приросты DATA_PREPARATION_TYPE <- 1 #сколько бар используется в каждом обучающем примере BARS_PER_SAMPLE <- 400 #примерно 4 месяца данных на обучение TRAIN_NROW <- round(252 * 24 / 12 * 4) #1 неделя на торговлю на новых данных FRONTTEST_NROW <- 24 * 5 #сколько раз создавать модели со случайными параметрами на данных из случайного отрезка времени N_TEST <- 1000 ratesTable <- read.csv("eurusd_h1_4y.csv", sep = ";") target <- c(diff(ratesTable[, "Open"]), 0) #Если бы использовалось что-то из High,Low,Close - цель должа бы отставать на 2 бара, так как текущий бар не до конца сформирован, и содержит правильной только цену открытия. #Предсказания на новых данных следовало бы делать используя предпоследний бар #target <- c(diff(ratesTable[,"Open"])[-1], 0, 0) target[target >= 0] <- 1 target[target < 0] <- 0 ratesTable <- data.frame(open = ratesTable[, "Open"], target) trainTable <- matrix(NA, nrow = nrow(ratesTable) - BARS_PER_SAMPLE + 1, ncol = BARS_PER_SAMPLE + 1) for (ratesTableRowIt in BARS_PER_SAMPLE:nrow(ratesTable)) { startRow <- ratesTableRowIt - BARS_PER_SAMPLE + 1 endRow <- ratesTableRowIt trainTable[ratesTableRowIt - BARS_PER_SAMPLE + 1, 1:BARS_PER_SAMPLE] <- ratesTable[startRow:endRow, "open"] trainTable[ratesTableRowIt - BARS_PER_SAMPLE + 1, BARS_PER_SAMPLE + 1] <- ratesTable[ratesTableRowIt, "target"] } Normalize_0_1 <- function(data) { dataMin <- min(data) dataMax <- max(data) return((data - dataMin) / (dataMax - dataMin)) } if (DATA_PREPARATION_TYPE == 1) { for (trainTableRowIt in 1:nrow(trainTable)) { trainTable[trainTableRowIt, 1:BARS_PER_SAMPLE] <- Normalize_0_1(trainTable[trainTableRowIt, 1:BARS_PER_SAMPLE]) } } else if (DATA_PREPARATION_TYPE == 2) { for (trainTableRowIt in 1:nrow(trainTable)) { trainTable[trainTableRowIt, 2:BARS_PER_SAMPLE] <- diff(trainTable[trainTableRowIt, 1:BARS_PER_SAMPLE]) trainTable[trainTableRowIt, 1] <- 0 } } trainTable <- as.data.frame(trainTable) colnames(trainTable) <- c(paste0("open", BARS_PER_SAMPLE:1), "target") #функция принимает данные, и возварщает обученную модель. Сюда для исследвания нужно подставлять разные алгоритмы обучения TrainModel <- function(data, modelParameter1, modelParameter2) { tryCatch({ model <- randomForest(target ~ ., data = data, ntree = modelParameter1, mtry = modelParameter2) # #например нейронка вместо леса # library(nnet) # model <- # nnet( # x = data[, 1:(ncol(data) - 1)], # y = data[, ncol(data)], # entropy = TRUE, # maxit = modelParameter1, # MaxNWts = 1000000, # skip = (modelParameter2 == 1), # size = modelParameter2-1, # trace = FALSE # ) return(model) }, error = function(e) { }) return(NULL) } scoreTable <- matrix(NA, ncol=2, nrow=0) for (testIt in 1:N_TEST) { trainStartIndex <- round(runif( 1, min = 1, max = nrow(trainTable) - TRAIN_NROW - FRONTTEST_NROW + 1 )) trainEndIndex <- trainStartIndex + TRAIN_NROW - 1 fronttestStartIndex <- trainEndIndex + 1 fronttestEndIndex <- fronttestStartIndex + FRONTTEST_NROW - 1 modelParam1 <- round(runif(1, min = 1, max = 10)) modelParam2 <- round(runif(1, min = 1, max = 5)) model <- TrainModel(trainTable[trainStartIndex:trainEndIndex,], modelParam1, modelParam2) if(is.null(model)){ next } predictionForTrain <- predict(model, trainTable[trainStartIndex:trainEndIndex,]) predictionForTrain[predictionForTrain >= 0.5] <- 1 predictionForTrain[predictionForTrain < 0.5] <- 0 accuracyForTrain <- mean(predictionForTrain == trainTable[trainStartIndex:trainEndIndex, BARS_PER_SAMPLE+1]) predictionForFronttest <- predict(model, trainTable[fronttestStartIndex:fronttestEndIndex,]) predictionForFronttest[predictionForTrain >= 0.5] <- 1 predictionForFronttest[predictionForTrain < 0.5] <- 0 accuracyForFronttest <- mean(predictionForFronttest == trainTable[fronttestStartIndex:fronttestEndIndex, BARS_PER_SAMPLE+1]) scoreTable <- rbind(scoreTable, c(accuracyForTrain, accuracyForFronttest)) cat("Test", testIt, "result:", accuracyForTrain, "/", accuracyForFronttest, "\n") } #Результат близкий к 0 - плохо #Близкий к -1 или 1 - хорошо cat("Train and fronttest correlation: ", cor(scoreTable)[1,2], "\n")