iqoption

Применение наивного байесовского классификатора на R для поиска закономерностей и прогнозирования

В последнее время изучаю R и машинное обучение. 

Мои статьи про R, машинное обучение, количественный анализ

В этом посте я расскажу о том, как применить машинное обучение для поиска закономерностей и прогнозирования.

Использовал эту статью: Применение машинного обучения в трейдинге

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

Теорема Байеса в теории вероятностей, как теорема Пифагора в геометрии.

Байесовская вероятность — это интерпретация понятия вероятности, используемая в байесовской теории. Вероятность определяется как степень уверенности в истинности суждения. Для определения степени уверенности в истинности суждения при получении новой информации в байесовской теории используется теорема Байеса. 

Вывод формулы очень простой. 

Применение наивного байесовского классификатора на R для поиска закономерностей и прогнозирования

Если B влияет на А, можно сначала посчитать какие были B при каких А, а затем это использовать, чтобы предсказать, какое А будет при каком B.

Я научился использовать наивный байесовский классификатор на языке R. Он хорош для выявления закономерностей, которые не могут быть найдены аналитически, и для прогнозирования хаоса, в котором будущее определяется назависимыми друг от друга факторами.

Актив: пара доллар-рубль с начала 2014 по конец 2015 года. 
Проверяемые факторы: тренд и день недели.
Критерий тренда: EMA(5), EMA(10) на дневке. 
Что пытаемся предсказывать: направление движения цены внутри дня.

Результаты:
Применение наивного байесовского классификатора на R для поиска закономерностей и прогнозирования

Объяснение:
На выборке TrainingSet проводилось обучение модели. На выборке TestSet проводилась проверка прогноза. Как видно, шортить лучше всего было по средам, далее по вторникам. Хуже всего — по пятницам. Лонговать лучше всего было по пятницам, далее по вторникам. По понедельникам вероятность движения в любую сторону была одинакова. Что касается тренда, то при предсказании шорта 13 раз был шорт и 24 раза лонг. При предсказании лонга 59 раз был шорт и 67 раз лонг. То есть, во время лонгов торговля по тренду позволяла сместить вероятность в нашу сторону немного (процентов до 60 максимум). Во время шортов торговля по тренду не помогала. Чтобы лучше понять, что я делал, почитайте комментарии к коду. 

Код на R:

library("quantmod")
library("rusquant")
library("lubridate")
library("e1071")
# Подключение библиотек

startDate = as.Date("2014-01-01")
#Начало рассматриваемого промежутка

endDate = as.Date("2016-01-01")
#Конец рассматриваемого промежутка

getSymbols("USD000UTSTOM", src = "Finam", from = startDate, to = endDate)
#Получаем дневное OHLCV с Финама

PriceChange<- Cl(USD000UTSTOM) - Op(USD000UTSTOM)
#Находим разницу между ценой закрытия и ценой открытия.

Direction <- ifelse(PriceChange > 0, "UP", "DOWN")
#Реальное изменение цены, направление. Конвертируем в двоичную классификацию.

DayofWeek<-wday(USD000UTSTOM, label=TRUE)
#Находим день недели

EMA5 <- EMA(Op(USD000UTSTOM), n = 5)
#Мы рассчитываем 5-периодную EMA по цене открытия

EMA10 <- EMA(Op(USD000UTSTOM), n = 10)
#Затем 10-ти периодную EMA, так же по цене открытия

EMACross <- EMA5 - EMA10
#Положительные значения будут означать что EMA5 расположена на графике выше EMA10

EMACross <- round(EMACross, 2)
#Округляем значения до 2-х знаков после запятой

DataSet<-data.frame(DayofWeek, EMACross, Direction)
#Создаем наш набор данных: день недели, тренд, реальное направление движения цены

DataSet <- DataSet[-c(1:10),]
#Нам нужно удалить значения, в которых 10-периодная скользящая средняя все еще не рассчитана

TrainingSet <- DataSet[1:328,]
#Мы используем 2/3 данных для обучения модели

TestSet <- DataSet[329:492,]
#И 1/3 для тестирования модели

EMACrossModel <- naiveBayes(TrainingSet[,1:2], TrainingSet[,3])
#Теперь построим модель для предсказания направления цены в зависимости от тренда

table(predict(EMACrossModel, TestSet), TestSet[,3], dnn=list('predicted','actual'))
#Теперь протестируем модель

Предварительно нужно установить библиотеки:
getwd()
# Проверка рабочей папки

install.packages("quantmod")
# Установка пакета quantmod

install.packages("rusquant", repos="http://R-Forge.R-project.org")
# Установка пакета rusquant

install.packages("lubridate")
# Упрощает работу с датами

install.packages("e1071")
# Дает доступ к алгоритму наивного байесовского классификатора