Роботы на Тинькофф и Binance на JavaScript и +5000$; +10


AliExpress RU&CIS

Все комьюнити разработчиков торговых роботов, варится вокруг Python и C#. На вопрос почему именно эти языки они начинают неразборчиво бурчать про многопоточность, количество готовых библиотек, а иногда даже про семафоры. Вот и я решил попробовать влезть в эту солянку, да-да именно солянку, по другому это назвать и нельзя.

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

Как это водится у многих разработчиков, мне стало интересно на что способен JavaScript и V8 с JIT, может ли он дать нужную скорость для сложной математики? И изначально все началось больше как исследовательская миссия. А дело, кстати, было полтора года назад.

Итак, что нам потребуются для разработки и запуска торговой стратегии, ну например, на Тинькофф Инвестиции :

  1. Технические индикаторы на JavaScript. Хорошо что они есть, пусть и не сильно в изобилии. Возьмем самые популярные по скачиваниям technicalindicators

  2. Что-нибудь для работы с Тинькофф, их библиотечка invest-openapi-js-sdk

  3. Стратегию возьмем самую тупую в мире, например, 2 SMA - быстрая и медленная, которые при расхождениях стремятся сойтись вновь.

  4. Не смотря на тупость стратегии, оптимизировать ее нужно умненько: либо по Монте-Карло, либо с применением генетики, возьмем генетику, потому что просто красивее звучит. Подойдет библиотека geneticalgorithm

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

График акций тесла и тупой стратегии
График акций тесла и тупой стратегии

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

Так сложилось, что 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 (и да, где-то по дороге подключилась крипта).

В проекте есть две стартовые торговые стратегии "Для примера" как нужно работать с системой. Репозиторий с образцами и примерами.

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




Комментарии (14):

  1. PATRICK17
    /#23139308

    Если бы все это позволяло делать большие деньги, то этой статьи бы не было.
    Какой годовой процент получается?

    • BusinessDuck
      /#23139334 / -1

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

      • Hydro
        /#23139376

        Тем не менее, интересные следующие моменты
        0 — бэктестинг, класс активов, на котором работает — фьючерсы или акции
        1 — бэктестинг, средний процент в год
        2 — бэктестинг, максимальная просадка
        3 — бэктестинг, максимальная зафиксированная прибыль за период
        4 — бэктестинг, соотношения прибыль и убыточных сделок за период
        5 — бэктестинг, тренд, на котором работает алгоритм — боковик, медвежий или бычий.

        Не, я понимаю, что Вы очередной продавец лопат, вопросы скорее риторические

        • BusinessDuck
          /#23139396

          Хоть статья и не об этом, вы можете посмотреть стратегии которые я опубликовал. Там есть вся статистика если вам интересно. Вот ссылка. Но это действительно больше для примера, и речь не идет о том что вы бездумно это включите и деньги польются рекой. Такое было бы глупо публиковать. Речь про то, что это постоянно нужно поддерживать и исследовать, чтобы оно работало. Например стратегии не живут больше 2х недель в основном после оптимизации, тк рынок успевает измениться. Ну и прочие нюансы, к которым люди приходят которые этим занимаются. Можно отдельную статью про это написать :)

          • dmitryb-dev
            /#23140226

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

            • solver
              /#23143594 / +1

              но и идеи черпать уже неоткуда

              Т.е. вы хотели сказать "неоткуда стырить готовый грааль, чтобы ничего не делать и грести баблосы" ? )

              Потому что если черпать идеи из рынка, то идеи никогда не закончатся) Но да, это надо напрягаться, смотреть на него внимательно и анализировать что там происходит. Это тяжело.

              Гораздо проще гуглить готовые решения и вздыхать, что никто не хочет помочь вам разбогатеть)

        • BusinessDuck
          /#23139484

          И кстати понятно почему вы так думаете, про лопаты, те у кого получилось не орут об этом на каждом углу. А те у кого не получилось орут. Моя особенность в том, что мне приходится говорить о том, что у меня получилось, потому что я все таки систему разработки хочу продвинуть/продать.

      • PATRICK17
        /#23142372

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

  2. KoZzzik
    /#23139944

    Без регистрации и SMS…

  3. alexdesyatnik
    /#23140878

    Было бы всё-таки интересно услышать, какие преимущества дало использование JS по сравнению с общепринятыми по вашим словам Python и C#. Всё-таки JS — очень… специфический язык, мне не совсем понятны причины его использовать для подобных задач, если есть более строгие инструменты. Какие-то уникальные библиотеки, киллер-фичи экосистемы?

    • BusinessDuck
      /#23141162

      Хороший вопрос спасибо! Правда ответ получится очень долгим, но постараюсь коротко. Проблему типизации решает TypeScript. Проблему скорости решает JIT компилятор. Мы сравнивали с питоном, со «стандартными» либами по индикаторам и тоже были быстрее. При встрече на конференции Blockchain life с представителями подобной платформы на C#, я задал им вопрос как они делают оптимизацию, на что мне ответили, что брутфорсят рандомом, я спросил почему не генетика — сказали долго. Ну у меня не долго получилось. За счет того, что я все писал сам под очень узкую специализацию. Это про технику. Потом вы интересовались почему же JavaScript — одна из самых важных причин, это возможность работы в браузере, ну и вторая это комьюнити Front-End, которое имеет интерес к торговле, но не имеет желание изучать C# или Python, я увидел тут свою аудиторию и хочу ее захватить, как свободный кусочек рынка. Например такой ответ :)

  4. zasyadko
    /#23141134

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