uralpro
uralpro личный блог
29 мая 2015, 11:12

Введение в машинное обучение. Часть 2

blogML2Main

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

Что представляет собой наивный байесовский классификатор (НБК)?

НБК старается найти вероятность события А при условии, что событие В уже произошло, обзначаемую как Р(А|B) (вероятность А при условии В).

В нашем случае, мы должны спросить: какова вероятность того, что  цена возрастет, при условии, что сегодня — среда? НБК берет во внимание обе вероятности — общую вероятность роста цены, то есть число дней, когда цена закрытия была выше цены открытия относительно всех рассматриваемых дней, и вероятность роста цены при условии, что сегодня среда, то есть сколько прошедших сред имело цену закрытия выше цены открытия?

Тогда возможно будет сравнить вероятность роста цены с вероятностью ее падения, и выбрать большую для нашего предсказания.

Пока мы говорили только об одном индикаторе, если же их будет несколько, математические выкладки резко усложнятся. Для того, чтобы обойти это, НБК рассматривает каждый индикатор как независимый, или некореллированный с другими. Таким образом, очень важно выбирать некореллированые между собой  индикаторы. На практике, в НБК не определяется некореллированость используемых индикаторов ( например, если сегодня среда и RSI выше 75, есть высокая вероятность, что на следующий день цена упадет), но модель работает относительно хорошо, даже если небольшая корреляция присутствует.

Этот очень упрощенный обзор наивного байесовского классификатора должен донести до вас основные принципы его работы. Если вы хотите получить более глубокие знания по НБК и другим алгоритмам машинного обучения — здесь хороший источник.

Пошаговый пример на языке R.

Разберем очень простой пример на R. Будем использовать день недели для предсказания, где будет цена акций Apple на закрытии дня — выше или ниже текущей.

Сначала загружаем необходимые библиотеки:

install.packages("quantmod")
library("quantmod")
#позоляют импортировать нужные данные

install.packages("lubridate")
library("lubridate")
#делают работу с датами легче

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

Затем, получаем все нужные данные:

startDate = as.Date("2012-01-01")
# Дата начала диапазона данных

endDate = as.Date("2014-01-01")
# Дата окончания диапазона данных

getSymbols("AAPL", src = "yahoo", from = startDate, to = endDate)
# Получаем дневные бары Apple из Yahoo Finance 

Сейчас мы имеем все необходимые данные, получим наш индикатор — день недели:

DayofWeek<-wday(AAPL, label=TRUE)
#Find the day of the week

Далее- то что нам нужно предсказать, закрытие дня — вверх или вниз, и создание окончательного набора данных:

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

Class<-ifelse(PriceChange>0,"UP","DOWN")
#Преобразуем в двоичную классификацию. (в нашем наборе данных нет баров с нулевым изменением цены, для упрощения, они исключены)

DataSet<-data.frame(DayofWeek,Class)
#Создаем наш набор данных 

Наконец, все готово для использования НБК:

MyModel< -naiveBayes(DataSet[,1],DataSet[,2])
#Вход, или независимая переменная(DataSet,1]), и то, что мы пытаемся предсказать,зависимая переменная (DataSet[,2]). 

Поздравляем! Только что мы применили алгоритм машинного обучения для анализа акций Apple. Теперь посмотрим в результаты:

R1

На рисунке мы видим вероятность роста или снижения цены для исходного набора данных (априорная вероятность). Отметим небольшой перевес в сторону снижения цены.

R2

Рисунок выше показывает условные вероятности ( при условии определенного дня недели, вероятность снижения или роста цены). Все они значительно меньше 50%, так как отсчитываются от априорной вероятности исхода ( вероятности роста цены для всего набора данных).

Заметно, что наша модель не очень хороша, так как мы не получили высоких значений вероятности. Тем не менее, можно отметить, что будет значительно лучше входить в длинную позицию в начале недели и в короткую — в конце.

Улучшение модели.

Очевидно, нам нужна более сложная стратегия, чем просто смотреть на день недели. Добавим пересечение скользящих средних в нашу модель ( вы можете получить больше информации о добавлении других индикаторов в модель здесь).

Автор предпочитает использование экспоненциальных скользящих средних, возьмем пересечение 5 и 10 периодных EMA.

Сначала вычислим EMA:

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

EMA10<-EMA(Op(AAPL),n = 10)
#Вычисляем 10-периодную EMA по ценам открытия

Вычисляем пересечение средних:

EMACross <- EMA5 - EMA10
#Положительные величины соответствуют превышению значения 5-периодной EMA над 10-периодной

Округляем величины до 2 знаков после запятой. Это важно, потому что если возникнет состояние, которое НБК еще не встречал, это автоматически приравняет вероятность к 0%. Например, если мы вычислим пересечение EMA  с 6 знаками после запятой, и будет найдена высокая вероятность снижения цены при значении 2.349181, а затем возникнет точка в данных, где пересечение равно 2.349182, это приведет к 0 вероятности события роста или снижения цены. Округляя до 2 знаков, мы значительно снижаем такой риск на достаточно больших выборках. Это важное ограничение, которое нужно запомнить при построении ваших собственных моделей.

EMACross<-round(EMACross,2)

Далее создадим новый набор данных и разделим его на тренировочную и тестовую выборки, чтобы проверить, насколько хорошо модель работает на новых данных:

DataSet2<-data.frame(DayofWeek,EMACross, Class)
DataSet2<-DataSet2[-c(1:10),]
#Нам нужно исключить вхождения, где 10 периодная средняя уже вычислена
TrainingSet<-DataSet2[1:328,]
#Мы используем часть данных для тренировочной выборки
TestSet<-DataSet2[329:492,]
#и часть для тестовой выборки

И строим нашу модель:

EMACrossModel<-naiveBayes(TrainingSet[,1:2],TrainingSet[,3]) 

Для  переменной условной вероятности пересечения EMA, вычисляется средняя величина для каждого случая ([,1])  и среднеквадратичное отклонение ([,2]). Мы можем видеть, что средняя разница между 5 периодной EMA и 10-периодной EMA для длинных и коротких сделок получилось 0.54 и -0.24 соответственно.

И тестируем на новых данных (тестовая выборка):

table(predict(EMACrossModel,TestSet),TestSet[,3],dnn=list('predicted','actual'))

Мы получаем, что в 79 из 164 случаев пересечение средних предсказывает верное направление цены, что составляет 48% от всей выборки. Из всей выборки в 95 случаях, или 58%, было предсказано снижение цены.

Результаты нашей модели не очень впечатляют, но целью данной статьи является предоставление информации о том, как построить собственную стратегию машинного обучения. Надеемся, что вы разработаете алгоритм с более высокими вероятностями предсказания, используя другой набор индикаторов, лучше объясняющих состояние рынка.

Другие стратегии, применяемые в алгоритмической торговле и биржевых роботах смотрите в моем блоге и на сайте.

26 Комментариев
  • Watcher
    29 мая 2015, 11:21
    Спасибо!
  • gry
    29 мая 2015, 11:44
    Интересно есть алготрейдеры на нашем рынке кто применяет Machine Learning?
    • ibm watson
      29 мая 2015, 11:57
      gry, есть

      правда это не золотой грааль, как обычно оно и бывает качество подаваемых на вход величин (индикаторов, точек входа выхода) много важней конкретного метода
    • Здрасте
      29 мая 2015, 12:04
      gry, конечно есть. Мне кажется, что почти каждый первый алготрейдер проводил эксперименты с Machine Learning. Но это не для смартлаба. Тут 99% юзеров, увидевши название, читать даже не будут пост. Не зря тут столько много мяса, включая Олейников, Майтрейдов, Шадриных итп, зато их веелее читать)
      • ibm watson
        29 мая 2015, 12:07
        Здрасте, уверен, что есть N-ное количество пользователей, которые заходят просто читать ленту конкретных авторов и никак не выдают себя в той истерии вокруг топ-юзеров ака гуру.
      • gry
        29 мая 2015, 12:10
        Здрасте, Хорошо, перефразирую вопрос. А есть те кто успешно применил любые методы из ML? Я сам занимаюсь ML, правда до алготрейдинга пока не добрался
        • Здрасте
          29 мая 2015, 12:32
          gry, конечно. Думаю, что почти все прибыльные алготрейдеры используют ML. Ведь почти любой торговый робот ( кроме некоторых арбитражных) без встроенных блоков автоадаптивности — это корыто, которое утонет. Робот просто обязан подстраиваться под рынок, если хочет быть прибыльным ) .
          Лично я не использую, ибо туп почти как Майтрейд. Да и как у Олейника, у меня тоже мозг не достаточно силен, чтобы алготрейденгом заняться — до сих пор пялюсь в графики и ищу крупных игроков.
  • Deleted Account
    29 мая 2015, 12:54
    Как же я обожаю всех этих псевдоученых, делающих из примитивного базара — ядерную физику и ракетное машиностроение :) ТС, ждем от тебя темы, как зарабатывать на рынке с помощью математической модели Леонтьева, посторенной на нелинейных дифференциальных уравнениях высшего порядка. Бггг)))
      • Здрасте
        29 мая 2015, 13:38
        uralpro, вот по-этому 99% злые и сливают. )
      • Deleted Account
        29 мая 2015, 16:48
        uralpro, простая статья? Даже Ричард Деннис и Билл Экхардт подобную хрень не воспринимали всерьез. Много денег заработал машинным обучением? На счет слива — прошу в личку, померяемся пиписьками (стейтами) за период с 2008 по 2014 годы.

        ЗЫ. Я один из контрибютеров и автор патчей пакета «quantmod», который ты используешь, гений.
        • zag1
          31 мая 2015, 10:38
          Злой Инвестор, «quantmod» — это наверное мод на тему количественного моделирования? ))
    • gry
      29 мая 2015, 13:01
      Злой Инвестор, обожаю псевдотроллей
      • Deleted Account
        29 мая 2015, 16:48
        gry, обожаю глупеньких хомячков.
  • ibm watson
    29 мая 2015, 13:28
    я сейчас планирую приступить к экспериментам когда ML выступает в роле фильтрации входов и выходов на основе тех данных что ему сакрмливают. получается немного другой паттерн разработки стратегии в отличии от классического (идем итерационно по истории) — вместо линейного прогона — стратегия это data.frame входов и выходов(Y) + набор предикторов. если будет что интересное напишу. поймал себя на мысли что оч много времени потратил на обсасывание интерфейсной части (написал бектестер на R) — пора бы уже ченить и потестировать)
    • asteroid
      29 мая 2015, 16:17
      ibm watson, что может ваш бэктестер?
  • ves2010
    29 мая 2015, 13:40
    низкая вероятность (меньше 50% )означает что можно торговать обратную гипотезу… типа то что рынок упадет

    кстати у афтора явный баг или ошибка… суммарная вероятность рост+падение=100% а у афтора есть еще какое то 3ье состояние
  • Саня
    29 мая 2015, 14:02
    подход интересный, но к рынку врятли его можно применять.
  • evgen000
    29 мая 2015, 15:55
    У меня вот вопрос. Я считаю что подавать в качестве данных для обучения значения индикаторов не правильно, так-как индикатор есть функция цены.Верно?
    • asteroid
      29 мая 2015, 16:18
      Евгений, не верно.
      upd: если подавать просто цены или их изменения то часто результат угадываний не превышает 55 процентов. Это мой результат, может у когото лучше.
      Да, интересно было бы узнать у мльщиков, каков должен быть процент положительных ответов сети(модели) чтобы вы плотно взялись за нее и довели в продакшн?
        • zag1
          31 мая 2015, 10:29
          uralpro, обычно, применяют именно цены и навороченные индикаторы от них (скажем «привет граниту науки»). Цен достаточно Имхо, можно еще производные ит них брать, за место цен. )) Но это не машинное обучение и не клеточные автоматы даже, называется по другому (опять «скажем привет граниту науки толщиной в десятки и сотни книжных листов»). ))
      • ibm watson
        30 мая 2015, 00:57
        asteroid, да ничего особенного, просто велосипед под себя=)
      • zag1
        31 мая 2015, 10:18
        asteroid, да, «эта загадочная цифра 50%»… Imho она явно указывает на какое-то свойство рынка, видел много тестов и тут и в других местах часто 50% правльных входов, не может же это быть случайным сопадением? )) Логичнее в случае 50% правильных входов, делать две отдельные стратегии одна лонговая, другая шортовая, что-бы результаты улучшить.

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн