В последнее время изучаю R и машинное обучение.
Мои статьи про R, машинное обучение, количественный анализ
В этом посте я расскажу о том, как применить машинное обучение для поиска закономерностей и прогнозирования.
Использовал эту статью:
Применение машинного обучения в трейдинге
Начнем с проверки того, работают ли тренды и как влияет день недели на направление движения цены. И если работают, насколько они смещают вероятность в нашу сторону. Применим для этого наивный байесовский классификатор.
Теорема Байеса в теории вероятностей, как теорема Пифагора в геометрии.
Байесовская вероятность — это интерпретация понятия вероятности, используемая в байесовской теории. Вероятность определяется как степень уверенности в истинности суждения. Для определения степени уверенности в истинности суждения при получении новой информации в байесовской теории используется теорема Байеса.
Вывод формулы очень простой.
Если B влияет на А, можно сначала посчитать какие были B при каких А, а затем это использовать, чтобы предсказать, какое А будет при каком B.
Я научился использовать наивный байесовский классификатор на языке R. Он хорош для выявления закономерностей, которые не могут быть найдены аналитически, и для прогнозирования хаоса, в котором будущее определяется назависимыми друг от друга факторами.
Актив: пара доллар-рубль с начала 2014 по конец 2015 года.
Проверяемые факторы: тренд и день недели.
Критерий тренда: EMA(5), EMA(10) на дневке.
Что пытаемся предсказывать: направление движения цены внутри дня.
Результаты:
Объяснение:
На выборке 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")
# Дает доступ к алгоритму наивного байесовского классификатора
При этом по сигналам вы получили матожидание 4.53 и 2.79
Это сравнимые между собой и значимые результаты.
Только подобный анализ имеею другую проблему. Нам нужно не матожидание движения как такового, а матожидание достижения определенного уровня ДО достижения уровня2.
Иначе практической пользы от исследования нет.
За примеры спасибо, плюсик вам в карму :)
Главное — то, что получили смещение матожидания в обоих случаях, а следовательно, модель обладает предсказательной силой (упрощенно, конечно… нужно еще блуждание посчитать, но не все сразу...)
Существование трендов вместо использования EMA можно увидеть на статистике последовательных свечей. Выбирается тф от минуты до десятков минут, задаётся минимальное тело. После свечи с телом не менее минимального следует свеча такого же цвета с телом не менее минимального гораздо чаще 50%. Если тф не слишком велик.
Идея с подсчётом статистики достижений одного уровня раньше другого тоже хорошая.