Место нейросети в торговой стратегии трейдера
Попытаюсь систематизировать своё представление о том, как и для чего можно использовать нейросети и ML в торговой стратегии.
Начнём от обратного. И сразу уточню — речь необязательно идёт об одной нейросети. Скорее, предполагается ансамбль не обязательно связанных сетей, выполняющих свои специальные задачи.
ЧЕГО НЕ ДОЛЖНА ДЕЛАТЬ НЕЙРОСЕТЬ
Как это ни прозвучит, нейросеть не должна предсказывать конкретные значения цен — ни на следующем баре, ни сколько нибудь в отдалённой в будущее перспективе.
Регрессионные задачи выполняются нейросетями достаточно хорошо, тут они конкурируют с (S)ARIMA. Но в цикличных временных рядах.
Например, ими эффективно можно прогнозировать спрос на товары (и от этого — объём продаж), суточную температуру воздуха за окном, воды в океане, прироста численности населения и т.п.
Всё дело в том, что в этих процессах крайне редко может произвойти то, что происходит с ценой, например, акции на рынке — сильное смещение средней ценны вверх или вниз.
ЧТО ДОЛЖНА ДЕЛАТЬ НЕЙРОСЕТЬ
В идеале, она должна показывать для каждого бара заданного таймфрейма рекомендацию одного из трёх известных действий: купить, продать и не делать ничего (оно же — держать).
Вопрос в том, чем кормить такую нейросеть, но он не в тему темы поста. Об этом — в следующих постах.
Тем не менее, ясно, что такая постановка задачи однозначно определяет как структуру выходных слоёв сети, так и активационную функцию последнего слоя, а именно:
последний слой из 3-х нейронов с активацией softmax и компиляция с функцией потерь categorical_crossentropy.
Так же задачей нейросети может быть определение фазы рынка, которые я бы так же разделил на 4: тренд вверх, вниз, flat и пила. Отличие flat от пилы в моём понимании в том, что на flat можно нормально зарабатывать, а на пиле волатильность такова, что и комиссии отбить не удастся.
Выход этой нейросети (тут тоже очевидно, что последний слой из 4-х нейронов с активацией softmax и компиляция с функцией потерь categorical_crossentropy) можно использовать как подтверждающий сигнал для ТС.
Ещё одна задача уже для ML — это выявление паттернов. Вот эти фсе влаги, треугольники, головы и плечи, в которых я абсолютно не разбираюсь (потому что убеждён, что можно увидеть лицо на обоссаной, извините меня, стене, если долго приглядываться) и то, о чем гуру теханализа даже, вероятно, не догадываются, но что может разглядеть нейросеть. Для этого можно использовать кластеризацию данных и детектировать паттерны, ну, например, sklearn.cluster. Выход отсюда, идентифицирующий паттерн, может поступать как дополнительный и/или подтверждающий сигнал на вход в результирующую нейросеть, которая, собственно, будет рекомендовать трейдеру (или МТС), вероятность какого действия в данный момент наиболее высока. Самое замечательное, что тут нет задачи идентифицировать конкретно, что за паттерн образовала цена — нам ведь это неинтересно. Нам всего лишь нужно понять, что завершение вот такого класса паттернов повышает вероятность успешного long или short. Пусть о деталях знает только сама нейросеть, а нам нужна просто рекомендация по действию.
Так же у меня родилась идея, для этого мира наверняка не новая — использовать НС для предсказаний «хороших» акций на основе финансовых отчётов и ценовых данных за период, следующий за публикацией отчётности. Такая нейросеть может предсказать, например, вероятность того, что будет рост или будет падение цены акций. С отной стороны, эта вероятность может быть подтверждающим сигналом для ТС, или поступать на вход другой нейросети, или просто на основании неё можно сформировать некий топ-лист акций с наибольшей вероятностью роста, и далее уже посмотреть на них глазками и потрогать ручками. Я считаю, что это может быть очень полезно, если трейдеру (например, как квалинвестору) доступно 10K бумаг и хочется сосредоточиться на бронебойных вариантах. Глазами всё отсмотреть — задача нереальная, а вот обучающая выборка на таком объёме смотрится уже довольно неплохо.
Как видно из изложенного, так или иначе, но задачи нейросетей применительно к трейдингу лично мне больше видятся как классификационные, чем предсказательные в человеческом смысле, хотя само отнесение к некоему классу нейросетью по факту мы тоже называем предсказанием. Мои торговые роботы ML ни в каком виде пока не используют, но начнут где-то к июню, если на бэктестах будут волшебные результаты.
В качестве заключения, хочу отметить, что в использовании ML важно, чтобы не получилось, как на картинке ниже.
Нейросети в трейдинге. Рано хоронить
UPDATE:
Продолжение этой статьи здесь, здесь и здесь.
Сайт с прогнозами нейросети здесь.
Добавить нейросеть в MetaTrader5 можно тут.
Это мой расширенный ответ на недавнюю публикацию «Мечтают ли нейросети об электроденьгах?», в которой автор многословно и подробно объясняет почему нейросети точно не могут работать в трейдинге и почему предсказание цены невозможно.
Прежде чем обосную свое несогласие с такой позицией, давайте немного коснемся теории и приемов которые применяются в трейдинге. Основой большинства графиков цены является так называемая «свеча». Это период усреднения цены, внутри периода мы игнорируем колебания котировок, а оставляем только минимальное и максимальное значения, а так же котировки начала свечи (открытия) и окончания (закрытия). Свечи могут быть от 1 минуты до 1 года. Раскрашиваем свечу зеленым если цена двинулась вверх, красным если двинулась вниз. В итоге получаем упрощенный, читабельный график, а главное, информативный.
Есть такая профессия — трейдер. Это специалист который долго учился своему ремеслу имеет большой опыт и как результат, после анализа некоего количества предыдущих свечей может предсказать движение цены на следующей свече, т.е. предсказать будущее. Он конечно не просто смотрит на график, а использует дополнительные инструменты которые называются «индикаторы». В индикаторах ничего волшебного нет, они формализуют и математически описывают все то же опыт трейдеров накопленный поколениями. Работа с индикаторами называется «техническим анализом». В отличии от других видов анализа, технический анализ работает только с графиком, никаких новостей и прочего.
Уже понятно к чему веду? Я лично знаю нескольких трейдеров которые пользуясь только техническим анализом, годами успешно торгуют на бирже и даже стабильно зарабатывают себе на хлеб. Очевидный вывод из всего этого — цена актива в будущем как то связана с историей предыдущих цен и эта связь достаточная для того, что бы живой человек мог ее видеть и использовать это знание.
Так почему нейросети не могут? Кошку от собаки отличают, а тут не могут. Вроде все очевидно, должно работать, а не работает. С этого места я дам свое объяснение почему не работает, а точнее, у большинства не работает.
Раз уж вспомнили про классический в нейросетях «Hello world» — отличить на фотографиях кошку от собаки давайте вспомним, что там происходит. Нейросети для обучения показывают, например, 10’000 картинок на которых в разных ситуациях изображена собака, потом так же с кошкой. К каждой картинке дается правильный ответ кто на ней. Нейросеть внимательно много раз все это просматривает и выстаивает у себя в голове некие правила по которым она в будущем сможет правильно ответить на вопрос «Это кошка или собака?». И эта схема работает. Успешных распознаваний 99.9%, бинго! Значит применим это в трейдинге.
Давайте показывать нейросети скрины графиков и давать правильный ответ куда потом пошла цена, она так научится и все будет ОК, с кошкой же работает. Это пример входа в тему стандартного среднестатистического исследователя. И что же он получает на выходе? Ничего… Нейросеть не обучается. Но наш исследовать не прост и сразу не сдается: «Надо подавать правильные данный на вход!» и начинаются циклы «правильных данных» ввиде бесконечных вариантов хитроумных векторов. И вот процесс пошел… Что бы понять когда же наш исследователь устанет и напишет статью про то, что нейросети невозможно обучить трейдингу, надо взять среднее значение усердия исследователя и умножить на количество часов от одного разочарования до другого.
А какой же правильный ответ, почему не обучается?
На самом деле, под «исследователем» я описал себя, но только мне повезло, хватило усердия дотянуть до первых положительных результатов. И вот мое, сугубо объективное, возможно неправильное, объяснение проблемы.
Да, котировки это хаос, но не на 100%. Примерно в 2% случаев следующая свеча с вероятностью около 70% связана с предыдущей историей. На самом деле примерно этот же принцип эксплуатируют индикаторы, только в них это называется «паттерн» который, как раз, и бывает примерно с такой вероятностью и вероятность отработки у него тоже не 100%. Значения 2% и 70% — это то, что я получил на сегодняшний день. Уверен, что при правильном обучении нейросети эта связь намного больше. А подход к обучению как с кошками и собаками не работает по очень простой причине. Показывая нейросети графики и давая правильный ответ, на самом деле, мы не показываем ей условную кошку или собаку, а показываем облака, бабочек, знаки зодиака и только в двух процентах то, что нужно, т.е. на 98% наши данные это хаос.
Остается понять как выловить эти заветные 2% и только по ним потом принимать торговые решения. Вариант «обучаем показывая только индикаторы» не работает, по крайней мере у меня не получилось. В итоге, первые результаты я получил после 100500 подборов входных параметров плюс правильный анализ того, что выдает сеть. Более подробное объяснение технически сложное и не для этой статьи, здесь я просто попытался логическими рассуждениями поспорить с утверждением, что нейросети и трейдинг несовместимы.
UPDATE:
Продолжение этой статьи здесь, здесь и здесь.
Сайт с прогнозами нейросети здесь.
Добавить нейросеть в MetaTrader5 можно тут.
Нейронные сети для трейдеров
Искусственные нейронные сети (ИНС) — это вычислительные системы, основанные на биологических нейронных сетях, составляющих мозг животных.
Искусственная нейронная сеть позволяет моделировать некую нелинейную функцию с входными и выходными данными.

Нейронная сеть имеет:
· Входной слой, куда подаются входные параметры, ассоциирующиеся с состоянием каждого нейрона входного слоя. Например, для финансового аналитика это могут быть различные индикаторы — макроэкономические, фундаментальные, технически.
· Выходной слой, в котором вычисляются выходные параметры, ассоциирующиеся с состоянием каждого нейрона выходного слоя. Сюда поступает информация, которую мы хотели бы предсказать. Например, это может быть будущий возврат рынка в %, волатильность, ликвидность и т.д.
Нейросеть оперирует цифрами, поэтому любая входная и желаемая выходная информация должна быть оцифрована. Например, если это текст (новости), то нужно этот текст представить в виде массива цифр. Или, если мы пытаемся предсказать куда пойдёт рынок, вверх или вниз, то можно закодировать «вниз» нулём, а «вверх» единицей.
Если нейронная сеть имеет дополнительные слои между входным и выходным слоем, то они называются скрытыми, а обучение такой сети — глубоким. Дополнительные скрытые слои могут помочь нейросети определить более сложные закономерности между входными и желаемыми выходными данными.
Каждый слой связан с соседними слоями с помощью весовых коэффициентов и коэффициентов смещения. Распространение данных от предыдущего слоя к следующему осуществляется по следующему правилу: z = Act(Wy + b), где y — вектор данных на предыдущем слое, z — вектор данных на следующем слое, W — матрица весов перехода от предыдущего слоя к следующему, b — вектор коэффициентов смещения. Act — функция активации, необходимая для устранения линейности. Функций активации существует большое количество. Например, это может быть сигмойда:
Обучение нейронной сети с учителем означает, что для заданного набора заранее известных входных и выходных данных, необходимо подобрать оптимальные коэффициенты W и b нейросети так, что квадратичная ошибка между точным выходным значением и выходным значением, полученным посредством распространения входных значений через нейронную сеть, стремилась к минимуму:
Например, вы хотите научить предсказывать по прошлой динамике цены акции и динамике индикаторов Simple Moving Average (SMA) и Relative Strength Index (RSI) будущее изменение цены этой акции в процентах. Мы формируем данные для обучения — для каждого исторического момента времени берём данные по индикаторам и цене акции. Это будут входные данные X для нейронной сети. И для каждого исторического момента времени берём будущее изменение цены акции (мы его точно знаем, т.к. речь идёт об исторических данных). Это будут выходные данные Y нейронной сети, которые мы хотим, чтобы нейросеть научилась предсказывать. Для этих данных X и Y и будут подбираться коэффициенты W и b.
Поиск оптимальных коэффициентов производится методом градиентного спуска с использованием метода обратного распространения ошибки: 
где градиент функционала E для W выражается следующим образом: 
И аналогично для b:
Хочу привести такую аналогию обучения нейронной сети для трейдеров. Надеюсь, она будет вам более понятной, если нет понимания математического аппарата. Представьте, что вы придумали стратегию, у которой очень и очень много параметров. Естественно, вам хотелось бы подобрать наиболее оптимальные параметры для стратегии (как коэффициенты W и b в случае нейросети). Что значит оптимальные? Такие, чтобы максимизировали прибыль или минимизировали просадку или максимизировали коэффициент Шарпа — смотря какой критерий выберете. Далее вы начинаете перебирать эти параметры (обучать, в случае нейронной сети). Можно перебирать с помощью «грубой силы» — т.е. перебирать все возможные комбинации параметров. Но если таких параметров очень много, то вам просто не хватит вычислительной мощности вашей машины и перебор займёт много времени. Поэтому придумано достаточно много оптимизационных алгоритмов. Например, метод градиентного спуска и его вариации или генетический алгоритм, чтобы производить поиск оптимальных параметров быстрее, жертвуя точностью.
У нейронной сети могут быть те же проблемы, которые возникают при оптимизации стратегий. Главная из них — переобучение. Когда всё работает очень хорошо на прошлых данных и плохо работает на данных out-of-sample. Про то, как минимизировать риск переобучения и правильно тестировать стратегии, думаю, поговорим в следующей статье.
В качестве примера, я создал полносвязанную нейронную сеть из входного, выходного и двух скрытых слоёв. Во входном слое я сгенерировал 45 нейронов — туда будем подавать дневные изменения цен S&P 500 за последние 15 дней, значение индикатора SMA за последние 15 дней и значение индикатора RSI за последние 15 дней. Выходной слой состоит из 1 нейрона и будет хранить предсказанное процентное изменение S&P 500 на следующий день. Скрытые слои содержат по 512 нейронов. Обучим нейронную сеть на данных с октября 2019 года по июнь 2019 г. и проверим точность обученной нейронной сети на данных с июля 2019 года по сентябрь 2019 г.
У меня получились следующие результаты. На графике ниже показан дневной возврат S&P 500 c октября 2019 года по июнь 2019 г. (тренировочные данные) — синяя кривая. Если кривая выше нуля, то это значит, что S&P 500 в этот день вырос. Если ниже — упал. 
Также я наложил оранжевую кривую на синюю. Это предсказанный нейросетью возврат рынка. По прошлой динамике S&P 500, SMA и RSI за последние 15 дней для каждого исторического момента. Точность предсказания (вырастет S&P 500 на следующий день или упадёт) составила 93%. Но это тренировочные данные. На тестовых данных с июля 2019 г. по сентябрь 2019 г. результаты получились намного скромнее: 
Точность предсказания составила лишь 49%. Нейронная сеть явно переобучена. Но, учитывая простоту модели, вряд ли можно было ожидать более приемлемый результат.
ЗАКЛЮЧЕНИЕ:
1. Искусственная нейронная сеть — это «чёрный ящик», который можно обучить по заданным входным данным выдавать нужные нам выходные данные (например, прогноз чего-либо).
2. С точки зрения трейдинга на вход нейронной сети можно подать различные индикаторы — макроэкономические, фундаментальные и технически и обучить её предсказывать будущий возврат рынка, волатильность, ликвидность, состояния и т.д.
3. Нейронная сеть, как и любая алгоритмическая стратегия трейдинга, может быть переобучена (переоптимизирована). За этим нужно следить как минимум путём деления данных на тренировочные и тестовые.
Нейросети и трейдинг. Практическая реализация
UPDATE:
Продолжение статьи здесь и здесь.
Сайт с прогнозами нейросети здесь.
Добавить нейросеть в MetaTrader5 можно тут.
Мода на трейдинг переживает взлеты и падения вместе с курсом Биткоина. Сейчас эта тема в нижней точке после невероятного роста в 2018 году. Многие за это время успели познакомиться с криптобиржами — вникали в тему, учились, трейдили, теряли деньги и даже иногда зарабатывали. В итоге, мода прошла, а опыт остался, пусть и негативный. Слова «лонг», «шорт», «спред», «дивер» можно услышать от тех, от кого уж точно этого не ожидаешь. Но не только торговля «руками» приковывала к себе внимание, есть еще торговые боты. Что у нас в этой области, о чем говорит опыт последних 2-3 лет?
К сожалению, в этой области тоже ничего хорошего. Инструментов для написания торговых ботов много, а стабильно профитных стратегий нет. В лучшем случае работающее решение нужно постоянно обслуживать парой трейдер-программист меняя настройки под текущий рынок. Стандартный результат после подключения полностью автономного бота к депозиту — слив депозита.
Остается последняя надежда — нейросети. Тут уж точно должно получиться, ведь нейросеть учится как человек и сама подстраивается под рынок. Как дела в этой области? Ну… вы уже догадались. Все плохо, разговоров много, а работающих решений нет. Все очень плохо! Яркий тому пример магазин приложений сообщества MQL5. За брендом MQL5 стоит профессиональная платформа для трейдинга — MetaTrader5 плюс огромное сообщество трейдеров и программистов. Так вот в этом магазине есть раздел для решений на основе нейросетей, там много ботов, но ни одного настоящего. Добавить туда бота использующего нейросети запрещено правилами. В это трудно поверить, но это так. Запрет на подключение внешнего API исключает возможность использования нейросетей, а встроенные в MQL5 средства на практике не работают. Этот вопрос я обсуждал с техподдержкой MQL5, внятного ответа так и не получил. В итоге, на рынке нет ничего реально работающего из коробки, выложенные на гитхабе решения из серии «обучи сам» в расчет не берутся.
Ладно, заканчиваю со вступлением, перехожу к делу. У меня получилось обучить нейросеть, есть стоящие внимания результаты на реальном рынке. Дальше не погружаясь в детали опишу как это было сделано.
Первой и главной ошибкой всех, кто пытается обучать нейросеть торговле является трейдерское мышление о рынке. Обычно внедрить решение основанное на нейросетях пытается трейдер в паре с программистом, которые до этого писали ботов. Алгоритм торгового бота решает задачу поиска правильной точки входа в позицию и определения «тейка» и «стопа». Если эту задачу иметь в голове при проектировании нейросети, то ничего не получится. Можно бесконечно перебирать хитроумные варианты входных данных, подавать или не подавать индикаторы, пробовать разные типы нейросетей, подставлять костыли ввиде обучения только на определенных участках или обучать показывая только известные паттерны. Работать не будет.
С нейросетью надо как с ребенком, смотреть на мир ее глазами и начинать с простых задач. Самый простой вопрос который можно задать — «куда пойдет цена через Х свечей, вверх или вниз?». Не важно на сколько сильно изменится цена и не важно, что ответ потом нельзя будет превратить в торговую стратегию. Забываем про торговлю, сейчас главная задача хоть чему-то обучить сеть, просто получить правильный ответ.
У меня эта начальная задача решилась после 100500 подборов входных данных. Использовал TensoFlow плюс Keras, сеть Sequental Dense. Входной датасет на 200-300 тыс примеров, входной вектор 250-350 фичь. Из поставленного сети вопроса вытекает и форма ответа — бинарная классификация «вверх» или «вниз». Входные данные готовил ботом на MQL5. Бот пробегая историю формирует обычный csv фаил, каждая строка — вектор. В конце каждого вектора правильный ответ ввиде 1:0 если вверх, 0:1 если вниз.
Вот несколько советов тем, кто попробует это сделать:
Используя такой подход получил следующий результат:
примерно в 2% ответов сеть угадывает дальнейшее движение в соотношении 2 правильных ответа к 1 неправильному. При тесте на реальном рынке именно так и получается, но возникает другая проблема. У нас ведь всего 2% вопросов имеют ответ, остальное игнорируем. Т.е. запускаем нейро на реальном рынке на таймфрейме 5 минут и ждем… при 2% — это только каждая 50ая свеча будет с ответом, один ответ за 4 часа! И что с этим делать? Ладно если бы ответ был «купи/продай», тогда 6 сделок в сутки нормально, а тут абстрактные «вверх/вниз» и то неточно, полное разочарование.
В итоге, решил эту проблему относительно легко — просто каждые 5 мин надо опрашивать не одну модель, а несколько. Модели обучаются на разных входных данных и, соответственно, обучаются разным паттернам. На практике так и получается, модели сигналят на разных свечах, вместе активируясь только в очевидных, предсказуемых местах и друг друга не перекрывают.
Подведем итог, теперь есть нечто, что можно запустить на реальном рынке и иметь сигналы «вверх/вниз» со средней отработкой. Уже веселее, но практического толку по-прежнему ноль.
Пара слов о реализации. У меня это работало на связке MQL5 плюс Keras. Бот запущенный в MetaTrader5 на каждой свече готовил данные для нейросети и через сокеты передавал скрипту на питоне, который по очереди опрашивал все модели и при прохождении ответом допустимого порога отправлял сигнал в Телеграм канал.
Итак, схема работает, но применить нельзя. Сложить сигналы в какую-то стратегию не получалось. Главный недостаток — дискретность ответов. Ответ — это событие на которое надо как то реагировать — смотреть на рыночную ситуацию, думать права сеть или нет и т.д. На одной свече одна модель могла сигналить вверх, а другая вниз и какой верить? В итоге, родилась идея отказаться от порога прохождения ответа, а начать уважать каждый ответ сети, пусть и с низкой степенью уверенности. Если начать усреднять все ответы в единое общее мнение и это считать ответом сети, то ответ становится совершенно другого качества. В этом случае начинают складываться знания всех моделей, а это огромный объем совместного обучения.
С этого места, я понял, что пытаться все это формализовать в сигналы «купи/продай» это как микроскопом забивать гвозди. Нужен был какой то инструмент для визуализации сигналов нейросети — графического отображения на каждой свече уровня «уверенности». Широкий набор инструментов MQL5 позволил все это собрать в «Эксперт» для MetaTrader5. «Эксперт» через API получает ответы нейросети и занимается только отрисовкой. Вот пример его работы на BTCUSD M1:
Цветная область вверху — прогноз «вниз», область внизу — прогноз «вверх», толщина — степень уверенности.
На данном этапе качество прогноза не имеет значения, важно, что нейросеть демонстрирует вполне адекватное мнение о рыночной ситуации. Еще больше прокачать сеть всегда можно, главное, что это работает!
В итоге, на сегодняшний день есть Expert к MetaTrader5 с двумя видами прогнозов — кроткосрочным и долгосрочным. Постепенно накапливается статистика, есть обратная связь с трейдерами. Полученный результат вдохновляет на дальнейшую работу, теперь надо подбираться к заветным «buy/sell» командам. Сделать это можно существенно увеличив качество прогноза. Дальше вижу такой путь развития:
Кстати, этот Expert для MetaTrader5 распространяю бесплатно, если хотите увидеть работу нейросети на реальном рынке обращайтесь.
UPDATE:
Продолжение статьи здесь и здесь.
Сайт с прогнозами нейросети здесь.
Добавить нейросеть в MetaTrader5 можно тут.










