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

Продолжение этой статьи здесь.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Долго ли, коротко ли, но после всех переделок стал получать единые ответы нейросети на каждой свече выраженные в процентах ожидаемой отаботки от -100% до +100%. Знак отражает ожидаемое направление движения «вверх/вниз». Стало видно, что теперь смысл есть в каждом ответе. Оно работает! Я сам имею опыт трейдинга и видел как поведение сети на глазах становилось осмысленным. Иногда ее логика была понятна иногда нет, но всегда за ее ответами чувствовалось какое то свое, часто парадоксальное, видение рынка. В добавок к этому, выяснилось, что чем выше уверенность сети тем ближе к нужному сроку ожидаемая отработка и наоборот. Низкая уверенность как бы говорила «что будет через 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 распространяю бесплатно, если хотите увидеть работу нейросети на реальном рынке обращайтесь.

P.S.
1) Телеграм бот с сигналами нейросети здесь;
2) продолжение этой статьи здесь.

Средняя зарплата в IT

120 000 ₽/мес.
Средняя зарплата по всем IT-специализациям на основании 3 288 анкет, за 1-ое пол. 2021 года Узнать свою зарплату
Реклама
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее

Комментарии 27

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

    Как понять, что оно адекватное? «Видно на картинке?» Были ли подсчитаны метрики какие-нибудь, как эти метрики выбирались? Как было сделано разбиение на train/test/validation?
      0
      Адекватное всмысле осмысленное, видно что это не хаос. Какие могут быть критерии если это не торговая стратегия? Какие критерии у обычного индикатора?
      Разбиение: test 0.2, validation примерно 1/3 от даты для обучения.
        0
        Я не знаю, какие критерии должны быть, но «видно что это не хаос» (кому видно, была какая-то статистическая гипотеза проверена?), точно не критерий.
        Можно взять сигнал «купи» за 1, а «продай» за -1, и умножать его на реальное изменение цены. А потом посчитать такую метрику для индикатора «всегда покупай» и индикатора «всегда продавай». Сравнить результаты, и после этого делать какие-то выводы о полезности.
          0
          По этому критерию отбираются модели. Сигналы которые допускаюся с вероятностью 66% угадывают направление движения вверх/вниз. Это если брать конкретную модель. На скрине вариант при котором учитывается мнение всех моделей, все их ответы. Т.е. что бы получить статистику аналогичную приведенной нужно смотреть только ответы с большой уверенностью — 66% и выше. Я это и визуализировал, 66% это макисимальная толщина линии. Просто оказалось, что и остальные ответы тоже имеют смысл.
      +1

      Как то это сильно похоже на попытку обучения ИИ гадать на кофейной гуще, особенно фраза про эффективность обучения на определенной паре. Как то не научно.

        0
        Если вы имеете опыт трейдинга, то должны знать, что разные торговые пары имеют разную «техничность». Это завист от многих причин, почему так — подробно расписывать здесь не буду.
        0
        Хорошо обучается в пределах прогноза от 15 минут до 60 минут. На меньшем периоде растет хаотичность движения цены, на большем увеличивается внешнее влияние — новости и прочее, 15-60 минут самая «техничная» зона.

        Не, ну вы серьезно умеете предсказывать движение цен? Я, конечно, понимаю, что нейронные сети подходят для трудноформализуемых алгоритмов, но по идее ведь все что можно сделать на НС можно сделать и без них — можно мне хоть какое-то обоснование почему это должно работать? В чем я точно не сомневаюсь, так это в том что слить депозит трейдботом с НС ровно настолько же просто, как и трейдботом без оных.
          0
          Ну, собственно, про это и статья. Обоснование простое — трейдер может торговать, значит есть закономерности в движении актива, а значит эти закономерности можно натйти при помощи НС. Практика показала, что ДА, задача решается, но не в «лоб».
          Откуда у вас опыт сливания депозита трейдботом с НС? Вроде таких еще нет.
            –1
            Это не обоснование — то что трейдер торгует еще ничего не значит. Кто-то успевает быстро реагировать на новости (лично видел несколько раз как рынок реагирует на некоторые новости с задержкой меньше минуты, явно это был не человек). Кому-то надо регулярно продавать/покупать биток без попыток фиксировать прибыль. Кто-то принципиально не продает крипту в фиат ниже чем за 2 стоимости покупки, даже если лежать ей придется месяцами и годами.

            Что касается вопроса обо мне, пока есть только опыт слива из-за глупых решений. Вручную, до автоматизированной торговли лично я пока не дорос. И сдается мне, что от глупых решений НС аж никак не застрахована, тем более если пытаться заставлять ее предсказывать будущее (что всяко невозможно по некоторым причинам фундаментального характера). Да и зачем вообще играть в Вангу, если можно просто поставить ордер на покупку, скажем, в 2 раза ниже текущей цены и просто ждать до талого пока он не выполнится.
              0
              Обоснование простое — трейдер может торговать, значит есть закономерности в движении актива, а значит эти закономерности можно найти при помощи НС.

              Ну, вот с этим тезисом, как раз, всё не очевидно. Мой собственный немалый опыт, а также опыт моих коллег и сотрудников говорит об обратном — трейдинг, это не профессия, а деятельность, которая ближе к искусству, чем к ремеслу, со всеми вытекающими отсюда последствиями (т.е. слабой формализацией, низкой вероятностью успеха, умноженными на ОЧЕНЬ слабо предсказуемый характер ценообразования на финансовых рынках).

              Тем не менее, Ваш подход и результаты очень интересны, возможно, Вам удастся продвинуться в этом направлении и выйти за пределы устоявшихся решений и стереотипов восприятия трейдинга:).
              P.S. А где можно ознакомиться/протестировать Ваши алгоритмы?
                0
                Вот ссылка на Expert. Но это при условии что вы умете пользоваться MT5. Если нет, попозже планирую сделать уже заряженный нейро вариант метатрейдера.
                И обязательно читайте READ_ME.TXT
            0
            Добрый день! Скажите пож-та на каком оборудовании производилось обучение и сколько длилось обучение по времени для конкретного таймфрейма и временного интервала/датасета?
              0
              Сейчас использую аналог майнинг фермы на 6 видеокарт, но начинать можно и с Google Colab. Обучение одной модели занимает несколько часов, зависит от датасета и конфигурации нейросети.
                0
                >после всех переделок стал получать единые ответы нейросети на каждой свече выраженные в процентах уверенности от -100% до +100%.
                это круто, а можно подробнее как это вы реализовали?
              0
              скажите, а как Вы собираетесь бэктестировать Вашу систему?
                0
                Нечего бэктестировать, это не торговая стратегия, по сути это индикатор, на данном этапе. Когда станет стратегией то в MQL5 есть для теста отличные инструменты.
                  0

                  Бэктестирование требует синхронности исполнения торгового алгоритма (попробуйте написать бэктестер сами, поймете), Ваше же решение — асинхронно (коммуникация с Питоном по сокетам; или она таки синхронна у Вас?).


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

                    0
                    Нет, индикатор не превращается в стратегию, иначе было бы слишком просто. Например RSI дивергенция имеет отработку всего 55% при этом это один из лучших индикаторов.

                    Бэктестом имеет смысл заниматься когда сигналы нейро дойдут до уровня buy/sell.
                      0

                      Ну, можете сделать так: если сила сигнала провосходит некоторое пороговое значение (которое можно найти через бэктестинг), то выставляется BUY/SELL. Для нахождения объёма также можете использовать силу сигнала (тут уж сами думайте как).


                      Нет, индикатор не превращается в стратегию, иначе было бы слишком просто.

                      А кто Вам сказал что трейдинг должен быть сложным? Кто Вам сказал что трейдинг должен быть умным? А вдруг трейдинг одно из самых простых и тупых занятий?


                      Я думаю что Ваша забота это дописать управление рисками (стопы/трейлинг-стопы) и капиталом (ну, ограничить выставляемые объемы). Мне кажется что управление рисками намного важнее чем нахождение точки входа и точки выхода.

                        0
                        Да, управление рисками — это намного важнее нахождения точек входа/выхода. Риски считать все-таки проще, чем находить вершину/дно на рынке.
                        Я, например, определил приемлемую для себя волантильность портфеля, и исходя из этого, захеджировал свои позиции по акциям. И, к слову, сейчас я даже в плюсе, несмотря на тот треш, который творился на рынке последний месяц
                  0
                  Надо понимать различие между индикатором и даже стратегией торговли и конкретными условиями с конкретными параметрами торговли. В стратегии торговле надо ответить на несколько вопросов: 1. Когда войти в позицию. 2. Когда из нее выйти. 3. Что делать если вошли не правильно (стратегий с точностью в 100% не существует). И даже если вы ответите на эти вопросы оптимизация параметров дает крайне различные результаты. А тестить можно только на реальном счете реального брокера в онлайн (есть ЗНАЧИТЕЛЬНАЯ разница между например Metaquote и другим брокером и то что обучено на Metaquote не факт что будет работать на Робофорекс или Инстафорекс, то есть у одного брокера будет прибыльно у другого может сливать). Как то так…
                    0
                    Сейчас накапливается база сигналов нейро на реальном рынке. Потом можно будет гонять это на бэктесте и пробовать подбирать стратегию.
                    Классический бэктест невозможен из-за специфики получения ответа от нейро.
                    0

                    А вы пробовали сравнивать доходность с учётом уплаченных комиссий, и, желательно, прочих транзакционных издержек по сравнению с неким простейшим baseline? Например, с простейшей стратегией "купи и держи"?
                    Проблема в том, что рынок в целом представляет собой случайный шум, а гадать на случайном шуме дело довольно неблагодарное. Гораздо важнее определить начало тренда и конец тренда, это тоже довольно нетривиально, но если "угадаешь", окажешься гораздо в большем плюсе, нежели получишь от краткосрочных спекуляций.
                    Я сам пробовал торговать с роботом, однако, забросил это занятие по причине того, что 95% времени рынок представляет собой случайные колебания цены и робот получает слишком много ложных сигналов и тупо сливает деньги, в т.ч. на комиссии.
                    Сейчас торгую "руками", в большую часть времени просто наблюдаю за рынком и новостями, и совершаю крайне мало сделок (максимум 2-3 в месяц даже сейчас в кризис)

                      0
                      Это не торговая стратегия, поэтому доходности нет. На данном этапе это скорее индикатор.
                        0
                        >рынок в целом представляет собой случайный шум — вот это новость… это довольно сильное утверждение, конечно если смотреть М1 то наверно да, а если например D1 то наверно цена отражает уже какое то «объективное» состояние
                          0
                          Не хотелось бы разводить тут холивар, но под рынком я подразумевал именно колебания цены, а не само ее значение.
                          Цена на рынке отражает не больше чем баланс спроса и предложения.
                          Мы же пытаемся предугадать колебания этого баланса, и эти колебания в лучшем случае можно описать формулой y=f(x) + e, где f(x) — это тренд, если он вообще есть, а e — это случайный шум. И компонента e, случайный шум, на небольших промежутках времени оказывает гораздо большее влияние на конечную цену, чем функция, которой можно описать тренд.
                        0
                        Сделал сайт проекта. Здесь можно скачать Эксперт для MetaTrader5.

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

                        Самое читаемое