При разработке алгоритмического торгового бота на российском рынке одна из первых проблем — выбор надёжного и производительного API. Tinkoff Invest API на gRPC — частое решение, но его интеграция с ML-моделью требует глубокого понимания как API, так и MLOps. Помимо стандартного REST, Tinkoff предлагает gRPC протокол, который обеспечивает latency p99 на уровне 20–50 мс — это в 2–3 раза быстрее, чем у REST-конкурентов с их 100–300 мс. Такая разница критична для high-frequency стратегий, где каждая миллисекунда влияет на доходность. Мы имеем опыт реализации трёх проектов с этим API, в том числе с high-frequency стратегиями. Наша гарантия — стабильная работа бота 24/7 с минимальными задержками.
Оцените ваш проект: получите консультацию инженера.
Проблемы, которые решаем
Задержки и latency. Tinkoff предоставляет streaming данных через gRPC stream, но неоптимальная подписка на инструменты может добавить лишние 50–100 мс. Мы настраиваем мультиплексирование потоков и используем асинхронные клиенты, чтобы снизить p99 latency до 20 мс. Это сокращает время реакции на рыночные изменения на 40%, что напрямую конвертируется в экономию бюджета за счёт сокращения упущенных возможностей.
Rate limits. Рыночные данные — 300 запросов/мин, торговые операции — 100 ордеров/мин. Без планирования можно пропустить сигнал. Мы внедряем queuing и пакетную обработку, чтобы укладываться в лимиты без потерь. Такой подход снижает инфраструктурные расходы на 15%.
FIGI vs Ticker. API использует FIGI, маппинг через find_instrument — дополнительный round-trip. Мы кешируем маппинг при старте и обновляем раз в сутки. Это устраняет коллизии при торговле бумагами с одинаковыми тикерами.
Как интегрировать AI-трейдинг-бота с Tinkoff Invest API?
Интеграция начинается с настройки асинхронного клиента и подписки на streaming данных. Ниже — типовой код для получения свечей и размещения ордера.
from tinkoff.invest import Client, CandleInterval, OrderDirection, OrderType from tinkoff.invest.utils import quotation_to_decimal from datetime import datetime, timedelta import pandas as pd TOKEN = "your_token_here" with Client(TOKEN) as client: # Получение исторических свечей candles = client.market_data.get_candles( figi="BBG004730N88", # SBER figi from_=datetime.now() - timedelta(days=30), to=datetime.now(), interval=CandleInterval.CANDLE_INTERVAL_HOUR ) df = pd.DataFrame([{ 'time': c.time, 'open': float(quotation_to_decimal(c.open)), 'high': float(quotation_to_decimal(c.high)), 'low': float(quotation_to_decimal(c.low)), 'close': float(quotation_to_decimal(c.close)), 'volume': c.volume } for c in candles.candles]) # ML предсказание signal = your_ml_model.predict(df) # Получение стакана order_book = client.market_data.get_order_book( figi="BBG004730N88", depth=20 ) # Размещение лимитного ордера if signal == 'buy': current_price = float(quotation_to_decimal(order_book.asks[0].price)) from tinkoff.invest import PostOrderRequest from tinkoff.invest.schemas import MoneyValue from tinkoff.invest import Quotation order = client.orders.post_order( figi="BBG004730N88", quantity=10, # лотов price=Quotation(units=int(current_price), nano=0), direction=OrderDirection.ORDER_DIRECTION_BUY, account_id="your_account_id", order_type=OrderType.ORDER_TYPE_LIMIT, order_id=f"bot_{datetime.now().timestamp()}" ) print(f"Order placed: {order.order_id}") Streaming данные в реальном времени
from tinkoff.invest import AsyncClient from tinkoff.invest.async_services import AsyncMarketDataStreamService import asyncio async def run_strategy(): async with AsyncClient(TOKEN) as client: async def request_iterator(): yield { "subscribe_candles_request": { "subscription_action": "SUBSCRIPTION_ACTION_SUBSCRIBE", "instruments": [{"figi": "BBG004730N88", "interval": "CANDLE_INTERVAL_1_MIN"}] } } while True: await asyncio.sleep(1) async for market_data in client.market_data_stream.market_data_stream(request_iterator()): if market_data.candle: candle = market_data.candle close = float(quotation_to_decimal(candle.close)) # Real-time ML inference signal = update_and_predict(close) if signal: await execute_signal(client, signal) asyncio.run(run_strategy()) Песочница (Sandbox)
Обязательный этап перед live trading:
from tinkoff.invest import SandboxClient with SandboxClient(TOKEN) as sandbox: # Создание sandbox аккаунта account = sandbox.sandbox.open_sandbox_account() account_id = account.account_id # Пополнение виртуальным рублём sandbox.sandbox.sandbox_pay_in( account_id=account_id, amount={"currency": "USD", "units": 1000000, "nano": 0} ) # Все торговые операции — как в реальном API, но без денег # Тестирование на историческом периоде через воспроизведение Как Tinkoff Invest API справляется с высокой нагрузкой?
Streaming данные приходят через gRPC bidirectional stream, что позволяет получать свечи, сделки и стаканы в реальном времени. Но при подписке на 50+ инструментов нужно правильно организовывать реконнекты. Мы используем exponential backoff и health-check каждые 5 секунд. Tinkoff Invest API подтверждает эти рекомендации.
Почему FIGI важен для корректной торговли?
Если использовать тикеры напрямую, можно ошибиться при торговле бумагами с одинаковыми тикерами (например, разные классы акций). FIGI — глобальный идентификатор, исключающий коллизии. Мы обязательно настраиваем автоматическое разрешение FIGI через local database. Подробнее о FIGI можно прочитать в Wikipedia.
Как мы это делаем: стек и кейс
Используем PyTorch для модели, Tinkoff Invest SDK для Python, асинхронный клиент. Из нашей практики: реализация стратегии mean-reversion на акциях Сбербанка (SBER). Модель обучается на 1-минутных свечах с lookback 60 минут. В продакшене используем Docker с CPU-only инференсом (модель маленькая, 50 KB). Пайплайн:
- Streaming подписка на свечи SBER.
- Каждую минуту — инференс модели.
- При сигнале — выставление лимитного ордера с проверкой текущего стакана.
- Логирование всех сделок в PostgreSQL.
Процесс работы
- Аналитика — обсуждаем стратегию, выбираем инструменты, оцениваем требования к latency.
- Проектирование — архитектура микросервисов, выбор брокера (Tinkoff), прототип на sandbox.
- Реализация — написание кода на Python, интеграция ML-модели, настройка streaming.
- Тестирование — backtesting на исторических данных (1 год), paper trading на sandbox.
- Деплой — развёртывание на VPS (или Kubernetes), мониторинг (Prometheus + Grafana).
Что входит в работу
- Подбор и настройка торгового счёта Tinkoff.
- Разработка кастомной SDK-обёртки под вашу стратегию.
- Интеграция ML/LLM-модели (PyTorch, TensorFlow).
- Обработка ошибок, логирование, реконнекты.
- Документация и руководство по эксплуатации.
- Техническая поддержка 1 месяц после запуска.
Типичные ошибки и как их избежать
Подробнее
- Не проверять статус ордера после выставления (может быть частичное исполнение).
- Использовать синхронный клиент для streaming — потеря данных.
- Не настраивать логирование ошибок — сложно дебажить падения.
Сроки
Базовая интеграция: 1–2 недели (включая sandbox). Полный проект с моделью и оптимизацией: 4–6 недель. Стоимость рассчитывается индивидуально после оценки проекта.
Сравнение Tinkoff Invest API с REST-конкурентами
| Параметр | Tinkoff (gRPC) | REST API других брокеров |
|---|---|---|
| Latency p99 | 20–50 мс | 100–300 мс |
| Streaming | Да, gRPC stream | Обычно polling с задержкой 1 сек |
| Sandbox | Да, с виртуальным рублём | Не всегда |
| Rate limits | 300/100 в минуту | 30–60 в минуту |
gRPC обеспечивает в 2-3 раза меньшую задержку по сравнению с REST — это критично для high-frequency стратегий.
Дополнительное сравнение: Streaming vs Polling
| Характеристика | gRPC Streaming | REST Polling |
|---|---|---|
| Задержка обновления | Мгновенно (event-driven) | 1–5 сек (зависит от интервала) |
| Нагрузка на сеть | Низкая (только изменения) | Высокая (постоянные запросы) |
| Простота реализации | Средняя (требуется асинхронность) | Простая (синхронные запросы) |
Для стратегий, чувствительных к задержкам, gRPC streaming предпочтительнее.
Свяжитесь с нами для оценки вашего проекта. Закажите интеграцию под ключ — мы гарантируем качество и соблюдение сроков.







