Через тернии к звёздам: история создания торгового алгоритма
С чего всё начиналось
Автоматизация биржевых процессов и разработка сигнальных алгоритмов — это не спонтанная идея, а результат многолетней инженерной и научной работы.
Всё началось ещё в 2015 году, когда мы впервые занялись автоматизацией биржевой торговли, создав собственное API на Python для подключения к брокеру ZuluTrade. На тот момент это была одна из немногих систем, где можно было экспериментировать с автоматизацией через REST API и автоследованием.
Это была наша первая целенаправленная инженерная попытка разработать роботов для автоследования, которые автоматически принимали решение и совершали сделки на основе анализа ценовых рядов. Это заняло почти два года, но проект дал нам первый практический опыт работы с реальными биржевыми данными и брокерскими системами.
Именно тогда впервые появилась мысль — важно не просто «дойдёт ли цена», а «как именно она туда дойдёт?» Мы всерьёз надеялись, что нейросети помогут ответить на этот вопрос (спойлер: не помогли). После месяцев экспериментов стало ясно, что классические методы для «живых» торгов работают стабильнее, предсказуемее и быстрее. Но в защиту нейросетевого подхода стоит отметить, что с помощью ИИ можно гораздо быстрее проводить анализ сентимента рыночных новостей и фундаментальный анализ компаний.
Позднее мы разработали PriceGenerator — платформу для генерации тестовых биржевых данных. На выходе получаются цены, статистически подобные реальным, и даже их графики очень похожи на графики настоящих акций. Это позволяет воспроизводить поведение рынка в условиях, когда реальная история недоступна или не подходит под конкретные требования алгоритма. Платформа стала следующим шагом: необходимым инструментом для тестирования торговых алгоритмов и анализа динамики цен.
К 2020 году стало очевидно: нужно создать собственную платформу, адаптированную для работы через российских брокеров. Так началась разработка TKSBrokerAPI — лёгкого и гибкого Python API для автоматизации торговых сценариев.
Эксперименты: от наблюдений к формализованной логике
Работа над математикой для алгоритмов и торговой логикой для биржевых роботов велась по различным направлениям:
- анализ изменения цен;
- выделение характерных типов трендов;
- попытки формализовать риск и достижимость цели.
Выделение базовых типов трендов на реальных графиках
Изначально всё было, в буквальном смысле, в дорожных набросках: графики цены, разбитые на интервалы, простые типы трендов, формулы оценки риска в зависимости от положения цены в свече. Причём любые формулы сразу закладывались с расчётом на дальнейшую автоматизацию. Все идеи, что приходили в голову, в дороге, в путешествиях, по пути на работу, сразу же фиксировались на планшете.
На ранних этапах работы мы пытались определить, какие типы движений цены чаще всего встречаются на реальных рынках. Первые наброски представляли собой простую схему двух основных типов трендов, каждый из которых мог проявляться в двух видах.
- Восходящий тренд:
• небольшое снижение цены, за которым следует устойчивый рост;
• быстрый рост цены с последующим коротким откатом. - Нисходящий тренд:
• небольшой рост, за которым следует уверенное падение;
• быстрое падение с последующим небольшим восстановлением.
В дальнейшем от типа и вида реального тренда зависел способ входа в позицию алгоритмом: отложенным ордером, либо немедленный вход в позицию маркет-ордером.
Рынок редко движется идеально ровно. Почти всегда есть шумы, выбросы, микроколебания — их также нужно учитывать при моделировании.
Эти наблюдения стали основой логики принятия решений и помогли сформировать базовую структуру будущего трейдингового алгоритма.
Оценка рисков и достижимости целей
Следующим важным шагом стало понимание: недостаточно просто классифицировать движение цены. Необходимо научиться оценивать силу сигналов, риск открытия позиции и вероятность достижения цели.
В первых черновиках появились формулы нечёткой оценки риска: оценивая, где находится текущая цена относительно границ свечей различных интервалов (минимума, максимума, открытия и закрытия), можно было приблизительно определить вероятность движения в нужную сторону.
Параллельно строились модели нечёткой оценки достижимости цели: если прогнозная точка находилась далеко от текущей цены, вероятность достижения снижалась. Если близко — возрастала.
Также мы экспериментировали с реконструкцией графика цены по нечёткому прогнозу: если известны сила и направление сигнала, можно механически восстановить тело и тени очередной прогнозной свечи. Построив ряд таких свечей можно было визуально проверить достижимость цели, а также как будет выглядеть прогноз при разных вариантах движения. Простейшие формулы, основанные на вычислении центра будущей свечи и предполагаемом нечётком размере тела и теней, стали основой для генерации реалистичных прогнозов.
Построение матрицы рисков
Чтобы упростить алгоритм и перейти от отдельных числовых оценок к системной модели принятия решений, мы начали строить матрицу рисков на основе нечётких оценок. Это позволило перейти от «ощущений трейдера» к формализованным решениям, оставаясь при этом интуитивно понятными.
Идея была в том, чтобы объединить:
- вероятность достижения цели;
- оценку текущего риска позиции;
- и субъективную оценку желательности открытия, закрытия или удержания сделки в текущих условиях.
На этом этапе появились первые наброски нечёткой матрицы принятия решений. По её столбцам отсчитывался нечёткий уровень риска, по строкам — нечёткая вероятность достижения цели, а на пересечении определялся ответ, да или нет (True или False), в зависимости от вопроса: мы желаем открыть (или усреднить), либо закрыть (или удержать) позицию.
Матрица уже позволяла автоматически принимать решения, не полагаясь только на интуицию, но оставаясь понятной человеку.
Разработка платформы TKSBrokerAPI
Параллельно с работой над торговым алгоритмом мы начали разрабатывать TKSBrokerAPI — универсальную платформу для взаимодействия с брокером и написания торговых и аналитических сценариев на Python.
Целью было создание лёгкого и расширяемого API, который:
- подключался к брокерскому счёту через REST API;
- собирал и обрабатывал биржевые данные;
- запускал торговые сценарии, оформленные в виде модулей Python.
Изначально платформа задумывалась как техническая прослойка для упрощения сбора данных и аналитики, но быстро превратилась в полноценную базу для автоматизации торговли.
Благодаря платформе стало возможным:
- запрашивать текущие цены, объёмы и параметры инструментов;
- управлять позициями и ордерами;
- собирать аналитику по портфелю;
- формировать отчёты в Markdown/HTML;
- и встраивать запуск сценариев в CI/CD-конвейер.
Постановка задачи прогнозирования
Когда общие наброски и принципы стали ясны, пришло время сформулировать задачу. На одном из первых черновиков мы впервые формализовали многокомпонентную постановку задачи так:
- реализовать прогнозирование цен для шести таймфреймов (5 минут, 15 минут, 1 час, 1 день, 1 неделя, 1 месяц);
- провести оптимизацию количества инструментов для максимизации доходности;
- исследовать и выявить наилучшие комбинации вложенных интервалов таймфреймов;
- выбрать наиболее надёжные пары таймфреймов для прогноза.
Именно в этот момент стало понятно: для стабильной работы алгоритма нужно строить вероятностные модели на разных временных таймфреймах и для различных горизонтов.
Финальная схема: как родился алгоритм
Вершиной всей нашей работы стала финальная схема, над которой мы корпели несколько месяцев, исчеркав и удалив с доски не один вариант.
- анализ ценовых рядов (очистка аномалий методом Хампеля, расчёт базовых статистик);
- определение канала волатильности (через Bollinger Bands);
- построение прогнозов (расчёт волатильности и нечёткая оценка силы сигнала);
- оценка достижимости цели (статистика и теория вероятностей);
- некоторые проверки возможности открытия позиции (проверка цен в стакане, проверка объёмов на аномальность);
- некоторые базовые правила управления капиталом (Money Management Rules).
Метод построения прогнозов и оценка достижимости цели стали ключевыми шагами для создания сигнального алгоритма. А созданная нами теоретическая база стала основой для дальнейшей реализации и тестирования алгоритма в реальной торговле. Сам алгоритм принятия решений был описан далее в табличном виде как свод правил открытия и закрытия сделок (таблицы Open / Close Rules).
… А ведь всё началось в далёком 2015-м году с одного графика цены на золото и желания автоматически проанализировать его и спрогнозировать будущее движение, его силу и целевые уровни. Когда смотришь на итоговую реализацию — даже не верится, сколько всего было сделано: исследований, экспериментов, моделирования, программирования и автоматизации …
Финализируя свой рассказ хочется сказать, что разработка торгового (и, вообще, любого нового) алгоритма — это не история про «озарение за одну ночь». Это результат долгой инженерной работы и анализа реальных данных, математического моделирования трендов и рисков, построение архитектуры и разработка надёжных автоматизированных систем. Платформы PriceGenerator и TKSBrokerAPI, сигнальный и торговый алгоритмы, реализованные нами, стали логическим продолжением всех этих этапов. И, как это часто бывает в инженерных проектах, каждое новое решение рождалось не мгновенно, а через множество набросков, тестов, ошибок и переосмыслений.
Что ещё почитать по теме разработки трейдинговых алгоритмов:
- «Что такое нечёткие измерительные шкалы»
- «Как находить аномалии в числовых рядах»
- «Как оценить вероятность достижения цели»
- «Как работает сигнальный алгоритм торгового робота»
- «PriceGenerator — платформа для генерации цен, похожих на настоящие биржевые графики»
- «TKSBrokerAPI — платформа для автоматизации торговых сценариев»