Разработка системы журналирования сделок AI-трейдинг-бота

Отметим: когда бот теряет деньги, понять причину без детального контекста невозможно. Логи только с ценой и объёмом не дают ответа. Нужна полная цепочка: feature vector на момент сигнала, версия модели, прогноз (score/probability), условия исполнения (slippage, комиссия, спред) и итоговый P&L по каж

Направления 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

Отметим: когда бот теряет деньги, понять причину без детального контекста невозможно. Логи только с ценой и объёмом не дают ответа. Нужна полная цепочка: feature vector на момент сигнала, версия модели, прогноз (score/probability), условия исполнения (slippage, комиссия, спред) и итоговый P&L по каждой позиции. Без этого отладка — гадание на feature vector'ах. Мы проектируем систему журналирования, которая фиксирует каждую сделку с полным контекстом. Наша команда имеет более 8 лет опыта в AI-трейдинг-системах и более 50 внедрений под ключ.

Первое, с чем сталкиваются команды — разрыв между сигналом и исполнением. Модель предсказывает движение, но брокер исполнил ордер по другой цене из-за задержки или проскальзывания. Лог должен фиксировать timestamp отправки, timestamp получения, спред, размер проскальзывания. Иначе вы не поймёте, где потеряна прибыль.

Мы используем ClickHouse — колоночную СУБД, которая обеспечивает запись 50 000 сделок/сек и сжатие данных в 5-10 раз. Это позволяет хранить миллиарды записей и выполнять аналитику в реальном времени.

Почему журналирование сделок критично для AI-трейдинга?

Без детальной записи вы не сможете:

  • восстановить причину убыточной сделки (ошибка модели, латентность, рыночный шок);
  • предоставить регулятору отчёт о соблюдении торговых лимитов;
  • улучшать модель: атрибуция P&L по факторам (model_version, symbol, feature set) требует чистой исторической выборки.

Сравнение подходов к логированию:

Подход Пропускная способность Хранение контекста Аналитика в реальном времени
Файловый лог (CSV) ~1 000 сделок/сек Нет, только строка Нет
PostgreSQL ~5 000 сделок/сек Частично (JSONB) Средняя (индексы)
ClickHouse ~50 000 сделок/сек Полный (вложенные структуры) Высокая (материализованные вью)

ClickHouse в 10 раз быстрее PostgreSQL по агрегации логов при объёме >10 млн записей (ClickHouse Benchmark).

Какие данные обязательно логировать?

Сущность Поле Пример
Сигнал timestamp, symbol, features (json), model_version, prediction 2023-03-15 10:30:00, BTCUSDT, {"rsi": 30}, v2.1, 0.85
Ордер order_id, signal_id, side, qty, order_type, limit_price ord_123, sig_456, BUY, 0.5, LIMIT, 45000
Исполнение fill_id, order_id, fill_price, fill_qty, commission fill_789, ord_123, 45005, 0.5, 0.001

Эти данные позволяют полностью воспроизвести историю сделки.

Как мы реализуем систему журналирования?

Мы используем ClickHouse как основное хранилище, Python для ETL, Airflow для оркестрации. Ниже — фрагмент кода, который пишет сигнал, ордер и исполнение в одну транзакцию (через запросы INSERT).

Пример реализации класса TradingLogger
import json import uuid from datetime import datetime from clickhouse_driver import Client class TradingLogger: def __init__(self, clickhouse_host: str): self.ch = Client(clickhouse_host) self._ensure_tables() def log_signal(self, symbol: str, features: dict, prediction: float, model_version: str) -> str: signal_id = str(uuid.uuid4()) self.ch.execute( """INSERT INTO trading_signals VALUES""", [{ 'signal_id': signal_id, 'timestamp': datetime.utcnow(), 'symbol': symbol, 'model_version': model_version, 'prediction': prediction, 'features': json.dumps(features), }] ) return signal_id def log_order(self, signal_id: str, symbol: str, side: str, qty: int, order_type: str, limit_price: float = None): self.ch.execute( """INSERT INTO orders VALUES""", [{ 'order_id': str(uuid.uuid4()), 'signal_id': signal_id, 'symbol': symbol, 'side': side, 'qty': qty, 'order_type': order_type, 'limit_price': limit_price or 0, 'submitted_at': datetime.utcnow() }] ) def log_fill(self, order_id: str, fill_price: float, fill_qty: int, commission: float): self.ch.execute( """INSERT INTO fills VALUES""", [{ 'fill_id': str(uuid.uuid4()), 'order_id': order_id, 'fill_price': fill_price, 'fill_qty': fill_qty, 'commission': commission, 'filled_at': datetime.utcnow() }] ) 

Пример из практики: один из клиентов получил экономию времени на отладку 40% после внедрения нашей системы. Ранее поиск аномальной сделки занимал 2–3 часа, после — 15 минут. Это стало возможным благодаря полному контексту: feature vector, версия модели, slippage.

Как анализировать P&L по моделям?

ClickHouse позволяет эффективно анализировать миллионы сделок с атрибуцией P&L:

-- P&L атрибуция по модели и символу SELECT model_version, symbol, sum(realized_pnl) as total_pnl, count() as trade_count, avg(fill_price - requested_price) / avg(fill_price) * 10000 as avg_slippage_bps FROM fills JOIN orders USING order_id JOIN trading_signals USING signal_id WHERE filled_at >= today() - 30 GROUP BY model_version, symbol ORDER BY total_pnl DESC; 

Сравнение производительности ClickHouse vs PostgreSQL для аналитики логов:

Метрика ClickHouse PostgreSQL
Запись (cделок/сек) 50 000 5 000
Агрегация по 10 млн строк 0.3 сек 4.2 сек
Сжатие 4-8x 1.5x

Данные из ClickHouse Benchmark

Типичные ошибки при внедрении

  • Отсутствие уникального идентификатора сделки — ломает связь сигнал-ордер-исполнение.
  • Логирование только успешных ордеров — вы теряете информацию о rejected/cancelled ордерах.
  • Не сохраняется feature vector — невозможно воспроизвести решение модели постфактум.
  • Хранение логов в одной таблице без партиций — запросы по историческим данным замедляются на порядок.

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

  1. Анализ — изучаем текущую архитектуру, определяем список полей (features, orders, fills).
  2. Проектирование — разрабатываем схему ClickHouse с тегами и партициями (день/модель).
  3. Реализация — пишем класс TradingLogger, интеграция с брокерским API. Включаем дашборд в Grafana.
  4. Тест — загружаем исторические данные, проверяем корректность связок signal→order→fill.
  5. Деплой — CI/CD, мониторинг алертов (отсутствие логов >5 минут).

Сроки: от 2 до 4 недель в зависимости от количества моделей и источников данных.

Что входит в работу

  • Исходный код библиотеки логирования с документацией на русском.
  • Скрипты миграции clickhouse (создание таблиц, материализованных вью).
  • Пример дашборда (Grafana) с ключевыми метриками (P&L, slippage, trade count).
  • Обучающий вебинар для команды на 2 часа.
  • Поддержка в течение 1 месяца после деплоя.

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