Блог им. SciFi

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

    • 09 мая 2016, 13:48
    • |
    • SciFi
  • Еще
В последнее время изучаю R и машинное обучение. 

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

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

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

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

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

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

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

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

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

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

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

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

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

Там, где Conditional Probabilites, так как CrossEMA числовое значение, в первом столбце [,1] отображается среднее значение CrossEMA, а во втором — среднекв. отклонение. 

Когда я добавил EMA(20) — EMA(10), то есть сделал модель с тремя скользящими средними, и убрал дни недели, результаты улучшились. 
predicted   DOWN       UP
     DOWN    14        11
       UP    58        80


Таким образом, использованием трех скользящих средних лучше, чем двух. А вот учет дней недель не дает улучшения результата. 

Код на 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")
# Дает доступ к алгоритму наивного байесовского классификатора
★31
5 комментариев
Если я понял правильно, вы тестируете на полной выборке с матожиданием лонга 3.4 к 1
При этом по сигналам вы получили матожидание 4.53 и 2.79
Это сравнимые между собой и значимые результаты.
Только подобный анализ имеею другую проблему. Нам нужно не матожидание движения как такового, а матожидание достижения определенного уровня ДО достижения уровня2.
Иначе практической пользы от исследования нет.
avatar
Quant-Invest, да, видимо, тренд по машкам не дает смещение в плане количества дней в лонг или шорт. На этой выборке при этой фазе рынка в целом актив рос и поэтому предсказания лонгов срабатывали бы. Но мы не знаем, что будет в следующей фазе рынка. То, что тренд не дает смещение по количеству дней, может быть связано с тем, что доходности описываются нормальным распределением. И вряд ли во время лонг тренда или шорт тренда мы будем получать существенное отклонение от нормального распределение. Думаю, тут нужно смотреть не на то, растет или падает актив, а на сколько он растет или падает в зависимости от прогноза. Моя цель здесь была не столько показать работающую закономерность, сколько показать пример использования байесовского классификатора.  
avatar
SciFi, вы уже получили значимое смещение, матожидание в данном случае можно принять за ноль и сравнивать разницу. Либо наложите гауссиану с матожиданием за период и анализируйте разницу от нее, непример.

За примеры спасибо, плюсик вам в карму :)
Главное — то, что получили смещение матожидания в обоих случаях, а следовательно, модель обладает предсказательной силой (упрощенно, конечно… нужно еще блуждание посчитать, но не все сразу...)
avatar
Есть ощущение, что применение Баесовского подхода в данном случае просто переформулировка сущностей, не меняющая сути зависимостей между ними. 
Существование трендов вместо использования EMA можно увидеть на статистике последовательных свечей. Выбирается тф от минуты до десятков минут, задаётся минимальное тело. После свечи с телом не менее минимального следует свеча такого же цвета с телом не менее минимального гораздо чаще 50%. Если тф не слишком велик.
Идея с подсчётом статистики достижений одного уровня раньше другого тоже хорошая.
avatar
я правильно понимаю, стратегия была переворотная?
avatar

теги блога SciFi

....все тэги



UPDONW
Новый дизайн