Все комьюнити разработчиков торговых роботов, варится вокруг Python и C#, на вопрос почему именно эти языки, они начинают неразборчиво бурчать про многопоточность, количество готовых библиотек, а иногда даже про семафоры. Вот и я решил попробовать влезть в эту солянку, дада именно солянку, по другому это в целом назвать и нельзя.
В общем есть масса инструментов вроде бы годных прям для работы, но таких громоздких, и как то все распихано по разным углам и существует в полном творческом бардаке. И никто не задается вопросом как и почему это так работает, все лишь пытаются что-то написать чтобы заработать немного денег, если повезет.
В общем как это водится у многих разработчиков, мне стало интересно, на что способен JavaScript и V8 с JIT, может ли он дать нужную скорость для сложной математики? И изначально все началось больше как исследовательская миссия. А дело кстати было полтора года назад.
Итак, что нам потребуются для разработки и запуска торговой стратегии, ну например, на Тинькофф Инвестиции :
График акций тесла и тупой стратегии
В целом план есть, осталось написать только какой-нибудь модуль транспорта для более высокоуровневой работы и модуль генетики, для адаптации алгоритма все же под финансовые задачи.
Так сложилось, что SDK от Тинькофф на тот момент почти никто и не использовал. Так что пришлось его попутно переписать как следует, чтобы обеспечить надежную работу, а то свет мигнул, или кабель кто-то жует, или библиотека плохо написана, в общем коннект при пинге в 3 миллисекунды с разрывами. SDK переделал быстро, встретил кучу приятной отзывчивости от владельца репозитория на GitHub. Так совместными силами и вышел инструмент, который я до сих пор использую.
Спусти 3 месяца, раздался звук "Я - родился" и стратегия начала потихоньку торговать сама по себе. В это время собирались какие-то данные по ее работе крутились ручки, ставились подпорки и ограничители. Ну например стало ясно что на премаркете торговать нельзя, или стало ясно что пережить 30 минутную блокировку биржи при резком скачке цен не получается корректно в общем нюансы лезли буквально ото всюду. Разбиравшись с ними нужно было уделять время оптимизитору, который помог бы крутить ручки у стратегии (об этом чуть позже), давайте для начала быстренько разберемся с генетикой.
Генетический алгоритм - позволяет эмитировать природный процесс эволюции популяции живых существ. Например, ну давайте популяция бабочек будет у нас. Так вот эта популяция день ото дня размножается, выживает, делится друг с другом генами, читает хабр и прочее...
Вот примерно этим же занимается библиотека генетических алгоритмов. Чтобы не было очень скучно, вот серия картинок как "бабочки" обучаются лететь в нужную точку.
Бабочка случайно двигается
Одинокая бабочка со случайными параметрами выполняет пируэты броуновского движения, двигаясь во все направления.
Если применить немного генетики, взяв 100 бабочек и 20 поколений поскрещивать их, выдавая конфетки за приближение к точке и *текст заблокирован за жестокое обращение с бабочками*, если те двигаются не в нужном направлении. Получим следующий слайд.
Бабочки летят в указаную точку
В общем-то уже понятно, я надеюсь, как это с бабочками работает. Давайте теперь про торговлю.
Торговая стратегия это то, что у нас теперь будет вместо летающих насекомых. В качестве критерия оценки, обычно берется математическое ожидание выигрыша, это такая характеристика в теории азартных игр, она прогнозирует сумму выигрыша, которую может заработать или проиграть игрок, в среднем, по каждой ставке. На языке азартных игроков это иногда называется «преимуществом игрока» (если оно положительно для игрока) или «преимуществом казино» (если оно отрицательно для игрока). То что нам нужно, чтобы понять выигрываем ли мы у биржи с нашей торговой стратегией или нет. Вот это и будет главным критерием генетической оптимизации в нашей системе.
Вот формула подсчета мат. ожидания, на всякий случай:
Мат ожидание = Вероятность прибыли х Средняя прибыль - Вероятность убыли х Средняя убыль
Позволю себе немного кодовых вставок, без них никак. Чтобы крутить параметры стратегии потребуется некоторый интерфейс для их описания. Ниже он представлен в виде литерала объекта с различными полями.
Интерфейс позволяет задать значения, которые принимает тот или иной параметр, например целые или нет, четные или нет, булевы или числа. Теперь генетика будет знать как заполнять нашу популяцию в 100 или в 500 особей случайно сгенерированными параметрами.
Кстати, про популяцию, в нашем случае в качестве особи будет одна торговая стратегия с определенным набором настроек (генов). Которые мы и будем сохранять и передавать при скрещивании от родителей к детям.
Когда мы создаем популяцию в 100 особей, нам нужно сгенерировать 100 случайных конфигураций, создать торговые стратегии, передать им нужные конфигурации и запустить тестирование на истории. Конечно потребовалось написать выгрузку истории для этого и все необходимое. Дальше каждый проход стратегии оценивается по формуле матожидания, выполняется скрещивание особей (обмен генами ака параметрами) и получается следующее поколение. И так сколько угодно раз, например 50. В конце концов получаемые результаты будут торговать все лучше и лучше подбирая параметры периодов fastSMAPeriod и slowSMAPeriod, а также стопы и тейки.
Пишу статью легко и беззаботно, избегая возможно не нужных технических деталей, на на самом деле уже прошел целый год хардкорной разработки и эксперимент вышел из под контроля, свел так сказать, с ума группу энтузиастов.
За год стало понятно, что библиотека генетических оптимизаций не подходит. Их подход работает, но совершенно не полный: не хватает методов селекции - это то каким образом будут образовываться пары особей для выведения детей. Например использовать ли случайные выборки или спаривать только сильнейших и так далее...
Также нет защиты от дубликатов, когда из-за погрешностей технической эмуляции - появляются как 2 капли воды одинаковые особи вообще из разных семей. Это как встретить своего двойника не родственника в торговом центре. Понятно что в природе это возможно, но там не 5 параметров которые участвуют в образовании особи а миллиард Еще библиотека не умела многих других вещей описанных в этой статье. Кроме нужной настройки алгоритмики не поддерживалась также работа с асинхронными оценками особи, то есть нельзя было так просто взять и запросить историю, прогнать стратегию, а потом сказать ну все я готов оцениваться. Пришлось делать свою библиотеку в виду отсутствия таковых. Попутно необходимо было запариваться производительностью, потому что требовалось выжимать все соки из JavaScript.
В результате получилась либа async-genetic отвечающая всем стандартам, да еще и работающая быстрее. Не только в плане кода, но и в плане решения задач. Из-за дополнительных настроек, например, решает задачу "угадай какое слово я загадала" в 2 раза быстрее (в среднем).
Кроме этого давно не было картинок, поэтому пора показать результат визуализации работы стратегии и открытия сделок.
Визуализация сделок по стратегии
Чтобы вы могли видеть эту картинку со сделками и двумя SMA, потребовалось еще много времени на написание небольшой системы визуализации сделок. И загруженной истории. И тут стало понятно что эксперимент ну совсем уже вышел поз под контроля и начал жить своей жизнью. Конечно к этому времени что-то уже работало на бирже и пыталось заработать немного денег. И надо сказать любой заработок мотивировал как ничто другое продолжать это нелегкое дело.
И изначально генетика отрабатывала хорошо, но очень уж долго. Что мне показалось странным и я стал разбираться в проблеме. После дебага NodeJS приложения, удалось выяснить, что основная проблема это индикаторы, которые написаны ну очень плохо. Опять чтоли писать свои? На этой фазе проект уже начал образовывать экосистему вокруг себя и первоначальное исследовательское направление стало разрушаться. Теперь фокус был на заработок и на создание полноценной платформы.
На текущий момент уже была своя библиотека генетики и надстройка на ее основе, для оптимизации именно торговых стратегий. Но теперь требовались еще и индикаторы. К счастью они не слишком сложные, не сложнее того, что уже было сделано во всяком случае. И вот спустя какое-то время все готово! Индикаторы есть и есть тесты для них, потому что очень важно чтобы они работали корректно, тк это сердце всех стратегий. Очередной проход по производительности показат, что теперь самое медленное место new Date(). Естественно все это сращу было переписано на численное хранение данных. В общем замеры скорости работы индикаторов показали следующее:
Тут только 3 индикатора, руки не дошли проверить остальные но уже было ясно что все работает быстрее. В общем то основным преимуществом стала специфика индикаторов, в данном случае они писались не для графиков, а для потоковых вычислений и результаты предыдущих расчетов используются по максимуму в расчете на движение всегда слева на право во времени. Так появились собственные индикаторы.
После этого момента стало очевидно, что получается готовый продукт, для разработки стратегий. Оставалось только отрефакторить все это 15 раз чтобы подготовить к опенсорцу.
Перед тем как я перейду в рекламе, хотелось бы дорассказать все же про стратегию. В общем то стратегию мы не бросили, она и по сей день где-нибудь да работает, но конечно заработать нам удавалось в основном на гораздо более сложных стратегиях. И вот сунув немного денег в крипту и тинькофф инвестици уже заработано более 5000$, но в основном на крипте кнечно, акции только только начинают возвращаться в качестве активов.
Стриминг сделок мы ведем в нашем телеграмм канале. Здесь публикуются данные обо всех позициях, с небольшой задержкой примерно в 30-100 секунд. А также каждый вечер публикуется дневная и общая статистика (как на картинке). Подписывайтесь, будем рады.
В итоге в конце концов мы создали целую систему инструментов и назвали ее Debut.
Debut - это экосистема для разработки и запуска торговых стратегий. Аналог известного ZenBot, но с гораздо более гибкими возможностями для конструирования стратегий. Все что вам нужно сделать, это придумать и описать точки входа в рынок и подключить нужные плагины для работы. Все остальное - дело техники: генетические алгоритмы - помогут подобрать самые эффективные параметры для стратегии (период, стопы, и другие), модуль подбора тикеров - поможет найти подходящий для стратегии актив (токен или акцию), на котором она будет работать лучше всего.
В основе Debut лежит архитектура ядра и надстраиваемых плагинов, позволяющих гибко кастомизировать любые решения. Основной целью всей экосистемы Debut, является упрощение процесса создания и запуска рабочих торговых роботов на различные биржи. На данный момент поддерживаются: Тинькофф Инвестиции и Binance (и да, где-то по дороге подключилась крипта).
В проекте есть две стартовые торговые стратегии "Для примера" как нужно работать с системой. Репозиторий с образцами и примерами.
В общем полтора года разработки привели меня ко многим открытиям, часть из которых осталась за ширмой, но я обязательно расскажу о них в каком-нибудь докладе на конференции.
Источник статьи: https://habr.com/ru/post/562290/
В общем есть масса инструментов вроде бы годных прям для работы, но таких громоздких, и как то все распихано по разным углам и существует в полном творческом бардаке. И никто не задается вопросом как и почему это так работает, все лишь пытаются что-то написать чтобы заработать немного денег, если повезет.
В общем как это водится у многих разработчиков, мне стало интересно, на что способен JavaScript и V8 с JIT, может ли он дать нужную скорость для сложной математики? И изначально все началось больше как исследовательская миссия. А дело кстати было полтора года назад.
Итак, что нам потребуются для разработки и запуска торговой стратегии, ну например, на Тинькофф Инвестиции :
- Технические индикаторы на JavaScript. Хорошо, что они есть, пусть и не сильно в изобилии. Возьмем самые популярные по скачиваниям technicalindicators
- Что-нибудь для работы с Тинькофф, их библиотечка invest-openapi-js-sdk
- Стратегию возьмем самую тупую в мире, например, 2 SMA - быстрая и медленная, которые при расхождениях стремятся сойтись вновь.
- Не смотря на тупость стратегии оптимизировать ее нужно умненько: либо по Монте-Карло, либо с применением генетике, возьмем генетику, потому что просто красивее звучит. Подойдет библиотека geneticalgorithm
В целом план есть, осталось написать только какой-нибудь модуль транспорта для более высокоуровневой работы и модуль генетики, для адаптации алгоритма все же под финансовые задачи.
Так сложилось, что SDK от Тинькофф на тот момент почти никто и не использовал. Так что пришлось его попутно переписать как следует, чтобы обеспечить надежную работу, а то свет мигнул, или кабель кто-то жует, или библиотека плохо написана, в общем коннект при пинге в 3 миллисекунды с разрывами. SDK переделал быстро, встретил кучу приятной отзывчивости от владельца репозитория на GitHub. Так совместными силами и вышел инструмент, который я до сих пор использую.
Спусти 3 месяца, раздался звук "Я - родился" и стратегия начала потихоньку торговать сама по себе. В это время собирались какие-то данные по ее работе крутились ручки, ставились подпорки и ограничители. Ну например стало ясно что на премаркете торговать нельзя, или стало ясно что пережить 30 минутную блокировку биржи при резком скачке цен не получается корректно в общем нюансы лезли буквально ото всюду. Разбиравшись с ними нужно было уделять время оптимизитору, который помог бы крутить ручки у стратегии (об этом чуть позже), давайте для начала быстренько разберемся с генетикой.
Генетический алгоритм - позволяет эмитировать природный процесс эволюции популяции живых существ. Например, ну давайте популяция бабочек будет у нас. Так вот эта популяция день ото дня размножается, выживает, делится друг с другом генами, читает хабр и прочее...
Вот примерно этим же занимается библиотека генетических алгоритмов. Чтобы не было очень скучно, вот серия картинок как "бабочки" обучаются лететь в нужную точку.
Одинокая бабочка со случайными параметрами выполняет пируэты броуновского движения, двигаясь во все направления.
Если применить немного генетики, взяв 100 бабочек и 20 поколений поскрещивать их, выдавая конфетки за приближение к точке и *текст заблокирован за жестокое обращение с бабочками*, если те двигаются не в нужном направлении. Получим следующий слайд.
В общем-то уже понятно, я надеюсь, как это с бабочками работает. Давайте теперь про торговлю.
Торговая стратегия это то, что у нас теперь будет вместо летающих насекомых. В качестве критерия оценки, обычно берется математическое ожидание выигрыша, это такая характеристика в теории азартных игр, она прогнозирует сумму выигрыша, которую может заработать или проиграть игрок, в среднем, по каждой ставке. На языке азартных игроков это иногда называется «преимуществом игрока» (если оно положительно для игрока) или «преимуществом казино» (если оно отрицательно для игрока). То что нам нужно, чтобы понять выигрываем ли мы у биржи с нашей торговой стратегией или нет. Вот это и будет главным критерием генетической оптимизации в нашей системе.
Вот формула подсчета мат. ожидания, на всякий случай:
Мат ожидание = Вероятность прибыли х Средняя прибыль - Вероятность убыли х Средняя убыль
Позволю себе немного кодовых вставок, без них никак. Чтобы крутить параметры стратегии потребуется некоторый интерфейс для их описания. Ниже он представлен в виде литерала объекта с различными полями.
Интерфейс позволяет задать значения, которые принимает тот или иной параметр, например целые или нет, четные или нет, булевы или числа. Теперь генетика будет знать как заполнять нашу популяцию в 100 или в 500 особей случайно сгенерированными параметрами.
Кстати, про популяцию, в нашем случае в качестве особи будет одна торговая стратегия с определенным набором настроек (генов). Которые мы и будем сохранять и передавать при скрещивании от родителей к детям.
Когда мы создаем популяцию в 100 особей, нам нужно сгенерировать 100 случайных конфигураций, создать торговые стратегии, передать им нужные конфигурации и запустить тестирование на истории. Конечно потребовалось написать выгрузку истории для этого и все необходимое. Дальше каждый проход стратегии оценивается по формуле матожидания, выполняется скрещивание особей (обмен генами ака параметрами) и получается следующее поколение. И так сколько угодно раз, например 50. В конце концов получаемые результаты будут торговать все лучше и лучше подбирая параметры периодов fastSMAPeriod и slowSMAPeriod, а также стопы и тейки.
Пишу статью легко и беззаботно, избегая возможно не нужных технических деталей, на на самом деле уже прошел целый год хардкорной разработки и эксперимент вышел из под контроля, свел так сказать, с ума группу энтузиастов.
За год стало понятно, что библиотека генетических оптимизаций не подходит. Их подход работает, но совершенно не полный: не хватает методов селекции - это то каким образом будут образовываться пары особей для выведения детей. Например использовать ли случайные выборки или спаривать только сильнейших и так далее...
Также нет защиты от дубликатов, когда из-за погрешностей технической эмуляции - появляются как 2 капли воды одинаковые особи вообще из разных семей. Это как встретить своего двойника не родственника в торговом центре. Понятно что в природе это возможно, но там не 5 параметров которые участвуют в образовании особи а миллиард Еще библиотека не умела многих других вещей описанных в этой статье. Кроме нужной настройки алгоритмики не поддерживалась также работа с асинхронными оценками особи, то есть нельзя было так просто взять и запросить историю, прогнать стратегию, а потом сказать ну все я готов оцениваться. Пришлось делать свою библиотеку в виду отсутствия таковых. Попутно необходимо было запариваться производительностью, потому что требовалось выжимать все соки из JavaScript.
В результате получилась либа async-genetic отвечающая всем стандартам, да еще и работающая быстрее. Не только в плане кода, но и в плане решения задач. Из-за дополнительных настроек, например, решает задачу "угадай какое слово я загадала" в 2 раза быстрее (в среднем).
Кроме этого давно не было картинок, поэтому пора показать результат визуализации работы стратегии и открытия сделок.
Чтобы вы могли видеть эту картинку со сделками и двумя SMA, потребовалось еще много времени на написание небольшой системы визуализации сделок. И загруженной истории. И тут стало понятно что эксперимент ну совсем уже вышел поз под контроля и начал жить своей жизнью. Конечно к этому времени что-то уже работало на бирже и пыталось заработать немного денег. И надо сказать любой заработок мотивировал как ничто другое продолжать это нелегкое дело.
И изначально генетика отрабатывала хорошо, но очень уж долго. Что мне показалось странным и я стал разбираться в проблеме. После дебага NodeJS приложения, удалось выяснить, что основная проблема это индикаторы, которые написаны ну очень плохо. Опять чтоли писать свои? На этой фазе проект уже начал образовывать экосистему вокруг себя и первоначальное исследовательское направление стало разрушаться. Теперь фокус был на заработок и на создание полноценной платформы.
На текущий момент уже была своя библиотека генетики и надстройка на ее основе, для оптимизации именно торговых стратегий. Но теперь требовались еще и индикаторы. К счастью они не слишком сложные, не сложнее того, что уже было сделано во всяком случае. И вот спустя какое-то время все готово! Индикаторы есть и есть тесты для них, потому что очень важно чтобы они работали корректно, тк это сердце всех стратегий. Очередной проход по производительности показат, что теперь самое медленное место new Date(). Естественно все это сращу было переписано на численное хранение данных. В общем замеры скорости работы индикаторов показали следующее:
Тут только 3 индикатора, руки не дошли проверить остальные но уже было ясно что все работает быстрее. В общем то основным преимуществом стала специфика индикаторов, в данном случае они писались не для графиков, а для потоковых вычислений и результаты предыдущих расчетов используются по максимуму в расчете на движение всегда слева на право во времени. Так появились собственные индикаторы.
После этого момента стало очевидно, что получается готовый продукт, для разработки стратегий. Оставалось только отрефакторить все это 15 раз чтобы подготовить к опенсорцу.
Перед тем как я перейду в рекламе, хотелось бы дорассказать все же про стратегию. В общем то стратегию мы не бросили, она и по сей день где-нибудь да работает, но конечно заработать нам удавалось в основном на гораздо более сложных стратегиях. И вот сунув немного денег в крипту и тинькофф инвестици уже заработано более 5000$, но в основном на крипте кнечно, акции только только начинают возвращаться в качестве активов.
Стриминг сделок мы ведем в нашем телеграмм канале. Здесь публикуются данные обо всех позициях, с небольшой задержкой примерно в 30-100 секунд. А также каждый вечер публикуется дневная и общая статистика (как на картинке). Подписывайтесь, будем рады.
В итоге в конце концов мы создали целую систему инструментов и назвали ее Debut.
Debut - это экосистема для разработки и запуска торговых стратегий. Аналог известного ZenBot, но с гораздо более гибкими возможностями для конструирования стратегий. Все что вам нужно сделать, это придумать и описать точки входа в рынок и подключить нужные плагины для работы. Все остальное - дело техники: генетические алгоритмы - помогут подобрать самые эффективные параметры для стратегии (период, стопы, и другие), модуль подбора тикеров - поможет найти подходящий для стратегии актив (токен или акцию), на котором она будет работать лучше всего.
В основе Debut лежит архитектура ядра и надстраиваемых плагинов, позволяющих гибко кастомизировать любые решения. Основной целью всей экосистемы Debut, является упрощение процесса создания и запуска рабочих торговых роботов на различные биржи. На данный момент поддерживаются: Тинькофф Инвестиции и Binance (и да, где-то по дороге подключилась крипта).
В проекте есть две стартовые торговые стратегии "Для примера" как нужно работать с системой. Репозиторий с образцами и примерами.
В общем полтора года разработки привели меня ко многим открытиям, часть из которых осталась за ширмой, но я обязательно расскажу о них в каком-нибудь докладе на конференции.
Источник статьи: https://habr.com/ru/post/562290/