При разработке алгоритмического торгового бота на российском рынке одна из первых проблем — выбор надёжного и производительного 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 предпочтительнее.
Свяжитесь с нами для оценки вашего проекта. Закажите интеграцию под ключ — мы гарантируем качество и соблюдение сроков.







