Блог им. grepan

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

    • 17 июня 2021, 00:10
    • |
    • grepan
  • Еще

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

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

Статья будет более полезна и понятна тем, кто имеет хоть небольшой опыт работы с 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).
★18
40 комментариев

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

avatar
Sarmatae, 00:57 и к тому же 5 месяцев с января 2021 по май 2021 игра без прибыли, но с малым убытком. Нужно иметь твёрдую веру, что это  - временно.
При том, что рынок за то же время заметно вырос.
Sarmatae, если алгоритм 'осознанно' построен не упускать такие выбросы, то всё законно.
avatar
svgr, 10:23 у меня до дуры стратегий безо всяких нейронов, которые наживают на сильных движениях рынка и сливают на «флэте».
Полугодовые бесприбыльные/убыточные периоды неприемлемы.
Rostislav Kudryashov, почему не приемлемы? Для шарпа 1-2 там и 3 года может в нулях болтать. Чисто из мат.статистики.
avatar
Rostislav Kudryashov, ну почему? предположим, у вас куча таких алго, между которым балансируются бюджеты, и у каждого есть свой период тишины. Так и работают портфели, вроде.
avatar
svgr, тогда выборка должна показать достаточное количество таких выбросов, а один это ни о чём.
avatar
Sarmatae, обратите внимания на «сложность» самого торгового алгоритма и заложенные допущения. Конечно, это не выдерживает никакой критики. Лично я подобный пайплайн применяю для быстрой апробации идей на большом горизонте, закладывая проскальзывания на стандартный спред, и далее, только если будет положительное матожидание, принимаю решение о переносе алгоритмов на тестовый сервер.
avatar
1. Топик ничего не доказывает. Причем, независимо от результата эксперимента. Ни в плюс, ни в минус.
2. Перспективы у ML, таки, есть.
3. Вот так, в тупую, ML не работают.
avatar
3Qu, В целом мы все тут довольно отсталые как в плане методов, и что более важно в плане данных!
Не так давно наткнулся на ряд интересных статей в нете по поводу альтернативных источников данных и как их применяют нынче, так вот там как раз таки мл и нейросети очень нужны. Правда на данный момент с данными тоже не все просто, сложность экспертизы, дороговизна и тд, короче обычному человеку надо сильно уж постараться и раскошелиться.
В итогда всегда фирмы будут обгонять физиков в плане используемых технологий и данных, а мы так и будет пытаться на ohlc построить нечто, убеждая себя, что вот у меня то точно получится :)
avatar
CloseToAlgoTrading, 10:43 альтернативных историй от Фоменки и т.п. может быть миллион.
Данные по истории торгов могут быть только одни, без вариантов.
Но если хочешь поизощряться, есть БЕСПЛАТНЫЕ тиковые данные как по сделкам, так и по очереди заявок. Я их для удобства конвертирую в секундные свечи.
erinrv.qscalp.ru/
www.qscalp.ru/store/qsh.pdf
www.qscalp.ru/download
Rostislav Kudryashov, Альтернативные имеется ввиду не цена, а например тот же сантимент по твитам или блогам, или же например количество поиска товаров в сети определенной фирмы… и тд.
avatar
Rostislav Kudryashov, а знаете open-source тестер на тиках и сделках? Или у вас самописный?
avatar
CloseToAlgoTrading, лично у меня сложилось понимание двух возможных применений нейронок в трейдинге:
1. Подход, когда для отдельной бумаги на вход подается помимо цен окрашенные новости по ней, руководству, рынку, фундаментальные данные, и все это на достаточно крупных таймфреймах крутится (то есть минутки, 5-минтуки, и выше). Вариант требует работы команды с покупкой данных и реализации нескольких нейросеток.
2. Когда для отдельной бумаги на вход подается ее микроструктура рынка (тики, сделки) и ищутся микротренды на горизонте нескольких сотен микросекунд. Это о чем месяц назад говорил 
Алексей Афанасьевский в своем видео. Здесь можно и без большой команды справиться. 
avatar
grepan, хм… два подхода… возможно от того что вы пыаетесь предсказывать только цену инструмента. 
Возьмите backtrader и тестируйте тики :)
avatar
CloseToAlgoTrading, Благодарю, изучу вопрос.
avatar
3Qu, естественно. Модель же можно развивать, данные уточнять. Это так, набросок, проба пера)
avatar
Дружище, можешь ли код текстом или ноуьуком выложить хотя-бы в облако?
СПАСИБО
avatar
нее так делать нельзя... 

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

avatar
SergeyJu, Вы напрасно навесили на меня ярлыки ). Я нигде не ограничивал никого в том, что не надо преобразовывать данные для достижения стационарности. И применение низкочастотных фильтров тоже не ограничивал. Плюс нейронки в том, что она на _подготовленных_ (стационарных, отфильтрованных) данных может найти новые паттерны, которые до этого не были формализованы в типичных детерминированных алгоритмах.
avatar
grepan, ну и начали бы, например,  с этого плюса. 
А Вы начали с того, с чего все начинают. Уже много лет пишут почти одно и тоже. Предсказывают направление на один такт и оптимизируют нейронку стандартным методом оверфитинга. 
avatar
А Zipline, рисующую тесты на минутках может выложите? Интересно посмотреть на статистику в таком разрезе.
avatar
Не сработает потому, что обыграть рынок можно только если думать нестандартно и в правильном направлении, а нейросеть на основе данных рынка будет думать как рынок ещё лучше, чем сам рынок. Но расставлять стопы и играть на спреде автоматически вполне норм.
Национальное Достояние, а кто запрещает думать нестандартно? ) просто такие нейронки не выкладывают. Здесь же был просто самый упрощенный пример, не выдерживающий никакой критики по сравнению с рабочими детерминированными алгоритмами.
avatar
Eugene Logunov, Да, точно так.
Суть нейронки в том, что на каждом ее слое вы задаете КОЛИЧЕСТОВ индикаторов (очень по сути похожих на свечные паттерны, но только работающих на обработанных и нормализованных данных). И какие конкретно паттерны должны сформироваться, чтобы настроиться на обучающую выборку, нейронка решит сама (с некоторой долей допущений). 
Поэтому пусть число пол-ляма параметров не смущает, если Вы об этом. 
Оно никак не соотносится с размером выборки.
avatar

теги блога grepan

....все тэги



UPDONW
Новый дизайн