В этом посте я хочу поделиться тем, как мы можем использовать алгоритмы машинного обучения, особенно те, которые подходят для задач классификации, чтобы предсказать направление рынка на следующий день. Да, я имею в виду только направление цены следующего дня, а не следующий месяц или следующие 6 месяцев. Причина, по которой я сосредотачиваюсь на таком маленьком временном горизонте, заключается в том, что теоретически должно быть легче прогнозировать краткосрочную перспективу, а не среднесрочную или долгосрочную. Давайте прыгнем в него.

https://www.udemy.com/classification-based-machine-learning-for-trading-in-r/?couponCode=ML4T999

Я буду использовать данные по фьючерсам на легкую нефть. У меня есть данные, загруженные из файла csv. Данные содержат дневную цену открытия, максимум, минимум и цену закрытия фьючерсов на сырую нефть (CL на Nymex). Затем я форматирую или изменяю фрейм данных в xts (конкретный формат временных рядов), чтобы построить его с помощью функции построения графика свечей из пакета Quantmod.

library(tidyverse)
library(lubridate)
library(quantmod)
library(ggplot2)
price <- read.csv("wtiDaily.csv")
setup_data <- function(pricedata) {
#Small function to format the data into xts format
names(pricedata) <- c("Date", "Open", "High", "Low", "Close")
dates <- parse_date_time(x = pricedata[,1], "mdy_HM", truncated = 3)
pricedata <- pricedata[,2:5]
pricedata <- xts(pricedata, order.by = dates)
}
price <- setup_data(price)
ema7 <- EMA(price$Close, n = 7)
ema20 <- EMA(price$Close, n = 20)
ema50 <- EMA(price$Close, n = 50)
ema70 <- EMA(price$Close, n = 70)

После форматирования данных я использую функцию chartSeries для построения данных.

chartSeries(price, TA=NULL, subset = '2017-06::')
addEMA(n = 7,col = "orange")
addEMA(n = 20,col = "red"

Теперь, когда у меня есть график, мне нужно объяснить, как я планирую использовать машинное обучение для прогнозирования направления цены на следующий день. Еще одно высказывание, это также предсказание типа свечи следующего дня. Поскольку ежедневная бычья/зеленая свеча эквивалентна повышению цены в этот день, а медвежья/красная свеча эквивалентна снижению цены в этот день; Это означает, что я буду предсказывать, будет ли свеча следующего дня бычьей или медвежьей. Чтобы сделать это, глядя на график выше, моя гипотеза заключается в том, что если я использую некоторые переменные в качестве переменных-предикторов или функций в моем алгоритме машинного обучения, я должен быть в состоянии достаточно хорошо предсказать свечу следующего дня и, следовательно, иметь растущую кривую капитала. . Для переменных или функций я буду использовать следующее:

  • Цена закрытия относительно экспоненциальной скользящей средней за последние 7 периодов
  • тип сегодняшней свечи (бычья или медвежья)
  • тип свечи предыдущего дня (бычья или медвежья)
  • ежедневный доход
#Defining the individual features/variables
candle.type.current <- data.frame(ifelse( price$Close > price$Open, "bull", "bear"))
candle.type.previous <- data.frame(lag(candle.type.current$Close, n = 1))
candle.next.day <- data.frame(lead(candle.type.current$Close, n = 1))
position.to.ema7 <- data.frame(ifelse(price$Close > ema7, "above", "below"))
dailywin <- data.frame(abs(price$Close - price$Open))
candle.nextday.win <- lead(dailywin$Close, 1)
#Making up the dataframe with all the features as columns
dailyprice <- data.frame(candle.type.current,candle.type.previous, 
			position.to.ema7, dailywin, 
			candle.nextday.win, candle.next.day)
# naming the dataframe columns
names(dailyprice) <- c("candle.type.current", "candle.type.previous",
			"position.to.ema7", "dailywin", 
			"candle.nextday.win","candle.next.day")
#filtering out the data with  NAs
dailyprice <- slice(dailyprice, 7:length(dailyprice$candle.type.previous))

После определения функций я разделяю данные на обучающий и тестовый наборы. Данные содержат около 500 наблюдений (Торговые дни с июня 2017 г. по август 2018 г.). Я использую 300 точек данных в качестве обучающего набора, а остальные — в качестве тестового набора. Я также создаю «формулу», указывающую, что является моей целевой переменной (что я пытаюсь предсказать) и функции.

#Splitting the data into training and testing
testRange <- 300:500
trainRange <- 1:300
test <- dailyprice[testRange,]
train <- dailyprice[trainRange,]
#Defining the formula: Target variables and predictors
target <- "candle.next.day"
predictors.variable <- c("candle.type.current", "candle.type.previous",
"position.to.ema7", "dailywin")
predictors <- paste(predictors.variable, collapse = "+")
formula <- as.formula(paste(target, "~", predictors, sep = ""))
#function for processing predictions
predictedReturn <- function(df, pred){
df$pred <- pred
df$prediReturn <- ifelse(df$candle.next.day != df$pred, -df$candle.nextday.win, df$candle.nextday.win)
df$cumReturn <- cumsum(df$prediReturn)
return(df)
}

Теперь давайте продолжим и обучим нашу модель машинного обучения. Здесь я тренирую наивный байесовский алгоритм (Подробнее о наивном байесовском алгоритме).»

library(naivebayes)
# Naivebayes model
nb <- naive_bayes(formula, data = train)
plot(nb)
# Prediction
nb.pred <- predict(nb, test)
nb.test <- predictedReturn(test, nb.pred)
#Plotting the net daily returns and cumulative returns
plot(nb.test$prediReturn, type = "line")
plot(nb.test$cumReturn, type = "line")
#Confusion matrix
confusionMatrix.nb <- table(nb.test$candle.next.day, nb.test$pred)
print(confusionMatrix.nb)
#Calculating accuracy
nb.misclserror <- mean(nb.test$candle.next.day != nb.test$pred)
print(paste("Accuracy", 1-nb.misclserror))

Так что оценка модели на тестовом наборе не разочаровывает. Он возвращает точность 57%, что, хотя и может показаться низким, является неплохим результатом на торговой арене для такого ограниченного объема данных. Очевидно, следует проводить больше проверочных тестов, меняя окно обучения и тестирования, проводить более серьезную перекрестную проверку и в идеале использовать больше данных. Тем не менее, кривая собственного капитала выглядит интересно, она идет вверх (деньгиииииииии). Мы не должны недооценивать масштабы просадок, но я могу сказать, что это выглядит хорошо.

bear bull
  bear   24   59
  bull   28   90
[1] "Accuracy 0.567

Я более подробно объясню, как добавить дополнительные функции, а также протестировать другие алгоритмы машинного обучения на основе классификации, чтобы предсказать цену на следующий день на Udemy. Я чувствовал, что мне нужно создать курс, чтобы поделиться этими знаниями и помочь другим создавать свои собственные торговые стратегии с использованием машинного обучения с помощью R. Доступ к курсу можно получить со скидкой: нажмите здесь