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

Разработка алгоритмического торгового бота на российском рынке требует надёжной интеграции с Tinkoff Invest API, чтобы не терять сигналы на фоне задержек и лимитов. Мы разрабатываем и внедряем AI-трейдинг-ботов с использованием gRPC и ML-моделей, обеспечивая стабильную работу в режиме 24/7. Наша команда реализует проект под ключ — от аудита стратегии до интеграции и последующей поддержки, с тестированием в Tinkoff sandbox.

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

Отраслевые AI-решенияСредний~2-3 дня
Часто задаваемые вопросы

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

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

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

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

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1543
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1394
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1374
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    816
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1142