Інтеграція AI-трейдинг-бота з Tinkoff Invest API

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

Напрямки 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 є кращим.

Зв'яжіться з нами для оцінки вашого проєкту. Замовте інтеграцію під ключ — ми гарантуємо якість та дотримання термінів.