Блог им. EgorRepnikov

Я сделал бота для отслеживания аномальных событий на фондовом рынке

Всем привет, меня зовут Егор. По профессии я программист, но уже давно занимаюсь торговлей на рынке акций. Соответственно, ряд моих 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. Там есть отдельная команда с описанием и инструкциями, где можно получить всю дополнительную информацию для понимания принципов работы бота. В следующих статьях могу рассказать подробнее про более специфичные моменты разработки проекта. А на этом я закончу. Всем пока.

 

★9
28 комментариев
Народу в основном нужна кнопка бабло, а не аномальщина.
avatar
проблема в том что это могут быть адресные сделки… их проводят через стакан чисто формально
avatar
  
avatar
__rtx, ой ну да лана… возьмем интерактив брокерс… там каждый день в 8:00 спайк… на начале торгов в том же qqq или spy например… ну думаю халява… поставлю лимитки в обе стороны и поймаю спайк легко… а никуя… свеча есть а сделок нет… т.е спайк рисуется по адресным сделкам или внебержевым… а реально сделок нет... 

цыгане? 
avatar
  
avatar
И вот ведут меня на суд,
А судьи яйцами трясут:
«ПОЛГОДА, бля, ПОЛГОДА, бля,
ПОЛГОДА!»
avatar
Автор, а выявленные аномалии приносят биржевой доход?
Воронов Дмитрий, выявление аномалий не может приносить биржевой доход — это вспомогательный инструмент при принятии решений. Доход или убыток приносят непосредственно ваши действия на рынке.
Бот в свою очередь может помогать в принятии решений в трейдинге: повышенный объем указывает на интерес к активу, а, допустим, аномальные заявки в стакане на возможность появления нового уровня поддержки или сопротивления. Ряд подобных индикаторов в совокупности может уже с большей вероятностью указывать на потенциальное движение цены актива.
Надеюсь, я ответил на ваш вопрос.
avatar
EgorRepnikov, переформулирую вопрос: кому-либо (может быть Вам) удалось заработать на бирже при помощи Вашего бота?
Воронов Дмитрий, боюсь, пока не могу поделиться такими отзывами от аудитории — я только начал продвигать проект.
avatar
  
avatar
по MOEX API:  на текущий момент можно бесплатно оформить подписку к ALGOPACK и получать данные без задержки по времени. 
avatar
Вот это pet-project! Круто! Респектую!
avatar
  
avatar
  
avatar
__rtx,
Нужно смотреть на события в совокупности и уже на основе многих факторов принимать решение — это же очевидно, что нет волшебной таблетки.
А как быть с айсбергами, спуфингом и т.п.? Как же любят инфоцыгане называть «порнуху» «проектом или продуктом» и на вопросы зарабатывает ли такая чушь хоть что-то, отвечать:

В боте бесплатно доступна возможность подписаться на все события по всем голубым фишкам Мосбиржи. То есть человеку может даже не потребоваться платная подписка, если он не торгует условно вторым эшелоном. Условия максимально демократичные. Человек, который знает что делает легко найдет применение инструменту или просто не будет его использовать — никто никому ничего не впаривает.
Тогда зачем нужен этот бот, если доход или убыток приносят непосредственно ваши действия на рынке? Ах да забыл чтобы инфоцыган зарабатывал:

У вас какой-то бзик на инфоцыганах, судя по всему, раз вы и меня к ним приплели. Первую статью написал, чтобы рассказать о своем проекте, и уже инфоцыган.
avatar
  
avatar
Это всё очень хорошо. Что у вас подразумевается под сделкой? Скажем одной заявкой на 10000 бьют в аск 250. Она исполняется об цену 250- 2500 штук, потом об 251 5000 штук, и об 252 оставшиеся 2500 штук. Бот мне что покажет? Что была заявка в 10000 кинута в рынок, или одну сделку в 5000 штук? Иначе — аггрегируются ли сделки до заявки?
avatar
shprots, 
… аггрегируются ли сделки до заявки

А это как?
avatar
shprots, нет, сделки до заявки не аггрегируются. Я могу получить доступ только к обезличенному набору совершенных сделок. То есть то, что вы перечислили — это набор отдельных сделок, которые бот будет анализировать по отдельности.
avatar
EgorRepnikov, 
… Я могу получить доступ только к обезличенному набору совершенных сделок...

У сделок которые описал коллега будет одинаковое время(т.к. они исполнены рыночным ордером в рамках 1 матчинга) поэтому их можно присылать в телегу хоть аггрегированными хоть частями и любым другим способом который Вам нравится(например отправить что было 3 сделки 10000 объёмом, самая большая 5000 и 2 по 2500 в рамках 1 матчинга(а если полный лог получали бы то ещё бы могли коллеге отправить что был ордер 10000 и его цену(если она была)) но Вам ведь тратится на данные не зачем Вам бы подписку платную оформить).
… сделки до заявки не аггрегируются...

Сделок до заявки не бывает. Сделка происходит тогда когда мейкерскую заявку(которая стоит в стакане) исполняет заявка тейкерская/рыночная/агрессивная/или любое аналогичное по сути(применительно к этой ситуации) слово. Не бывает «сделок до заявок». Мейкерская заявка может стоять в стакане вечно пока её не исполнит тейкерская и только этот момент будет называться сделка.

Как Вы пишете софт для трейдинга и готовы брать за него деньги, при этом таких банальных вещей не знаете и не готовы даже заплатить за данные бирже чтобы получать полный лог например?
avatar
__rtx, вы не поняли ни вопрос пользователя shprots ни мой ответ. Человек спросил, объединяет ли бот сделки до одной заявки. «До» — значит не ранее по времени, а видит ли бот связь между несколькими совершенными сделками, которые присутствовали в стакане в рамках одной заявки. Я отвечал на этот вопрос.
avatar
EgorRepnikov, если Вы почитаете внимательно что я писал выше то увидите что там есть ответы на все вопросы(и на тот который я сначала не понял) и на:
… Бот мне что покажет? Что была заявка в 10000 кинута в рынок, или одну сделку в 5000 штук? Иначе — агреггируются ли сделки до заявки...

1)Что была заявка в 10000 кинута в рынок(да полный ордерлог покажет)
2)или одну сделку в 5000 штук
(я писал выше):


… поэтому их можно присылать в телегу хоть агрегированными хоть частями и любым другим способом который Вам нравится(например отправить что было 3 сделки 10000 объёмом, самая большая 5000 и 2 по 2500 в рамках 1 матчинга(а если полный лог получали бы то ещё бы могли коллеге отправить что был ордер 10000 и его цену(если она была))...

вот пример как могло бы выглядет это в полном ордерлоге

направление |момент |номер ордера|действие|цена в ордере|объём в ордере|номер сделки|цена сделки
B 2024.20.11 10:00:00.000123456 33948496097 1 999.00000 10000
B 2024.20.11 10:00:00.000123456 33948496097 2 999.00000 2500 10001 250.00000
S 2024.20.11 10:00:00.000123456 33948495970 2 250.00000 2500 10001 250.00000
B 2024.20.11 10:00:00.000123456 33948496097 2 999.00000 5000 10002 251.00000
S 2024.20.11 10:00:00.000123456 33948491768 2 251.00000 5000 10002 251.00000
B 2024.20.11 10:00:00.000123456 33948496097 2 999.00000 2500 10003 252.00000
S 2024.20.11 10:00:00.000123456 33948491768 2 252.00000 2500 10003 252.00000


*действие:
1 — новый ордер
2 — сделка
0 — отмена ордера


То есть у Вас есть одинаковое время у всех сделок которые сведены в рамках 1 матчинга и у Вас есть номер ордеров этих сделок по которому можно агрегировать как только вздумается(о чём я писал выше). Поэтому если у Вас нет полного лога и Вы экономите на нём(делая платные подписки) то Вы можете агрегировать по времени т.к. в рамках 1 матчинга если объём «аномальный»(особенно если инструмент не сильно активный) то крайне редко будет что тейкерских ордера несколько, но даже если и будет то т.к. это «атомарная ситуация» какая разница 1 тейкерский был в конкретно эту наносекунду или 5. Вы этот объём агрегируете и всё это ровным счётом ни на что не влияет(ну может для Шелдона Купера это и имело бы значение учитывая его пристрастия но в этой ситуации ничего не меняет). А в полном логе(как я Вам написал выше) есть номер ордера по нему со 100% точностью сможете агрегировать то что Вам нужно. Поэтому на этот коментарий:

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


ответ в 2 вариантах(с полным логом или с обезличиными сделками(которые у Вас есть) и так и так Вы можете сделать аггрегированные сделки) Надеюсь теперь понимаете как это сделать.

!!! Без полного ордерлога тоже можно, как написано(2 раза) выше.
avatar

EgorRepnikov, Спасибо. Я бы попробовал поискать ещё большие объёмы в сделках в области уровня. К примеру, многократно видел, как большие аски стояли на протяжении нескольких дней. К ним подходили, разбирали. Но не проносили. Айсберги только в путь так ставят, особенно их двигают туда сюда, чтоб не так очевидно было.
И вот однажды приходит покупатель, который разбирает все эти аски, и цена просто улетает. Глазами такое можно искать, но трудоёмко, а вот робота было б неплохо. Но вот конкретный алгоритм надо думать.

Ну и много чего ещё поискать можно.

Вообщем, рекомендую продолжать, тема интересная, но долгая)

avatar
EgorRepnikov, 
… То есть то, что вы перечислили — это набор отдельных сделок, которые бот будет анализировать по отдельности...

Понимаете почему так делать(… анализировать по отдельности...) плохая идея? Правильно. Потому что если например взять тонкий стакан(который может быть ещё и разреженым) и большим тейкерским ордером по нему жахнуть то цена улетит в космос(или в ад в зависимости от направления ордера) а подписчик в телеге это никак не ощутит.(т.е. ордер с большим объёмом исполнил 500 ордеров по 1 контракту(будет 500 сделок по 1 контракту в один момент времени а для Вашего бота это не покажется особенным т.к. объём меньше некуда))

Ему ведь не важно большой объём был 1 тейкерским ордером или 1000 ему важно значения этого объёма в период времени и как этот объём повлиял на цену. А у Вас цена улетит и будет большой объём(чего Вы изначально и объявляли в тексте поста) но об этом никто не узнает. Поэтому можете начинать пилить эту тему(меня благодарить не обязательно, это я Вам написал не чтобы улучшить Ваш софт а просто «указать на Вашу ошибку»)

ПС:
Ещё раз напишу а то вдруг не сообразили. У Вас пост называется:
Я сделал бота для отслеживания аномальных событий на фондовом рынке

если не агрегировать то некоторые аномальные движения цены и объёма Вы не увидите(и подписчики тоже) что будет отрицательно коррелировать с самой идеей Вашего поста/софта.(но это конечно не будет мешать Вам зарабатывать на подписках, поэтому если Вы писали пост чтобы получить обратную связь то то что я Вам написал в нескольких сообщениях это она и есть можете делать)
avatar
Уже есть такой у одного чела в телеге и бесплатный, а идея бесполезная, так как никто сейчас не покупает крупными заявками по рынку, он маскирует их с дневной нормой. И растягивает на долгий срок.
Код в открытом доступе есть?

теги блога EgorRepnikov

....все тэги



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