[Из песочницы] Нейросети и трейдинг. Практическая реализация

Мода на трейдинг переживает взлеты и падения вместе с курсом Биткоина. Сейчас эта тема в нижней точке после невероятного роста в 2018 году. Многие за это время успели познакомиться с криптобиржами — вникали в тему, учились, трейдили, теряли деньги и даже иногда зарабатывали. В итоге, мода прошла, а опыт остался, пусть и негативный. Слова «лонг», «шорт», «спред», «дивер» можно услышать от тех, от кого уж точно этого не ожидаешь. Но не только торговля «руками» приковывала к себе внимание, есть еще торговые боты. Что у нас в этой области, о чем говорит опыт последних 2–3 лет?
К сожалению, в этой области тоже ничего хорошего. Инструментов для написания торговых ботов много, а стабильно профитных стратегий нет. В лучшем случае работающее решение нужно постоянно обслуживать парой трейдер-программист меняя настройки под текущий рынок. Стандартный результат после подключения полностью автономного бота к депозиту — слив депозита.

Остается последняя надежда — нейросети. Тут уж точно должно получиться, ведь нейросеть учится как человек и сама подстраивается под рынок. Как дела в этой области? Ну… вы уже догадались. Все плохо, разговоров много, а работающих решений нет. Все очень плохо! Яркий тому пример магазин приложений сообщества MQL5. За брендом MQL5 стоит профессиональная платформа для трейдинга — MetaTrader5 плюс огромное сообщество трейдеров и программистов. Так вот в этом магазине есть раздел для решений на основе нейросетей, там много ботов, но ни одного настоящего. Добавить туда бота использующего нейросети запрещено правилами. В это трудно поверить, но это так. Запрет на подключение внешнего API исключает возможность использования нейросетей, а встроенные в MQL5 средства на практике не работают. Этот вопрос я обсуждал с техподдержкой MQL5, внятного ответа так и не получил. В итоге, на рынке нет ничего реально работающего из коробки, выложенные на гитхабе решения из серии «обучи сам» в расчет не берутся.

Ладно, заканчиваю со вступлением, перехожу к делу. У меня получилось обучить нейросеть, есть стоящие внимания результаты на реальном рынке. Дальше не погружаясь в детали опишу как это было сделано.

Первой и главной ошибкой всех, кто пытается обучать нейросеть торговле является трейдерское мышление о рынке. Обычно внедрить решение основанное на нейросетях пытается трейдер в паре с программистом, которые до этого писали ботов. Алгоритм торгового бота решает задачу поиска правильной точки входа в позицию и определения «тейка» и «стопа». Если эту задачу иметь в голове при проектировании нейросети, то ничего не получится. Можно бесконечно перебирать хитроумные варианты входных данных, подавать или не подавать индикаторы, пробовать разные типы нейросетей, подставлять костыли ввиде обучения только на определенных участках или обучать показывая только известные паттерны. Работать не будет.

С нейросетью надо как с ребенком, смотреть на мир ее глазами и начинать с простых задач. Самый простой вопрос который можно задать — «куда пойдет цена через Х свечей, вверх или вниз?». Не важно на сколько сильно изменится цена и не важно, что ответ потом нельзя будет превратить в торговую стратегию. Забываем про торговлю, сейчас главная задача хоть чему-то обучить сеть, просто получить правильный ответ.

У меня эта начальная задача решилась после 100500 подборов входных данных. Использовал TensoFlow плюс Keras, сеть Sequental Dense. Входной датасет на 200–300 тыс примеров, входной вектор 250–300 фичь. Из поставленного сети вопроса вытекает и форма ответа — бинарная классификация «вверх» или «вниз». Входные данные готовил ботом на MQL5. Бот пробегая историю формирует обычный csv фаил, каждая строка — вектор. В конце каждого вектора правильный ответ ввиде 1:0 если вверх, 0:1 если вниз.

Вот несколько советов тем, кто попробует это сделать:

  1. Хорошо обучается в пределах прогноза от 15 минут до 60 минут. На меньшем периоде растет хаотичность движения цены, на большем увеличивается внешнее влияние — новости и прочее, 15–60 минут самая «техничная» зона.
  2. Лучше всего обучение проходит на BTCUSD, второе место у EURUSD. Почему так — не знаю.
  3. Не забивайте голову вопросами типа «а что если цена не изменилась? тогда это третий вариант ответа?». При сборе данных я просто не включал их в датасет, задачу надо упрощать.
  4. При прогоне на тестовом участке ответы сети на первый взгляд будут казаться хаотичными с практически случайным, приближающимся к 50% уровнем результативности. Это серьезная проблема, ниже поясню как я ее решил.


Надо понимать с каким материалом имеем дело. Рынок это на 95% хаос. Когда мы подаем сети данные для обучения и указываем правильный ответ, на самом деле мы кормим ее хаосом. Это как пытаться обучить нейросеть отличать кошку от собаки, а на обучении показывать ей бабочек, звезды и знаки зодиака, результата не будет. Так и здесь, но, к счастью, рынок дает примерно 5% реально работающих закономерностей которые сеть сможет уловить и это отразится в ее ответах. Поэтому внимательнее относитесь к анализу результатов тестирования. Преобразуйте ответы в понятные глазу проценты «уверенности» сети, отсеивайте и оставляйте ответы только с высокой степенью уверенности.

Используя такой подход получил следующий результат:
примерно в 2% ответов сеть имеет уверенность более 66%. Т.е., из, например, 100 вопросов заданных сети, только в двух ответах она покажет уверенность больше 66% и только эти два ответа в дальнейшем использую, остальные летят в корзину.

66% это значит, что сеть выдавая ответ ошибется один раз из трех, т.е. правильными будут два ответа. При тесте на реальном рынке именно так и получается, но возникает другая проблема. У нас ведь всего 2% вопросов имеют ответ, остальное игнорируем. Т.е. запускаем нейро на реальном рынке на таймфрейме 5 минут и ждем… при 2% — это только каждая 50ая свеча будет с ответом, один ответ за 4 часа! И что с этим делать? Ладно если бы ответ был «купи/продай», тогда 6 сделок в сутки нормально, а тут абстрактные «вверх/вниз» и то неточно, полное разочарование.

В итоге, решил эту проблему относительно легко — просто каждые 5 мин надо опрашивать не одну модель, а 20–30 моделей, в результате ответов будет достаточно. Модели обучаются на разных входных данных и, соответственно, обучаются разным паттернам. На практике так и получается, модели сигналят на разных свечах, вместе активируясь только в очевидных, предсказуемых местах и друг друга не перекрывают.

Подведем итог, теперь есть нечто, что можно запустить на реальном рынке и иметь сигналы «вверх/вниз» со средней отработкой. Уже веселее, но практического толку по-прежнему ноль.

Пара слов о реализации. У меня это работало на связке MQL5 плюс Keras. Бот запущенный в MetaTrader5 на каждой свече готовил данные для нейросети и через сокеты передавал скрипту на питоне, который по очереди опрашивал все модели и при прохождении ответом допустимого порога отправлял сигнал в Телеграм канал.

Итак, схема работает, но применить нельзя. Сложить сигналы в какую-то стратегию не получалось. Главный недостаток — дискретность ответов. Ответ — это событие на которое надо как то реагировать — смотреть на рыночную ситуацию, думать права сеть или нет и т.д. На одной свече одна модель могла сигналить вверх, а другая вниз и какой верить? В итоге, родилась идея отказаться от порога прохождения ответа, а начать уважать каждый ответ сети, пусть и с низкой степенью уверенности. Если начать усреднять все ответы в единое общее мнение и это считать ответом сети, то ответ становится совершенно другого качества. В этом случае начинают складываться знания всех моделей, а это огромный объем совместного обучения.

Долго ли, коротко ли, но после всех переделок стал получать единые ответы нейросети на каждой свече выраженные в процентах уверенности от -100% до +100%. Знак отражает ожидаемое направление движения «вверх/вниз». Стало видно, что теперь смысл есть в каждом ответе. Лучше всего работало когда обучение, а потом и опрос производился каждую минуту, а прогноз выдавался на 15 минут. Или, второй вариант, на 60 минут. Т.е. каждую минуту приходил ответ с прогнозом того, что будет через 15 мин (или через час). При такой схеме хаотичности в ответах вообще не было, прогноз плавно менялся по ходу движения от одной минутной свечи к следующей, уверенность могла плавно нарастать или уменьшаться. И это реально стало отражать дальнейшее движение рынка. Оно работает! Я сам имею опыт трейдинга и видел как поведение сети на глазах становилось осмысленным. Иногда ее логика была понятна иногда нет, но всегда за ее ответами чувствовалось какое то свое, часто парадоксальное, видение рынка. В добавок к этому, выяснилось, что чем выше уверенность сети тем ближе к нужному сроку ожидаемая отработка и наоборот. Низкая уверенность как бы говорила «что будет через 15 минут не знаю, но общий тренд вверх».

С этого места, я понял, что пытаться все это формализовать в сигналы «купи/продай» это как микроскопом забивать гвозди. Нужен был какой то инструмент для визуализации сигналов нейросети — графического отображения на каждой свече уровня «уверенности». Широкий набор инструментов MQL5 позволил все это собрать в «Эксперт» для MetaTrader5. «Эксперт» через API получает ответы нейросети и занимается только отрисовкой. Вот пример его работы на BTCUSD M1:

image

Цветная область вверху — прогноз «вниз», область внизу — прогноз «вверх», толщина — степень уверенности.

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

В итоге, на сегодняшний день есть Expert к MetaTrader5 с двумя видами прогнозов — кроткосрочным и долгосрочным. Постепенно накапливается статистика, есть обратная связь с трейдерами. Полученный результат вдохновляет на дальнейшую работу, теперь надо подбираться к заветным «buy/sell» командам. Сделать это можно существенно увеличив качество прогноза. Дальше вижу такой путь развития:

  1. Надо подготовить еще десяток прогнозов в промежутке между 15 и 60 минутами. Т.е. начать предсказывать «вверх/вниз» для 20, 25, 30, 35 минут и так до 60. Каждый прогноз, напомню, строится из ответов примерно 20 моделей.
  2. Имея такой объем информации на каждой минутной свече, можно и нужно анализировать ее другой нейросетью. Связь прогнозов между собой на разных временных отрезках может оказаться совсем нетривиальной, поэтому нейросеть тут будет уместна.
  3. Датасет для этой нейросети не будет так зашумнен как у ее младших товарищей, поэтому ее надо обучать не банальному «вверх/вниз», а предсказанию силы движения актива, а это уже прямой выход на «buy/sell».


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

Кстати, этот Expert для MetaTrader5 распространяю бесплатно, если хотите увидеть работу нейросети на реальном рынке обращайтесь.

© Habrahabr.ru