Play
online · 30 мин
Туториалы 14 мин чтения 08.10.2026

Алготрейдинг с нуля: от идеи стратегии до боевого робота на бирже

От идеи стратегии до боевого робота на бирже — четыре шага: выбор тренда или арбитража, бэктест на исторических данных, подключение к API и запуск в песочнице. Узнайте, как написать код, который сам торгует за вас.

Что такое алготрейдинг и как он работает на практике

  • Выбор стратегии: трендовая, арбитраж, статистический арбитраж — каждую проверяем на исторических данных.
  • Бэктест: библиотека Backtrader на Python, экземпляр Cerebro — сердце системы.
  • Подключение к бирже: T-Invest API (gRPC, песочница) или Binance API (REST, SIGNED-запросы).
  • Запуск: сначала в песочнице, потом на боевом контуре с минимальным капиталом и мониторингом.

Алготрейдинг — это способ торговли, при котором решения о покупке и продаже принимает программа, а не человек. Вместо того чтобы следить за графиком и нажимать кнопку в терминале, разработчик пишет код, который анализирует рынок и сам отправляет заявки на биржу. Цикл работы любого торгового робота состоит из трёх этапов: сначала формулируется стратегия — набор правил, по которым робот решает, когда войти в сделку и когда выйти. Затем стратегия проверяется на исторических данных: роботу дают прошлые цены и смотрят, сколько он заработал бы или потерял, если бы торговал по этим правилам. Этот этап называется бэктестом. И наконец, если стратегия показала приемлемые результаты, робота подключают к бирже через API — и он начинает исполнять сделки в реальном времени. Именно этот последний шаг, исполнение через API, и отличает алготрейдинг от ручной торговли: робот не просто подсказывает идеи, а сам выставляет заявки.

Как выбрать стратегию для алгоритмической торговли

Любой торговый алгоритм начинается не с кода, а с идеи о том, как именно робот будет зарабатывать. На практике все стратегии делятся на три базовых класса: трендовые (покупка на росте, продажа на падении), арбитражные (зарабатывание на разнице цен одного актива на разных биржах) и статистический арбитраж (парный трейдинг, когда торгуют расхождением коррелированных инструментов). У каждого класса своя логика входа в сделку, частота сигналов и требования к инфраструктуре. Выбор между ними — это не вопрос «что лучше», а вопрос что подходит под ваши ресурсы: доступные биржевые API, задержки канала, объём капитала и готовность писать сложный код.

Критерий Трендовая стратегия Арбитраж (классический) Статистический арбитраж
Сложность реализации Низкая Высокая Средняя
Частота сделок Низкая — средняя Высокая Средняя
Чувствительность к задержкам Низкая Критичная Средняя
Типичные инструменты Фьючерсы, акции Криптовалюты, ETF Акции, фьючерсы

Как проверить стратегию на исторических данных: бэктест с Backtrader

Прежде чем торговый робот получит доступ к реальному счёту, стратегию нужно проверить на исторических данных — это называется бэктест. Без него любая торговая идея остаётся гипотезой: мы не знаем, как алгоритм поведёт себя в прошлом рынке, на каких сделках сольёт депозит и где стратегия окажется убыточной. Backtrader — де-факто стандартная библиотека для таких задач в Python. Она предоставляет готовый цикл обработки баров, учёт комиссий, скользящие стопы и визуализацию результатов. Вместо того чтобы писать собственный движок с нуля, мы берём проверенный инструмент и концентрируемся на логике стратегии.

  1. Установить Backtrader и импортировать модули. Библиотека ставится через pip install backtrader. Мы используем основной пакет командой import backtrader as bt. На практике «сердцем» системы выступает экземпляр Cerebro, а для работы со стратегиями и данными в коде обращаются к соответствующим классам через импортированные модули, например bt.indicators или bt.feeds.

  2. Создать класс стратегии с методами __init__, next и опционально notify_order. В __init__ объявляются индикаторы — они вычисляются один раз на старте. next вызывается на каждом новом баре: здесь принимаются решения о входе/выходе. notify_order получает статус каждой заявки — помогает отлавливать неисполненные ордера и проскальзывания.

  3. Загрузить исторические свечи и настроить параметры брокера. Backtrader принимает данные через GenericCSVData или специализированные загрузчики (например, YahooFinanceData). В файле должны быть столбцы datetime, open, high, low, close, volume. Комиссия брокера задаётся через cerebro.broker.setcommission — по нашему мнению, для российского рынка типичное значение 0.05–0.1% от суммы сделки.

Ошибка look-ahead bias: использование будущих данных при формировании сигнала. Если в индикатор или условие входа попадает цена, которая в реальности была неизвестна на момент сделки, бэктест покажет ложную прибыль. Пример: вычисление максимальной цены за день на 5-минутном баре, когда бар ещё не закрыт. Решение — все индикаторы и сигналы строятся только на закрытых барах. В Backtrader это поведение по умолчанию, если не вызывать self.datas[0].close до завершения бара. Дополнительно проверяем, что в next не используется self.data.high[0] для текущего незакрытого бара — это и есть look-ahead.

Какие биржевые API доступны для торгового робота

Для разработки торгового робота на российском рынке мы используем T-Invest API (бывший Tinkoff Invest API), для международного — Binance API . Оба решения предоставляют доступ к биржевым данным и выставлению заявок, но различаются по протоколам. T-Invest работает через gRPC и REST: например, для заявок применяется метод PostOrder, а для исторических свечей — GetCandles. Мы учитываем, что T-Invest разграничивает «боевой» контур и «песочницу» для тестирования гипотез без вывода реальных заявок на биржу, что важно для надежности инфраструктуры алготрейдинга.

Параметр T-Invest API Binance API
Протокол gRPC (основной), REST (дополнительный) REST, WebSocket
Контуры Боевой и песочница Единый контур (тестовые сети — отдельно)

Выбирайте API под тот рынок, на котором планируете торговать. Разница в аутентификации критична: токен T-Invest проще, но требует хранения в защищённой среде; HMAC-подпись Binance сложнее в реализации, но не передаёт секрет напрямую.

Подключение к T-Invest API: песочница и боевой контур

У T-Invest два изолированных контура: песочница для тестирования гипотез без вывода заявок на биржу и боевой контур для реальной торговли. Токен доступа для каждого контура свой — их можно получить в личном кабинете T-Invest. Песочница полностью имитирует поведение биржи: вы получаете те же ответы, те же коды ошибок, но заявки не исполняются. Это позволяет отладить логику робота, не рискуя капиталом. Для подключения достаточно передать токен в gRPC-клиент. Единственное отличие — эндпоинт: для песочницы используется sandbox-invest-public-api.tinkoff.ru:443, для боевого — invest-public-api.tinkoff.ru:443. На этапе разработки мы всегда начинаем с песочницы и переключаем контур только после того, как стратегия прошла бэктест и отладку.

Подключение к Binance API: SIGNED-запросы и HMAC-SHA256

Никогда не храните API-ключи в коде и не передавайте через клиентский JavaScript. Ключи, попавшие в браузер, становятся публичными — любой сможет торговать с вашего счёта. Используйте серверную среду (Python-скрипт, NodeJS на бэкенде) или Electron, если нужен десктопный интерфейс. В production используйте переменные окружения или защищённое хранилище секретов.

Как получить исторические свечи для бэктеста через API

Разница не только в названии, но и в формате ответа: согласно документации T-Invest API, для фьючерсов цена может возвращаться в пунктах, а не в валюте расчётов, и если не учесть это на этапе загрузки, расчёт P&L будет некорректным. Мы всегда начинаем сбор с определения интервала и глубины — сколько свечей нужно и за какой период. Для дневных свечей по фьючерсу на индекс MOEX запрос к T-Invest API выглядит так: метод GetCandles используется для получения исторических свечей по инструменту, тело запроса — GetCandlesRequest.

Ответ приходит в виде массива свечей — каждая с open, high, low, close и volume. Но здесь кроется деталь, которую легко пропустить: для фьючерсов и облигаций цена в T-Invest API может возвращаться как в валюте расчётов, так и в пунктах цены. Например, фьючерс на доллар/рубль может вернуть значение 72450, что соответствует реальной цене контракта. Мы учитываем, что поле min_price_increment в инструменте определяет минимальный шаг цены в единицах валюты и используется для проверки корректности заявок. Если передать пункты в бэктестер без понимания специфики инструмента, стратегия может показать некорректный результат. Мы всегда сопоставляем полученные данные со спецификацией перед передачей в Backtrader.

Как выставить заявку на биржу через API робота

  1. Сформировать PostOrderRequest с обязательными полями: instrument_id (рекомендуется вместо deprecated figi), quantity — количество лотов в формате int64, price как Quotation или MoneyValue (целые единицы и нанодоли), direction — покупка или продажа, и order_type — лимитный или рыночный. Для рыночного ордера поле price не заполняется.
  2. Обработать ответ: проверить execution_report_status — согласно документации T-Invest API, статус EXECUTION_REPORT_STATUS_FILL означает, что заявка исполнена. Биржевой идентификатор order_id понадобится нам для отмены или отслеживания состояния поручения.

Типичная ошибка — робот отправляет заявку на фьючерс с quantity=1, думая, что это одна штука. В T-Invest API количество указывается в лотах, а размер лота задаётся параметром lot в описании инструмента. Почему — спецификация фьючерса может требовать лот в 10 или 100 контрактов — заявка на один лот будет исполнена на все контракты в лоте, а не на один. Как обойти — перед выставлением заявки через PostOrder запрашивайте данные об инструменте и читайте поле lot. Если lot = 10, то quantity=1 — это 10 контрактов. Всегда проверяйте этот параметр для фьючерсов и опционов.

Как запустить робота в песочнице и не потерять деньги

Песочница — это изолированный контур биржевого API, в котором заявки не уходят на реальный рынок. У T-Invest API она называется «песочница», у Binance — testnet. Баланс там виртуальный, но логика исполнения ордеров, коды ошибок и форматы запросов — те же, что в боевом контуре. Разница принципиальна: в песочнице робот может ошибиться без финансовых последствий. Задача этого этапа - не просто «проверить, что код компилируется», а убедиться, что алгоритм принимает решения, отправляет заявки и обрабатывает ответы так, как мы закладывали в стратегию. Без песочницы первый запуск на реальные деньги - это ставка на то, что в логике нет ни одной ошибки.

  1. Зарегистрировать отдельный токен для песочницы T-Invest или testnet-ключи Binance. В T-Invest API токен для песочницы выпускается в личном кабинете на отдельной вкладке - он не работает в боевом контуре. Для Binance testnet создаётся пара API-key + Secret-key через страницу testnet.binance.vision. Эти учётные данные используются только в песочнице, чтобы робот гарантированно не отправил заявку на биржу.

  2. Запустить робота на виртуальном капитале в песочнице с логированием каждой сделки. В T-Invest API предусмотрен отдельный контур для тестирования гипотез без вывода заявок на биржу. Мы создаем счет методом OpenSandboxAccount и пополняем его баланс через SandboxPayIn на необходимую сумму в рублях. Включаем пошаговое логирование: какой сигнал поступил от стратегии, какую заявку сформировал робот, какой ответ пришёл от API. Без логов при расхождении с ожиданиями мы не поймём, на каком шаге произошла ошибка.

  3. Сравнить результаты песочницы с бэктестом. Берём тот же временной отрезок, те же инструменты и ту же стратегию, что прогоняли на исторических данных в Backtrader. Если песочница показывает другую доходность, количество сделок или точки входа - ищем расхождение. Чаще всего проблема в разнице между модельным временем бэктеста и реальным потоком котировок, либо в неверной обработке статуса заявки («исполнена» против «в очереди»).

Никогда не используйте один и тот же токен для песочницы и боевого контура. T-Invest API и Binance testnet - это разные системы с разными балансами. Если робот случайно останется с боевым токеном в коде, он начнёт торговать реальными деньгами, даже если мы уверены, что запускаем тест. Правило простое: в переменные окружения кладём отдельные ключи для каждого контура, а в коде проверяем при старте, какой режим активен.

Как перевести робота на реальные деньги: первый запуск в прод

После недели в песочнице без ошибок и совпадения метрик с бэктестом можно переходить на реальный счёт. Алгоритм перестаёт быть гипотезой и начинает приносить прибыль или убыток. Главное правило - не торопиться: даже отлаженный в изоляции код может вести себя иначе в боевом контуре из-за задержек сети, проскальзывания цены или неожиданного поведения стакана. Мы рекомендуем начинать с минимального депозита и постепенно увеличивать объём по мере того, как робот доказывает стабильность на реальных данных.

  1. Завести отдельный брокерский счёт с минимальным депозитом - например, 10 000 ₽. Сумма, которую допустимо потерять без критических последствий. Не используйте основной счёт: психологическая нагрузка от реальных денег искажает оценку работы алгоритма.
  2. Настроить мониторинг сделок в реальном времени - алерты в Telegram при каждом исполнении заявки и при превышении дневного убытка. Без этого мы узнаем о проблеме постфактум, когда робот уже наторговал минус. В T-Invest API для получения обновлений по статусам заявок мы используем стрим-соединение OrdersStateStream.
  3. Установить стоп-лимит на уровне кода - если убыток за день превышает заданный процент (например, 5% от депозита), робот останавливается и снимает все активные заявки. Лимит должен быть жёстким: проверка выполняется после каждой сделки, а не раз в час.

Читайте также: Торговый бот для биржи: архитектура, инфраструктура и риски автоторговли.

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

Что такое алготрейдинг и чем он отличается от ручной торговли?

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

Какие риски есть у алгоритмической торговли?

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

Нужно ли получать лицензию для запуска торгового робота?

Лицензия требуется брокеру, через которого робот выводит заявки на биржу, а не самому разработчику. Робот лишь передает команды через брокерский API, а брокер проверяет баланс и перенаправляет ордер в торговую систему.

#Python #Docker #Linux
автор · Backend / SRE Engineer
Артем Колячек

Backend-разработчик и SRE в студии Paradigma. Занимается тем, что у других проектов обычно обнаруживается за неделю до запуска: переездом Bitrix-проектов между серверами, починкой кешей после миграций, выстраиванием pipeline для контейнеров, мониторингом под нагрузкой.

До Paradigma — 7 лет в backend (PHP + Postgres) и в operations (Linux, Docker, Coolify, restic-бэкапы). Любит когда логи разговаривают полным синтаксисом ошибки, а не «что-то пошло не так».

На блоге пишет ровно про те ситуации с которыми сам разбирался руками: какой Bitrix-апдейт сломал кеш и как откатить, почему Docker-сеть не находит контейнер после рекрейта, что делать когда asyncpg ругается на event loop.