Разработка и интеграция AI-трейдинг-бота с Tinkoff Invest API

При разработке алгоритмического торгового бота на российском рынке одна из первых проблем — выбор надёжного и производительного API. Tinkoff Invest API на gRPC — частое решение, но его интеграция с ML-моделью требует глубокого понимания как API, так и MLOps. Помимо стандартного REST, Tinkoff предлаг

Направления AI-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1441
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1302
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    998
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1267
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    714
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1006

При разработке алгоритмического торгового бота на российском рынке одна из первых проблем — выбор надёжного и производительного 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). Пайплайн:

  1. Streaming подписка на свечи SBER.
  2. Каждую минуту — инференс модели.
  3. При сигнале — выставление лимитного ордера с проверкой текущего стакана.
  4. Логирование всех сделок в PostgreSQL.

Процесс работы

  1. Аналитика — обсуждаем стратегию, выбираем инструменты, оцениваем требования к latency.
  2. Проектирование — архитектура микросервисов, выбор брокера (Tinkoff), прототип на sandbox.
  3. Реализация — написание кода на Python, интеграция ML-модели, настройка streaming.
  4. Тестирование — backtesting на исторических данных (1 год), paper trading на sandbox.
  5. Деплой — развёртывание на 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 предпочтительнее.

Свяжитесь с нами для оценки вашего проекта. Закажите интеграцию под ключ — мы гарантируем качество и соблюдение сроков.