Разработка торгового робота для Московской биржи: MOEX API + Tinkoff Invest API

Торговый робот для Московской биржи — это автоматизированная система, которая получает рыночные данные через MOEX ISS API, формирует торговые сигналы по ансамблю стратегий и исполняет заявки через Tinkoff Invest API без участия трейдера. Разработка занимает от 3 до 6 месяцев и включает модуль аналитики, оптимизатор параметров и полноценный бектест на исторических данных.

Что нужно было сделать: задача клиента

Клиент торговал на Московской бирже вручную — 4–5 часов в день у монитора, стресс в периоды волатильности и постоянное запаздывание относительно рынка. Были накоплены наработки на Python: несколько торговых стратегий, базовый сбор котировок, черновик оценки макрофакторов. Но единой системы не было: стратегии не согласовывались между собой, параметры подбирались вручную, бектест делался в Jupyter-ноутбуках и не воспроизводился автоматически.

Боли клиента были конкретными: просадки до 18% на одиночных позициях из-за отсутствия автоматического риск-менеджмента, потеря сигналов при неустойчивом соединении, невозможность одновременно вести более 3 инструментов. Плюс отсутствие аудита решений — не было журнала, почему та или иная заявка была выставлена.

Как мы декомпозировали задачу

Система разбита на два независимых модуля с чёткой границей: Analytics Engine (аналитика и генерация сигналов) и Execution Engine (исполнение через Tinkoff Invest API). Такая архитектура позволяет менять брокера без переписывания аналитики и тестировать стратегии в изолированной среде без реальных денег на счёте.

Архитектура: два модуля, одна система

Модуль 1: Analytics Engine — аналитика и генерация сигналов

Источник данных — MOEX ISS REST API (Moscow Exchange Information & Statistics Server). Исторические свечи, стаканы, торговые объёмы, индексы секторов — всё сохраняется в PostgreSQL с дедупликацией и валидацией. Сбор идёт в 5 параллельных потоках, задержка получения тика — менее 200 мс от момента публикации на бирже.

Блок очистки данных убирает аномальные свечи (gap > 3σ), восстанавливает пропуски торговых дней через интерполяцию и маркирует корпоративные события (дивидендные отсечки, сплиты). Без этого любая стратегия даёт ложные сигналы на исторических данных.

Оценка макрофакторов — отдельный компонент, который агрегирует индекс РТС, ставку ЦБ, данные по нефти Urals и курс рубля. Он формирует «рыночный режим» (трендовый, боковик, высокая волатильность), который влияет на выбор активных стратегий.

Ансамбль стратегий включает 4 независимых алгоритма: трендовый (EMA-crossover с адаптивным периодом), реверсионный (Bollinger Bands + RSI), объёмный (VWAP-deviation) и гибридный (комбинация сигналов первых трёх с весами, которые обновляются еженедельно). Оркестратор собирает сигналы, взвешивает их по исторической точности каждого алгоритма на конкретном инструменте и передаёт консолидированный сигнал в модуль исполнения.

Оптимизатор параметров запускается каждое воскресенье: берёт последние 90 дней данных и перебирает 200–400 комбинаций параметров по каждой стратегии через Optuna (байесовская оптимизация). Весь цикл оптимизации занимает 35–40 минут на стандартном VPS с 4 ядрами.

Модуль 2: Execution Engine — исполнение через Tinkoff Invest API

Сигналы из Analytics Engine приходят через внутреннюю очередь (Redis Streams). Блок оценки рисков проверяет каждый сигнал по 7 критериям перед выставлением заявки: лимит на инструмент (не более 15% портфеля), лимит на сектор, максимальная дневная просадка, ликвидность (минимальный объём за 20 дней), корреляция с уже открытыми позициями, расхождение с фундаментальной оценкой, текущий рыночный режим.

Tinkoff Invest API v2 (gRPC) используется для выставления заявок. Исполнитель поддерживает лимитные и рыночные ордера, отслеживает статусы через стрим, обрабатывает частичное исполнение и автоматически перевыставляет заявки при таймауте. Среднее время от сигнала до подтверждённой заявки — 80–120 мс.

Обратная связь — критичный компонент: каждая исполненная заявка с фактической ценой, слиппажем и комиссией записывается обратно в Analytics Engine. Это позволяет обновлять веса ансамбля стратегий на реальных, а не синтетических данных.

Бектестирующий модуль воспроизводит исторические торговые дни с реальными спредами и задержками исполнения. Отчёт включает 12 метрик: Sharpe Ratio, Sortino Ratio, максимальная просадка, коэффициент Кальмара, среднее время в позиции, процент прибыльных сделок, фактор прибыли и другие.

Этапы разработки и сроки

  1. Анализ наработок и проектирование архитектуры — 2 недели. Аудит существующего Python-кода, выбор технологического стека, проектирование схемы базы данных, согласование интерфейсов между модулями.
  2. Инфраструктура и сбор данных — 3 недели. Настройка PostgreSQL + TimescaleDB, реализация коллектора MOEX ISS API, пайплайн очистки и валидации данных, мониторинг через Grafana.
  3. Analytics Engine — 5–6 недель. Реализация 4 стратегий, блока макрооценки, оркестратора ансамбля, оптимизатора на Optuna, бектестинговой среды.
  4. Execution Engine + Tinkoff API — 4 недели. Интеграция Tinkoff Invest API v2 (gRPC), риск-менеджер, исполнитель заявок, обратная связь, журнал аудита.
  5. Интеграционное тестирование и paper trading — 3–4 недели. Тестирование на демосчёте, нагрузочные тесты, проверка поведения при обрывах соединения, сверка P&L с ручными расчётами.
  6. Деплой и сдача — 1–2 недели. Разворачивание на VPS-сервере клиента, настройка автоматического рестарта, обучение по использованию дашборда, передача документации.

Сколько стоит разработка торгового робота для MOEX в 2026 году

Рынок разработки алготрейдинговых систем для Московской биржи в 2026 году сегментирован по сложности. Простой робот на одну стратегию с исполнением через QUIK-lua обойдётся в 80 000–150 000 рублей. Система среднего уровня — несколько стратегий, API-интеграция, базовый риск-менеджмент — от 250 000 до 500 000 рублей. Полноценная модульная платформа с ансамблем стратегий, оптимизатором и бектестом — от 500 000 до 1 200 000 рублей.

На цену влияют: количество торговых инструментов (1 vs 20+ бумаг), глубина бектестинговых данных (3 года vs 10 лет), требования к задержке исполнения (обычный API vs colocation), наличие собственного кода у клиента (снижает стоимость на 20–35%), сложность риск-модели и требования к отчётности.

КритерийЗаказная разработкаГотовые платформы
Стоимостьот 300 000 руб.0–30 000 руб./год
Собственные стратегииЛюбыеОграниченный выбор
MOEX ISS + Tinkoff APIНативная интеграцияЧастичная или нет
Оптимизатор параметровBayesian (Optuna)Grid search или нет
Журнал аудита решенийПолныйОбычно отсутствует
МасштабированиеПод ваши задачиВ рамках платформы

Технологии: что использовали и почему

Python как основной язык алготрейдинга

Python — де-факто стандарт для алготрейдинга: богатая экосистема (pandas, numpy, ta-lib, Optuna), готовые SDK для MOEX и Tinkoff, скорость прототипирования стратегий. Критичные по латентности компоненты (исполнитель заявок) написаны с использованием asyncio и uvloop, что даёт производительность, сопоставимую с Go-решениями для данного класса задач.

MOEX ISS API vs платные альтернативы

Источник данныхСтоимостьИсторияЗадержка
MOEX ISS APIбесплатно10+ лет~1 сек
MOEX ALGOPACKот 5 000 руб./мес5 лет~100 мс
Финам APIбесплатно (клиентам)5 лет~500 мс
Платные провайдерыот 30 000 руб./мес20+ летмс

Для большинства розничных стратегий MOEX ISS API достаточен — 10 лет истории, все инструменты, бесплатно. ALGOPACK имеет смысл при HFT-стратегиях с требованием задержки менее 200 мс.

Tinkoff Invest API: gRPC vs REST

Tinkoff Invest API v2 предлагает оба варианта, но gRPC-интерфейс даёт на 40–60% меньшую задержку при подписке на стримы котировок. Для нашего кейса это снизило среднее время цикла «сигнал → заявка → подтверждение» со 180 до 95 мс. Официальная Python-библиотека tinkoff-investments поддерживает оба протокола.

TimescaleDB для временных рядов

Обычный PostgreSQL замедляется на запросах типа «свечи за последние 500 дней по 50 инструментам». TimescaleDB — расширение PostgreSQL с гипертаблицами — ускоряет такие запросы в 5–20 раз за счёт партиционирования по времени. При этом остаётся полная совместимость с SQL и стандартными ORM.

Частые вопросы

Можно ли подключить систему к другому брокеру, не только Тинькофф?

Да. Модульная архитектура предполагает замену Execution Engine без изменения Analytics Engine. После Тинькофф популярные варианты — Финам (TRANSAQ API), ВТБ Мои Инвестиции и БКС. Стоимость адаптации под второго брокера — около 30–40% от стоимости первичной разработки Execution Engine.

Нужна ли лицензия ЦБ для работы торгового робота?

Нет, если робот управляет только вашим собственным счётом. Лицензия требуется только при управлении чужими средствами (доверительное управление). Автоматическое выставление заявок через API для собственного счёта — это обычная торговая активность в рамках договора с брокером.

Сколько времени занимает бектест на 5 годах данных?

Бектест одной стратегии по одному инструменту на 5 годах дневных свечей — 3–8 секунд. На минутных свечах — 40–120 секунд. При запуске оптимизатора (200 итераций, 4 стратегии, 10 инструментов, минутные свечи) полный цикл — около 35 минут на VPS с 4 vCPU. Параллельная обработка через joblib сокращает время примерно втрое.

Что происходит при обрыве соединения с биржей в открытой позиции?

Watchdog-процесс контролирует heartbeat gRPC-соединения. При обрыве — 3 попытки переподключения с экспоненциальным backoff (1, 4, 9 секунд). Если не удалось — рыночная заявка на закрытие всех позиций через резервный REST-канал. Уведомление об инциденте в Telegram — в течение 10 секунд.

Чем мы можем помочь

Сбор и очистка данных MOEX ISS API
Ансамбль торговых стратегий на Python
Оптимизатор параметров (Optuna)
Интеграция Tinkoff Invest API v2 (gRPC)
Риск-менеджмент и оценка портфеля
Бектестирование с реальными спредами

Что входит в разработку

  • 01
    Analytics Engine
    Сбор данных через MOEX ISS API, очистка аномалий, оценка макрофакторов (ставка ЦБ, нефть, РТС), ансамбль из 4 стратегий с оркестратором и еженедельной оптимизацией параметров через Optuna.
  • 02
    Execution Engine
    Риск-менеджмент по 7 критериям, исполнитель заявок через Tinkoff Invest API v2 (gRPC), обработка частичного исполнения, автоматическое перевыставление при таймауте, полный журнал аудита.
  • 03
    Бектест и оптимизация
    Воспроизведение торговых дней с реальными спредами и задержками. Отчёт по 12 метрикам: Sharpe, Sortino, максимальная просадка, коэффициент Кальмара, процент прибыльных сделок.
  • 04
    Инфраструктура и мониторинг
    PostgreSQL + TimescaleDB для временных рядов, Redis Streams как очередь сигналов, Grafana-дашборд, watchdog с уведомлениями в Telegram при сбоях соединения.

Преимущества нашего подхода

Модульность
Аналитика и исполнение разделены — можно менять брокера или добавлять стратегии без переработки всей системы.
Используем ваш код
Аудируем существующие Python-наработки и интегрируем в новую архитектуру. Сокращает стоимость разработки на 20–35%.
gRPC вместо REST
Tinkoff Invest API через gRPC даёт на 40–60% меньшую задержку. Цикл «сигнал → заявка» — 80–120 мс вместо 180 мс на REST.
Полный аудит решений
Каждая заявка логируется с причиной выставления, ценой, слиппажем и комиссией. Журнал помогает дорабатывать стратегии на реальных данных.

Частые вопросы

Можно ли подключить другого брокера, не только Тинькофф?
Да. Execution Engine можно заменить без изменений в Analytics Engine. Поддерживаем адаптацию под Финам (TRANSAQ API), ВТБ Мои Инвестиции и БКС. Стоимость адаптации — 30–40% от разработки первого Execution Engine.
Нужна ли лицензия ЦБ для торгового робота?
Нет, если робот управляет вашим собственным счётом. Лицензия требуется только при управлении чужими средствами (доверительное управление). Автоматические заявки через API — обычная торговая активность в рамках договора с брокером.
Сколько времени занимает бектест на 5 годах данных?
Бектест одной стратегии на 5 годах дневных свечей — 3–8 секунд. На минутных — 40–120 секунд. Полный цикл оптимизатора (200 итераций, 4 стратегии, 10 инструментов) — около 35 минут на VPS с 4 vCPU.
Что происходит при обрыве соединения с биржей?
Watchdog контролирует heartbeat gRPC-соединения. 3 попытки переподключения с backoff (1, 4, 9 сек). При неудаче — рыночная заявка на закрытие всех позиций через резервный REST-канал. Уведомление в Telegram — за 10 секунд.