grepan
grepan личный блог
17 июня 2021, 00:10

Быть или не быть нейросети?

Здесь периодически возникают статьи про применение нейронок в трейдинге.

Я решил поделиться примером того, как в одном пайплайне (единая структура программного кода) можно построить, обучить и протестировать нейронку в торговом алгоритме.

Статья будет более полезна и понятна тем, кто имеет хоть небольшой опыт работы с Python.

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

Чтобы в конце концов сделать вывод о перспективности применения нейронок, будем соревноваться с индексом РТС.

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

Итак, приступим. Работать будем с фьючерсом РТС, торгуемым на Московской бирже.

Первый кусок кода с импортом библиотек и определением начальных переменных:
Быть или не быть нейросети?

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

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

 Быть или не быть нейросети?
Данные получены. На выходе стандартный массив OHLCV. Проверяем:

Быть или не быть нейросети?

По горизонтальной шкале порядковый номер свечи, по вертикальной — цена закрытия.

Делаем небольшие, но важные манипуляции с данными: добавляем новые фичи, нарезаем данные скользящим окном, определяем целевую переменную, разделяем на обучающую и тестовую выборки, нормализуем. Тестовая выборка составляет долю [test_rate] от первичного набора данных. Здесь и далее в квадратных скобках приведены названия переменных, определенных в самом первом скриншоте программного кода.

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

В нашем случае целевая переменная такая: смотрим на данные за период [period_to_analize], и пытаемся предсказать, что через период [period_to_predict], цена будет либо расти, либо падать, либо оставаться во флэте. Чтобы система понимала, что такое тренд, мы вводим порог [treshold]:

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

Вот так у нас разбились данные на обучающую и тестовую выборки:
Быть или не быть нейросети?

Пора приступать к архитектуре нейронки. Делать будем с помощью библиотеки Keras. И самая главная причина этому – наличие open-source библиотеки Keras2cpp, которая позволяет «обернуть» готовую обученную нейронную сеть в виде dll-библиотеки, которую уже можно подтягивать из Lua, С++ или другого языка, на котором будет реализован конечный боевой робот.

Архитектура нейронной сети простая, жалких пол-ляма нейронов.

Быть или не быть нейросети?

На выходе сети конечный слой нейронки отвечает за классификацию входных данных на 3 возможных сценария развития на прогнозируемый горизонт: тренд вниз, флэт, или тренд вверх (вероятность для каждого сценария, в сумме 1).

Теперь обучаем сеть. В процессе сеть выдает нам статистику потерь и точности для каждой эпохи (итерации) обучения:

Быть или не быть нейросети?

Визуализируем результаты:
Быть или не быть нейросети?

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

Еще раз прогоняем обученную нейросеть на тестовых данных:
Быть или не быть нейросети?

Точность обучения сети 82.38%.

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

Быть или не быть нейросети?

Теперь пора приступать к бэктесту. Бэктест проводим с помощью open-source библиотеки Zipline (детище безвременно закрытого ресурса Quantopian). Библиотека была допилена до возможности работать с минутками, в отличие от оригинала, работающего на таймфреймах не ниже дней.

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

Делаем начальную инициализацию параметров бэктеста:

Быть или не быть нейросети?

Работаем одним ордером, комиссию устанавливаем в 70 копеек (можно указать точнее, но для простоты пойдет). За бэнчмарк для итогового сравнения принимаем сам индекс РТС, по которому будем работать с помощью алгоритма с использованием нейросети.

Теперь сам алгоритм:
Быть или не быть нейросети?

Суть проста: простой переворотный алгоритм, в зависимости от предсказанного направления тренда [signal] открывает, либо переворачивает, либо закрывает позицию, работая одним контрактом. Среда бэктеста позволяет реализовать практически любой торговый алгоритм.

Добавляем процедуру для анализа и отображения результатов.

Задаем начальный баланс capital_base = 100000 и стартуем наконец бэктест. При этом пропускаем данные, на которых нейронка тренировалась.  Это у нас форвардное тестирование.
Быть или не быть нейросети?

Смотрим на результаты теста:
Быть или не быть нейросети?
Над красной чертой самые ключевые результаты. Далее первый график – результат работы алгоритма (% возврата), второй график: изменение цены индекса, третий график – классификация трендов на разных периодах (пока не умею делать красиво, раскрашивая график цены актива в разные цвета в зависимости от тренда, может кто научит?).  

Далее для полноты анализа приводим полную статистику портфеля:

Быть или не быть нейросети?
Быть или не быть нейросети?
Быть или не быть нейросети?
Быть или не быть нейросети?
Быть или не быть нейросети?

Итак, что у нас получилось?

В одном пайплайне (структуре кода с последовательностью работ и процедур) мы:

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

В результате нейронная сеть обогнала индекс. Особенно если помнить, что для торговли одним контрактом фьючерса на индекс РТС можно использовать начальный депозит в 3 раза ниже заданного, что еще улучшит результат. Но, конечно, нейросеть не оптимальна. На это нам показывают:

  • всплески потерь и точности в процессе обучения,
  • снижающийся график 6-месячного скользящего коэффициента Шарпа,
  • структура просадок (drawdowns).

Как можно улучшить результаты:

  • Обогатить данные дополнительными атрибутами (features engineering). Здесь нет готовых советов, это искусство. Добавлять хоть фазы луны,
  • Реализовать другую архитектуру сети. Это тоже фактически творческий процесс,
  • Усложнить торговый алгоритм,
  • Переобучать периодически сеть на новых данных. Поскольку результат в виде сформированного файла автоматически подтянется в рабочий боевой алгоритм, то эта процедура не вызывает вопросов.

Для перехода к боевому роботу, остается сделать всего несколько вещей:

  • Научиться с помощью библиотеки Keras2cpp «оборачивать» обученную нейронку в виде DLL, и помимо нее, передавать в рабочий алгоритм робота параметры, необходимые для нормализации данных (при работе с боевыми данными строго необходимо повторить подход к нормализации тестовых данных).
  • Реализовать сам рабочий алгоритм робота (желательно на C++, хотя можно и в Lua с DLL).
40 Комментариев
  • Sarmatae
    17 июня 2021, 00:57

    Явно видно, что из-за одного «выброса» сделана практически вся доходность:

    • Rostislav Kudryashov
      17 июня 2021, 08:54
      Sarmatae, 00:57 и к тому же 5 месяцев с января 2021 по май 2021 игра без прибыли, но с малым убытком. Нужно иметь твёрдую веру, что это  - временно.
      При том, что рынок за то же время заметно вырос.
    • svgr
      17 июня 2021, 10:23
      Sarmatae, если алгоритм 'осознанно' построен не упускать такие выбросы, то всё законно.
      • Rostislav Kudryashov
        17 июня 2021, 10:30
        svgr, 10:23 у меня до дуры стратегий безо всяких нейронов, которые наживают на сильных движениях рынка и сливают на «флэте».
        Полугодовые бесприбыльные/убыточные периоды неприемлемы.
        • Kot_Begemot
          17 июня 2021, 17:10
          Rostislav Kudryashov, почему не приемлемы? Для шарпа 1-2 там и 3 года может в нулях болтать. Чисто из мат.статистики.
      • Sarmatae
        17 июня 2021, 15:01
        svgr, тогда выборка должна показать достаточное количество таких выбросов, а один это ни о чём.
  • 3Qu
    17 июня 2021, 01:13
    1. Топик ничего не доказывает. Причем, независимо от результата эксперимента. Ни в плюс, ни в минус.
    2. Перспективы у ML, таки, есть.
    3. Вот так, в тупую, ML не работают.
    • CloseToAlgoTrading
      17 июня 2021, 10:43
      3Qu, В целом мы все тут довольно отсталые как в плане методов, и что более важно в плане данных!
      Не так давно наткнулся на ряд интересных статей в нете по поводу альтернативных источников данных и как их применяют нынче, так вот там как раз таки мл и нейросети очень нужны. Правда на данный момент с данными тоже не все просто, сложность экспертизы, дороговизна и тд, короче обычному человеку надо сильно уж постараться и раскошелиться.
      В итогда всегда фирмы будут обгонять физиков в плане используемых технологий и данных, а мы так и будет пытаться на ohlc построить нечто, убеждая себя, что вот у меня то точно получится :)
      • Rostislav Kudryashov
        17 июня 2021, 11:33
        CloseToAlgoTrading, 10:43 альтернативных историй от Фоменки и т.п. может быть миллион.
        Данные по истории торгов могут быть только одни, без вариантов.
        Но если хочешь поизощряться, есть БЕСПЛАТНЫЕ тиковые данные как по сделкам, так и по очереди заявок. Я их для удобства конвертирую в секундные свечи.
        erinrv.qscalp.ru/
        www.qscalp.ru/store/qsh.pdf
        www.qscalp.ru/download
        • CloseToAlgoTrading
          17 июня 2021, 12:37
          Rostislav Kudryashov, Альтернативные имеется ввиду не цена, а например тот же сантимент по твитам или блогам, или же например количество поиска товаров в сети определенной фирмы… и тд.
        • CloseToAlgoTrading
          18 июня 2021, 13:53
          grepan, хм… два подхода… возможно от того что вы пыаетесь предсказывать только цену инструмента. 
          Возьмите backtrader и тестируйте тики :)
  • sn1
    17 июня 2021, 08:06
    Дружище, можешь ли код текстом или ноуьуком выложить хотя-бы в облако?
    СПАСИБО
  • ves2010
    17 июня 2021, 08:17
    нее так делать нельзя... 

    через час удалю
    • Виталий
      17 июня 2021, 10:17
      ves2010, удалите а то граааль палится
    • Replikant_mih
      17 июня 2021, 10:34
      ves2010, Фуух, успел скопировать. Надеюсь, в моих записях автоматом не удалится. Вижу «грааль, через час удалю» — сразу копирую.
  • Serj90
    17 июня 2021, 08:32
    Вы обучили нейронку по ценам закрытия, верно? А дальше даете команды входа выхода в сделку на основе данных по ценам прогнозных закрытий будущих свечей, так чтоли?
      • Serj90
        17 июня 2021, 18:36
        grepan, а как она научилась у вас ставить стопы? Не буду долго ходить вокруг да около, но лично мое мнение, я сам с этим столкнулся, в вашем случае лучше обучать на тиках. Да и не только в вашем. А дальше уже просто позиционировать математику алгоритма либо на H, либо на L, либо на C.
  • Rostislav Kudryashov
    17 июня 2021, 08:34
    Очень досадно, что комиссия 0.7 руб за сделку с фьючерсом индекса РТС занижена раз в 10.
    Если сделка не скальперская, т.е. вход и выход из позиции в разные торговые сессии, то она стоит вдвое дороже скальперской, т.е. около 7 руб за вход+выход.
    А проскальзывание в 1 шаг цены фьючерса откусит от выигрыша каждой сделки ещё более 10 руб.
  • SergeyJu
    17 июня 2021, 11:24
    Автор старался, писал. И результат очень показательный. Полляма нейронов, мощные библиотеки, а торговать нельзя. 
    У меня знакомая работает в авиаконструкторской фирме. Говорит, беда. Молодые не отходят от компа, а железа никогда в руках не держали и не понимают, как все нарисованное будет работать. Или не будет. А старики, которые руками все понимают, все норовят комп кульманом заменить. Разрыв поколений. 
    • Rostislav Kudryashov
      17 июня 2021, 11:43
      SergeyJu, 11:24 вот почему индусы уже 20 лет не могут сляпать танка, сопоставимого с Т-90. По компьютерным технологиям — там 50 млн программистов. Но нет тех затрат в НИОКР и той пром.базы, что была в СССР.
      • SergeyJu
        18 июня 2021, 17:03
        grepan, для ищущих под фонарем, а не там, где потерял. 
        При всем уважении к питону-нейронкам-нампи-керасу  и всему подобному,  Вы пошли стандартным и неверным путем, потому что не учитываете специфику ценовых данных. И не считаете это важным, вероятно. 
        Данные нестационарны, очень сильно зашумлены и их мало (для всех, кроме ХФТ, конечно). Поэтому полляма нейронов и Ваша целевая функция не подходят для решения поставленной задаче получить хорошую торговую систему. 

          • SergeyJu
            18 июня 2021, 19:48
            grepan, ну и начали бы, например,  с этого плюса. 
            А Вы начали с того, с чего все начинают. Уже много лет пишут почти одно и тоже. Предсказывают направление на один такт и оптимизируют нейронку стандартным методом оверфитинга. 
  • Denis
    17 июня 2021, 12:03
    А Zipline, рисующую тесты на минутках может выложите? Интересно посмотреть на статистику в таком разрезе.
  • Не сработает потому, что обыграть рынок можно только если думать нестандартно и в правильном направлении, а нейросеть на основе данных рынка будет думать как рынок ещё лучше, чем сам рынок. Но расставлять стопы и играть на спреде автоматически вполне норм.

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

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