Практическое применение нейронных сетей в трейдинге

14 октября 2019, 09:38
Andrey Dibrov
23
6 874

Введение

В данной статье я хочу поднять тему применения нейронных сетей при создании торговых роботов. Это в узком понимании этой проблемы. В более широком аспекте – попытаться ответить на ряд вопросов и рассмотреть несколько проблем:

  1. Возможно, ли построить прибыльную систему используя машинное обучение?
  2. Что мы можем получить от нейронной сети?
  3. Логическое обоснование обучения нейронных сетей на принятие решения.
  4. Нейронная сеть это сложно или просто?
  5. Как интегрировать нейронную сеть в торговый терминал?
  6. Как тестировать нейронную сеть? Этапы тестирования.
  7. Об обучающих выборках.


1. Возможно, ли построить прибыльную систему используя машинное обучение?


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

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

Итак, мы получили ответ на второй вопрос - что мы можем получить от нейронной сети в результате ее обучения? И даже в большей мере надо вопрос перефразировать – что мы хотим получить от нейронной сети в результате ее обучения? А логически подумав, мы можем ответить и на первый вопрос положительно. Поскольку технически и программно это сделать - возможно. Как это реализуется на практике, вы можете увидеть в видеоролике на моем канале в https://youtu.be/5GwhRnSqT78. А так же посмотреть плейлист с видео онлайн теста нейросетевых модулей на этом же канале https://youtu.be/3wEMQOXJJNk


2. Логическое обоснование обучения нейронных сетей на принятие решения


Прежде чем приступать к разработке любой торговой системы, мы задаемся вопросом - на каких принципах данная система будет функционировать? У нас есть два основополагающих принципа – использования флетов и продолжение тенденции. Не будем рассматривать более узкие производные от них – внутри дневная торговля или нет, на фундаментальных данных, на новостях, на открытии рынков и т.д. Мне пришлось сталкиваться с описанием нейросетевых продуктов, где их авторы в примерах использования предлагали прогнозирование каких либо курсов – акций, валют и т.д.

График отклика нейросети обученной на прогнозе цены

1. График отклика нейросети обученной на прогнозе цены

Рассмотрев график отклика нейронной сети обученной на прогноз цены, мы видим, хоть он и повторяет график цен, но на один шаг от него отстает. Причем это не зависит – прогнозируем ли мы ценовые данные или производные от них. Исходя из этого, мы можем это заключение постулировать. Например – “То, что для нас – вчера, для нейронной сети – сегодня”. Согласитесь, что здесь, в принципе, ни о какой полезности речи идти не может. Однако отмечу, что данный вариант, при определенной доработке мы так же можем использовать.

Но  мы, конечно, хотели бы  использовать постулат – “То, что для НС сегодня, для нас – завтра”. Машина времени, какая то. Однако мы понимаем, что все-таки, самая лучшая нейронная сеть – это наш мозг. И то, мы можем использовать этот постулат максимум с 50% успехом (если мы говорим о вероятности да или нет), а то и хуже. Но ведь есть еще и третий вариант  – “То, что для НС– вчера, для нас – сегодня”. Или так – “ То, что для нас сегодня, для НС– вчера”.  Разберем, что для нас означают эти постулаты в трейдинге:

  • первый - мы совершаем сделку и завтра получаем ответ от НС - открылись в правильном направлении или нет. Хотя мы это уже знаем и без НС;
  • второй - мы получаем информацию от НС, совершаем сделку и завтра видим, правильная рекомендация была или нет;
  • третий - мы получаем информацию от НС- когда нам надо совершить ту или иную сделку вернее надо ли нам совершать сделку в настоящий момент, и в каком направлении.

Первый вариант, естественно мы отбрасываем сразу. А вот второй и третий для торговли подходят. Однако второй вариант – вариант как бы заглядывания в будущее. Утрировано этот вариант торговли заключается в том, что мы получаем сигнал от НС в определенный момент времени – например по закрытию дня с прогнозом как закроется следующий день (и в данный момент времени нас не интересует движение цены до закрытия сделки). Реализовать его для чисто механической торговли на данном этапе сложно (для прибыльной торговли). Смысл третьего варианта, заключается в том, что мы отслеживаем отклик НС на протяжении торговой сессии и покупаем либо продаем  его интерпретируя. И здесь нам надо понять основное.

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


3. Нейронная сеть это сложно или просто? 


Если мы говорим о разработке системы торговли с помощью нейронных сетей, то естественно возникает вопрос – а где же нам взять саму нейронную сеть, как ее обучить и интегрировать в торговый терминал. На данном этапе я пока использую готовые НС “NeuroSolutions” и Matlab. Эти платформы позволяют выбрать подходящую вам нейронную сеть, обучить и довести ее до исполняемого файла с подходящим вам интерфейсом. В результате сама программа нейронной сети может выглядеть вот так -

Модуль нейросети, созданный в среде Matlab

2. Модуль нейронной сети, созданный в среде Matlab

или так-

Модуль нейросети, разработанный в среде Neuro Solutions

3. Модуль нейронной сети, разработанный с помощью Neuro Solutions

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

Но мы можем переложить функцию терминала, по расчету индикаторов на нейронную сеть, обучив их определенным образом. И далее обучать нейронную сеть уже на этих индикаторах. То есть от эксперта нам понадобиться передать в модуль нейронной сети только относительные ценовые данные, которые используются в формулах индикаторов. И впоследствии принять от нейронной сети несколько “единичек” и “ноликов” и сравнив их принять решение.

Давайте посмотрим на примере стохастического осциллятора - что у нас получится. Вот такие ценовые данные мы будем использовать в качестве входов, и в качестве одного обучающего примера мы будем использовать сам индикатор.

Ценовые данные

4. Ценовые данные

FileWrite(handle,
                   
                   iClose(NULL,0,i+4)-iLow(NULL,0,i+4),
                   iHigh(NULL,0,i+4)-iClose(NULL,0,i+4),
                   iHigh(NULL,0,i+4)-iLow(NULL,0,i+4),
                   iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,5,i+4))-iLow(NULL,0,iLowest(NULL,0,MODE_LOW,5,i+4)),
                   
                   iClose(NULL,0,i+3)-iLow(NULL,0,i+3),
                   iHigh(NULL,0,i+3)-iClose(NULL,0,i+3),
                   iHigh(NULL,0,i+3)-iLow(NULL,0,i+3),
                   iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,5,i+3))-iLow(NULL,0,iLowest(NULL,0,MODE_LOW,5,i+3)),
                   
                   iClose(NULL,0,i+2)-iLow(NULL,0,i+2),
                   iHigh(NULL,0,i+2)-iClose(NULL,0,i+2),
                   iHigh(NULL,0,i+2)-iLow(NULL,0,i+2),
                   iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,5,i+2))-iLow(NULL,0,iLowest(NULL,0,MODE_LOW,5,i+2)),
                   
                   iClose(NULL,0,i+1)-iLow(NULL,0,i+1),
                   iHigh(NULL,0,i+1)-iClose(NULL,0,i+1),
                   iHigh(NULL,0,i+1)-iLow(NULL,0,i+1),
                   iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,5,i+1))-iLow(NULL,0,iLowest(NULL,0,MODE_LOW,5,i+1)),
       
                   iClose(NULL,0,i)-iLow(NULL,0,i),
                   iHigh(NULL,0,i)-iClose(NULL,0,i),
                   iHigh(NULL,0,i)-iLow(NULL,0,i),
                   iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,5,i))-iLow(NULL,0,iLowest(NULL,0,MODE_LOW,5,i)),
 
                   iStochastic(NULL,0,5,3,3,MODE_SMA,1,MODE_MAIN,i),
                   TimeToStr(iTime(NULL,60,i)));

После обучения нейронной сети, она нам выдаст вот такой результат.

Отклик нейросети

5. Отклик нейросети

Для лучшего визуального исследования мы перенесем эти данные в виде индикатора в торговый терминал.

Стохастик и индикатор нейросети

6. Стохастик и нейросетевой индикатор

В верхнем окне мы наблюдаем индикатор построенный терминалом, а ниже – нейронной сетью.Даже визуально можно понять, что индикатор, построенный нейронной сетью, имеет все характеристики стандартного индикатора – уровни, пересечения, развороты, дивергенции и т.д. Хотя мы для обучения сети не использовали ни одной сложной формулы.

Таким образом, мы можем нарисовать вот такую блок схему торговой системы.

Блок-схема торговой системы

7. Блок-схема торговой системы

Блоки “MT4” – это наш торговый эксперт. Файл цен – “Input_mat”. Файл сигнала – “Open1,2,3”. Примеры этих файлов представлены в следующем разделе.

Основная работа у нас предстоит с блоками “Net1” и “Net2”. Подготавливая их, нам надо будет использовать несколько скриптов и экспертов для подготовки исторических данных и для тестирования сигналов от этих блоков нашим торговым экспертом. Но на самом деле, когда наша система готова как комплекс – ее модификация, развитие, экспериментирование с ней не занимает много времени. В качестве примера вы можете просмотреть видео https://youtu.be/k_OLEKJCxPE . То есть - подготовка файлов, обучение “Net1” и “Net2” и первый этап тестирования на котором мы можем оптимизировать нашу систему, занимают 10 минут.


4. Интеграция нейронной сети в торговый терминал

Интеграция нейронной сети и торгового терминала особой проблемы не составляет. Этот вопрос я решил путем передачи информации, через файлы создаваемые терминалом и программой нейронной сети. Если, кто-то  скажет, что это замедляет действия системы на принятие решения, то я остановлюсь на основных достоинствах такого способа передачи информации. Ну, во-первых – информация передаваемая терминалом минимальна – всего несколько десятков байт. Посмотрите на строку файла, который записывается терминалом.

Файл нормализованных цен

8. Файл нормализованных цен

Хотя сам способ передачи информации программно нам дает возможность открываться только на следующем тике после прихода сигнала от нейронной сети. Но если система не использует супер краткосрочные моменты совершения сделок – это не существенно. Забегая вперед, отмечу, что в данной статье я рассматриваю систему “по ценам открытия”. И опять-таки, забегая вперед и исходя из вышесказанного – мы приходим к выводу, что системы с таким способом передачи информации требуют тестов либо по контрольным точкам, либо по всем тикам. Тесты систем на нейронных сетях  на контрольных точках и всех тиках практически идентичны. Хотя ранее, при разработке традиционных торговых роботов, я сталкивался с проблемой значительного ухудшения итогов торгов при переходе на тест по всем тикам. 

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

На рисунке ниже мы видим файлы “Input_mat” и “Bar”. Эти файлы формируются торговым терминалом. Файлы  “Open1,2,3” формируются программой НС. Единственное небольшое неудобство заключается в том, что в программе НС нам надо явно задавать пути, к этим файлам исходя из того, в каком качестве мы используем эксперт – тестируя его или реально с его помощью торгуя.

Файлы сформированные модулем нейросети и экспертом

9. Файлы сформированные нейросетевым модулем и экспертом

Файл “Bar” – вспомогательный и используется в качестве счетчика.

Файл Bar

В файлы “Open1,2,3” мы непосредственно получаем отклик НС. Первая строка – предшествующий отклик. Вторая – отклик в реальном времени. Данный формат является частным случаем. В зависимости от условий ведения торгов он может отличаться. Как и само количество файлов откликов. В данном случае это обусловлено тем, что в самом модуле НС используется три сети, обученные  на разных временных отрезках.

Отклик нейросетевого модуля в файлах Open1,2,3

10. Отклик НС модуля в файлах Open 1,2,3


5. Как тестировать нейронную сеть? Этапы тестирования


При подготовке торговых систем на основе нейронных сетей я использую три этапа тестирования. Первый этап я назвал быстрым тестированием. Это основной этап подготовки системы в смысле ее общей работоспособности. На этом этапе мы систему можем оптимизировать, и на оптимизацию у нас не уходит много времени. Здесь мы используем скрипт или эксперт для подготовки файла исторических данных после “истории”,  на которой мы обучали нейронную сеть и по текущее время. Потом мы по этим данным получаем отклики от сети с помощью скрипта из среды матлаб и по ним строим индикатор. С помощью этого индикатора мы и оптимизируем наши НС отклики на вхождение в рынок и выход из него. На рисунке ниже приведен пример этого индикатора. Этот индикатор является интерпретацией 52 производных от 12 пользовательских индикаторов. Хотя это могут быть и стандартные индикаторы терминала.

Индикатор построенный по откликам нейросети

11. Индикатор построенный по откликам нейросети

Далее мы можем оптимизировать нашу стратегию торговли.

Результаты тестирования индикатора нейросетевых откликов

12. Результаты тестирования откликов нейросети

Второй этап проведения тестов заключается в том, что мы должны обучить и записать нейронные сети в среде Matlab с помощью Neural Network Toolbox.

Neural Fitting

13. Neural Fitting


Полученные нейросети

14. Полученные нейросети


Получить отклик от этих нейронных сетей из командного окна.

Получаем отклик от нейронных сетей

15. Получаем отклики от нейронных сетей


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

Если у нас все получится – то можно двигаться далее.

И протестировать эти НС с помощью скрипта модуля нейронной сети, который мы будем использовать в системе. Протестировать их на каком либо временном отрезке по контрольным точкам. Если этот тест совпадет с идентичным временным отрезком предыдущего теста индикатора – то мы движемся в правильном направлении. Мы запускаем этот скрипт в среде Matlab. И одновременно наш рабочий эксперт в торговом терминале.

Запустим скрипт в рабочей среде Matlab

16. Запустим скрипт в рабочей среде Matlab


Запустим эксперт в терминале

17. Запустим эксперт в терминале

Получим примерно такой результат.

Результат тестирования скрипта Matlab и эксперта MT4 и

18. Результат тестирования скрипта Matlab и эксперта MT4

Далее нам надо оформить интерфейс пользователя и скомпилировать модуль нейронной сети и протестировать его предыдущим способом.


Тестируем скомпилированный модуль нейросети

19. Тестируем скомпилированный нейросетевой модуль

Если мы получим схожий с предыдущим результат, то можно приступать к реальной торговле по нашей нейросетевой системе.



5. Об обучающих выборках


В зависимости от того на каких обучающих выборкам мы будем подготавливать нейронную сеть – мы получим различные индикаторы отклика сети. И, следовательно, строить различные стратегии торгов. А комбинация различных стратегий даст нам более стабильный конечный результат. Один вариант я представил в предыдущих разделах. Там мы делали выборку по экстремумам торгового периода. Приведу еще один пример.

Индикатор отклика нейросети обученной по иной выборке

20. Индикатор откликов нейронной сети обученной по иной выборке

В данном случае я обучал две нейронные сети. Одну на покупку, вторую на продажу. Тренировку проводил на выборках, когда минимальная цена достигнута, а максимальная еще нет. И наоборот. В двух индикаторах представленных на рисунке – интерпретированы двенадцать пользовательских индикаторов. Максимумы красной линии показывают, когда достигнута минимальная цена. Максимумы серой – максимальная цена. Как мы видим, теперь есть возможность оптимизировать данные индикаторы либо отдельно каждый или в паре. Например – по пересечению друг с другом, по разнице значений, по пересечению определенных уровней и т.д.

Согласитесь, что двенадцать индикаторов оптимизировать гораздо сложнее.


Заключение

На тему применения нейронных сетей в трейдинге написано много статей. Литературы, в которой бы полностью раскрывалась данная тема на предмет доведения системы построенной на нейронных сетях до реального ее применения очень мало. Да и многие описания предназначены в основном для пользователей со специальными знаниями в программировании. В одной статье, да и в нескольких, данную тему раскрыть сложно. Но я попытался это сделать без нагромождения теоретического и специального материала в книге “Нейросетевая торговая система. MetaTrader 4 + MATLAB. Пошаговая разработка. Издание второе”.


Последние комментарии | Перейти к обсуждению на форуме трейдеров (23)
Andrey Dibrov
Andrey Dibrov | 21 окт 2019 в 16:49
Dmitry Fedoseev:

Да, почему вы пользуетесь сторонними программами?

Глядя на Ваш рейтинг - вы конечно же и сами, сможете все сделать, но большинство трейдеров нет. Нужны уже готовые нейронные сети интегрированные в терминал, скажем так - на уровне индикаторов.

Andrey Dibrov
Andrey Dibrov | 21 окт 2019 в 17:23
Dmitry Fedoseev:

Да, почему вы пользуетесь сторонними программами?

А что касается лично меня - поэтому и пользуюсь, что не программист, математик и т.д. И этим сказать, что "высшие материи" доступны многим, было бы желание))) 

Denis Kirichenko
Denis Kirichenko | 29 окт 2019 в 13:35
Тема интересная. Но жаль, что нет кода, который можно "потрогать". 1 небольшой файл с кодом дороже нескольких видео роликов...
Kristian Kafarov
Kristian Kafarov | 3 ноя 2019 в 11:54
Автор использует какие-то самобытные приемы, но понять в чем сущность этих приемов нет никакой возможности в силу невообразимой путаницы в изложении и полном отсутствии вменяемой терминологии как трейдинга так и машинного обучения. Что куда подается? Что предсказывается? Как проверяется? Как готовятся данные? Где периоды бека и форварда? Где участки тренировки, валидации и теста? Советую озаботиться решением этих вопросов, а также прочтением достаточного количества вменяемых текстов по теме, это может помочь.
Andrey Dibrov
Andrey Dibrov | 3 ноя 2019 в 13:24
Kristian Kafarov:
Автор использует какие-то самобытные приемы, но понять в чем сущность этих приемов нет никакой возможности в силу невообразимой путаницы в изложении и полном отсутствии вменяемой терминологии как трейдинга так и машинного обучения. Что куда подается? Что предсказывается? Как проверяется? Как готовятся данные? Где периоды бека и форварда? Где участки тренировки, валидации и теста? Советую озаботиться решением этих вопросов, а также прочтением достаточного количества вменяемых текстов по теме, это может помочь.

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

Библиотека для простого и быстрого создания программ для MetaTrader (Часть XXIII):  Основной торговый класс - контроль допустимых параметров Библиотека для простого и быстрого создания программ для MetaTrader (Часть XXIII): Основной торговый класс - контроль допустимых параметров

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

Библиотека для простого и быстрого создания программ для MetaTrader (Часть XXII): Торговые классы - Основной торговый класс, контроль ограничений Библиотека для простого и быстрого создания программ для MetaTrader (Часть XXII): Торговые классы - Основной торговый класс, контроль ограничений

В статье начнём создавать основной торговый класс библиотеки и наделим его первую версию функционалом первичной проверки разрешений на проведение торговых операций. Также немного расширим возможности и содержание базового торгового класса.

Создаем кроссплатформенный советник-сеточник (Окончание): диверсификация как способ повышения прибыльности Создаем кроссплатформенный советник-сеточник (Окончание): диверсификация как способ повышения прибыльности

В прошлых статьях данной серии мы пытались разными способами создать более или менее прибыльный советник-сеточник. Теперь же мы попробуем увеличить прибыльность торгового советника с помощью диверсификации. Нашей целью является всеми желанные 100% прибыли в год при 20% максимальной просадки по балансу.

Конструктор стратегий на основе технических фигур Меррилла Конструктор стратегий на основе технических фигур Меррилла

В предыдущей статье была рассмотрена модель применения технических фигур Меррилла к различным данным, таким как ценовое значение на графике валютного инструмента и значениям различных индикаторов из стандартного набора терминала MetaTrader 5: ATR, WPR, CCI, RSI и других.Теперь мы попробуем созданить конструктор стратегий на основе идеи использования технических фигур Меррилла.