Всем привет, меня зовут Егор. По профессии я программист, но уже давно занимаюсь торговлей на рынке акций. Соответственно, ряд моих pet-проектов был связан именно с этой сферой. К примеру, в 2020 году я делал сервис для ведения инвесторской бухгалтерии Reagle.net, но до ума проект я так и не довёл, хотя он рабочий и им можно пользоваться — лично я использую его до сих пор.
Следующим проектом в сфере инвестиций и трейдинга стал бот, о котором я расскажу в данном материале. Это бот отслеживающий события, которые сильно выбиваются из общего количества данных. К примеру, особо крупные сделки покупки/продажи, повышенные объемы и изменения цены за интервал или появление большой заявки в стакане. Через бота можно подписаться на отдельно взятые акции или на целый сегмент вроде сектора экономики и индекса, а бот в свою очередь в режиме реального времени будет отслеживать данные тикеры и сообщать о произошедших событиях.
На скриншотах можно увидеть примеры сообщений с событиями, которые отслеживает бот.
Как вообще я пришел к этой идее? Изначально я не планировал доводить проект до выхода на рынок. Это была просто разработка ради интереса. Я такое периодически делаю. К примеру, я как-то написал пиратский онлайн-кинотеатр за 8 часов, правда, после первой же претензии от Роскомнадзора я отключил проект с концами, но это отдельная история. Тут ситуация сложилась следующим образом: долгое время в телеграм-каналах мелькал похожий бот, но с мягко говоря невменяемым ценником (на тот момент более 70000 рублей в год). Таким образом появился спортивный интерес сделать аналог для себя. И в последствии процесс разработки разделился на две части. Давайте я расскажу подробнее об этих этапах включая в рассказ в том числе упоминания технологий и алгоритмов, которые я использовал.
Разработка первой версии
Первая версия проекта была сделана буквально за один день на языке программирования Go. Данная версия фактически ещё не включала в себя бота. Я сделал телеграм-канал, в который просто кучей скидывал аномальные события по всем акциям Мосбиржи. Как это происходило? С помощью
API Мосбиржи я выгружал каждые 10 минут
10-минутные свечи за полгода и среди них выбирал самые большие отклонения, которые входят в
97.5% самых больших значений. То есть фактически брался топ
2.5% самых больших объемов или изменений цены за интервал и этот диапазон считался
аномальным. Это решение соответственно я подглядел у конкурентов, но с самого начала я считал его неудачным — определение аномальности таким образом очень негибкое, но разберем эту проблему и её решение немного позже.
Как я упомянул ранее данные брались из
MOEX API, которое имеет бесплатную версию и платную по подписке. Отличия в том, что в бесплатной версии доступно меньше функций, что довольно очевидно, но и данные отдаются с задержкой в 15 минут, а также нет возможности выгрузки данных в рамках стрима по подписке — это когда вы, допустим, подписываетесь на событие с минутными свечами GAZP и вам каждую минуту в рамках этого соединения автоматически отдаются новые свечи. Ряд подобных ограничений не позволяет делать production-ready решение на данном тарифе MOEX API, поэтому раз изначально это был просто pet-проект я решил зайти с другого угла и поискать других вендоров, через которых можно получать данные о рынке. И я нашел
Tinkoff Invest API.
MOEX API vs T-Invest API
Основная направленность Tinkoff Invest API — это создание торговых роботов для клиентов. Тут есть странная система грейдов, которая увеличивает лимиты, но по большому счету достаточно и базовой версии. Здесь уже есть возможность выгружать данные по подписке в рамках стрима по gRPC, чего нельзя в базовой версии MOEX API; плюс нет никаких искуссвенных задержек в 15 минут. В общем, одни плюсы. Однако при коммерческом использовании выглядит так, что лучше отдавать предпочтение платному тарифу MOEX API, потому что T-Invest запрещает ретрансляцию данных.
Монетизация
Почти сразу пришла идея попытаться монетезировать эту историю, поэтому я сделал второй канал прикрутил к нему платную подписку и начал отправлять туда аномальные события по
1-минутным свечам за
3 месяца. Первый канал соответственно стал считаться бесплатным с событиям по
10-минутным свечам за
6 месяцев. И примерно на этом этапе все заглохло на полгода — все как всегда в подобных начинаниях уперлось в маркетинг, которым нужно заниматься. Поэтому спустя время перед тем как начинать продвигать этот проект было решено его допилить до более удобного продукта. Потому что в тысячах сообщений, которые китаются в одну кучу довольно сложно разобраться. И на этом этапе бот становится настоящим ботом.
Разработка финальной версии
На данном этапе было проделано самое большое количество работы. Во-первых, были добавлены функции отслеживания новых событий — это
аномальные сделки и
заявки в стаканах, в дополнение к уже существующим
объемам и
изменениям цены. Во-вторых, был сделан сам бот для удобного управления подписками на события. Логика работы получилось примерно такой: каналы с событиями остались существовать как есть, туда как и прежде скидывается множество событий происходящих на рынке; бот в свою очередь в зависимости от того, на что подписан пользователь пересылает ему только нужные события из каналов. Зачем это сделано? Это открывает удобную возможность мониторить события, которые происходят параллельно событиям, которые интересуют пользователя. То есть канал — это
таймлайн, а пользователь при необходимости может перейти по пересланному сообщению и увидеть на таймлайне, что за события происходят параллельно. Само собой это не киллер-фича, а просто дополнительная полезность.
Также важным моментом разработки финальной версии стало изменение алгоритма определения аномалии.
Алгоритм определения аномалии
Как я сказал ранее, определение аномальности за счет вхождения значения в
топ 2.5% самых больших значений — это решение крайне негибкое. К примеру, какие ситуации я наблюдал. В начале лета 2024 были активные торги акциями Алросы и соответственно происходило большое количество аномальных событий, из-за которых подобный алгоритм перестал замечать события по этой акции вплоть до окончания периода выборки в
3 месяца. То есть появление каждого нового аномального события не дает обнаружиться новому событию в будущем, грубо говоря.
Но после перебора разных алгоритмов я нашел хорошее решение, которое на данный момент меня полностью устраивает — это анализ по
Z-Score (стандартизированная оценка или Z-оценка). Фактически Z-Score используется для определения отклонений от среднего значения. Собственно это нам и нужно. Сначала считаем, допустим, средний объем по 1-минутным свечам произвольной акции, затем определяем, какое отклонение от этого среднего значения можно считать аномальным. Само собой со значением отклонения можно ещё долго экспериментировать, но у меня получилось подобрать оптимальное значение, при котором событий не слишком много, чтобы в них не запутаться, но при этом не упускалось ничего важного для торговли.
Следующие шаги
Уже на этом этапе сервис включает в себя основные фичи, которые могут понадобится трейдеру, но все равно хочется заниматься дальнейшим расширением. Правда, тут уже нужен фидбек от целевой аудитории. К примеру, я могу добавить сигналы для технического анализа, я уже провел предварительное исследование, и это относительно несложно. Или добавить сигналы при повышенном интересе к активу в течение суток. Также можно отрисовывать графики с шкалой интереса институциональных инвесторов или наоборот толпы физиков — это можно относильно легко реализовать имея набор сделок за период. В общем, есть множество потенциально интересных идей, нужно только определить интересы целевой аудитории.
Заключение
Надеюсь, данный рассказ был вам интересен. Самого бота можно посмотреть здесь —
https://t.me/reagle_signals_bot?start=c21hcnRsYWIx. Там есть отдельная команда с описанием и инструкциями, где можно получить всю дополнительную информацию для понимания принципов работы бота. В следующих статьях могу рассказать подробнее про более специфичные моменты разработки проекта. А на этом я закончу. Всем пока.
цыгане?
А судьи яйцами трясут:
«ПОЛГОДА, бля, ПОЛГОДА, бля,
ПОЛГОДА!»
Бот в свою очередь может помогать в принятии решений в трейдинге: повышенный объем указывает на интерес к активу, а, допустим, аномальные заявки в стакане на возможность появления нового уровня поддержки или сопротивления. Ряд подобных индикаторов в совокупности может уже с большей вероятностью указывать на потенциальное движение цены актива.
Надеюсь, я ответил на ваш вопрос.
Нужно смотреть на события в совокупности и уже на основе многих факторов принимать решение — это же очевидно, что нет волшебной таблетки.
В боте бесплатно доступна возможность подписаться на все события по всем голубым фишкам Мосбиржи. То есть человеку может даже не потребоваться платная подписка, если он не торгует условно вторым эшелоном. Условия максимально демократичные. Человек, который знает что делает легко найдет применение инструменту или просто не будет его использовать — никто никому ничего не впаривает.
У вас какой-то бзик на инфоцыганах, судя по всему, раз вы и меня к ним приплели. Первую статью написал, чтобы рассказать о своем проекте, и уже инфоцыган.
А это как?
У сделок которые описал коллега будет одинаковое время(т.к. они исполнены рыночным ордером в рамках 1 матчинга) поэтому их можно присылать в телегу хоть аггрегированными хоть частями и любым другим способом который Вам нравится(например отправить что было 3 сделки 10000 объёмом, самая большая 5000 и 2 по 2500 в рамках 1 матчинга(а если полный лог получали бы то ещё бы могли коллеге отправить что был ордер 10000 и его цену(если она была)) но Вам ведь тратится на данные не зачем Вам бы подписку платную оформить).
Сделок до заявки не бывает. Сделка происходит тогда когда мейкерскую заявку(которая стоит в стакане) исполняет заявка тейкерская/рыночная/агрессивная/или любое аналогичное по сути(применительно к этой ситуации) слово. Не бывает «сделок до заявок». Мейкерская заявка может стоять в стакане вечно пока её не исполнит тейкерская и только этот момент будет называться сделка.
Как Вы пишете софт для трейдинга и готовы брать за него деньги, при этом таких банальных вещей не знаете и не готовы даже заплатить за данные бирже чтобы получать полный лог например?
1)Что была заявка в 10000 кинута в рынок(да полный ордерлог покажет)
2)или одну сделку в 5000 штук
(я писал выше):
вот пример как могло бы выглядет это в полном ордерлоге
То есть у Вас есть одинаковое время у всех сделок которые сведены в рамках 1 матчинга и у Вас есть номер ордеров этих сделок по которому можно агрегировать как только вздумается(о чём я писал выше). Поэтому если у Вас нет полного лога и Вы экономите на нём(делая платные подписки) то Вы можете агрегировать по времени т.к. в рамках 1 матчинга если объём «аномальный»(особенно если инструмент не сильно активный) то крайне редко будет что тейкерских ордера несколько, но даже если и будет то т.к. это «атомарная ситуация» какая разница 1 тейкерский был в конкретно эту наносекунду или 5. Вы этот объём агрегируете и всё это ровным счётом ни на что не влияет(ну может для Шелдона Купера это и имело бы значение учитывая его пристрастия но в этой ситуации ничего не меняет). А в полном логе(как я Вам написал выше) есть номер ордера по нему со 100% точностью сможете агрегировать то что Вам нужно. Поэтому на этот коментарий:
ответ в 2 вариантах(с полным логом или с обезличиными сделками(которые у Вас есть) и так и так Вы можете сделать аггрегированные сделки) Надеюсь теперь понимаете как это сделать.
!!! Без полного ордерлога тоже можно, как написано(2 раза) выше.
EgorRepnikov, Спасибо. Я бы попробовал поискать ещё большие объёмы в сделках в области уровня. К примеру, многократно видел, как большие аски стояли на протяжении нескольких дней. К ним подходили, разбирали. Но не проносили. Айсберги только в путь так ставят, особенно их двигают туда сюда, чтоб не так очевидно было.
И вот однажды приходит покупатель, который разбирает все эти аски, и цена просто улетает. Глазами такое можно искать, но трудоёмко, а вот робота было б неплохо. Но вот конкретный алгоритм надо думать.
Ну и много чего ещё поискать можно.
Вообщем, рекомендую продолжать, тема интересная, но долгая)
Понимаете почему так делать(… анализировать по отдельности...) плохая идея? Правильно. Потому что если например взять тонкий стакан(который может быть ещё и разреженым) и большим тейкерским ордером по нему жахнуть то цена улетит в космос(или в ад в зависимости от направления ордера) а подписчик в телеге это никак не ощутит.(т.е. ордер с большим объёмом исполнил 500 ордеров по 1 контракту(будет 500 сделок по 1 контракту в один момент времени а для Вашего бота это не покажется особенным т.к. объём меньше некуда))
Ему ведь не важно большой объём был 1 тейкерским ордером или 1000 ему важно значения этого объёма в период времени и как этот объём повлиял на цену. А у Вас цена улетит и будет большой объём(чего Вы изначально и объявляли в тексте поста) но об этом никто не узнает. Поэтому можете начинать пилить эту тему(меня благодарить не обязательно, это я Вам написал не чтобы улучшить Ваш софт а просто «указать на Вашу ошибку»)
ПС:
Ещё раз напишу а то вдруг не сообразили. У Вас пост называется:
если не агрегировать то некоторые аномальные движения цены и объёма Вы не увидите(и подписчики тоже) что будет отрицательно коррелировать с самой идеей Вашего поста/софта.(но это конечно не будет мешать Вам зарабатывать на подписках, поэтому если Вы писали пост чтобы получить обратную связь то то что я Вам написал в нескольких сообщениях это она и есть можете делать)