В этом посте я хочу поделиться тем, как мы можем использовать алгоритмы машинного обучения, особенно те, которые подходят для задач классификации, чтобы предсказать направление рынка на следующий день. Да, я имею в виду только направление цены следующего дня, а не следующий месяц или следующие 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. Доступ к курсу можно получить со скидкой: нажмите здесь