Разработка системы журналирования сделок AI-трейдинг-бота
Система журналирования сделок — фундамент для анализа производительности, отладки ошибок и регуляторного compliance. AI-трейдинг-боту нужна не просто запись факта сделки, но и полный контекст: какие данные получила модель, какое предсказание выдала, почему была принята именно такая позиция.
Что нужно логировать
Предсказание модели: входные признаки (feature vector), версия модели, timestamp предсказания, значение предсказания (score/probability/return forecast), confidence при наличии.
Исполнение ордера: тип ордера, запрошенная цена, исполненная цена, slippage, комиссия, время исполнения.
Контекст рынка: bid/ask spread в момент исполнения, volume в стакане, режим рынка.
P&L: реализованный и нереализованный P&L по каждой позиции, атрибуция P&L по факторам.
Реализация
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()
}]
)
Аналитика по логам
ClickHouse позволяет эффективно анализировать миллионы сделок:
-- 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;
Полное журналирование — основа не только compliance, но и непрерывного улучшения модели через анализ ошибочных сделок.







