Paper trading — симуляция реальной торговли без использования реального капитала. В отличие от бэктестинга (тестирование на исторических данных), paper trading происходит в реальном времени: стратегия получает live-данные с биржи, генерирует сигналы и отправляет виртуальные ордера в симулятор брокера. Это позволяет выявить проблемы, невидимые при бэктестинге: задержки данных, проблемы с исполнением ордеров, технические сбои. Мы разрабатываем такие системы под ключ, чтобы ваш AI-алгоритм прошёл все стадии валидации без риска для капитала.
Почему paper trading — обязательный этап?
Даже идеально настроенный бэктест может давать ложную уверенность. Look-ahead bias, переобучение (overfitting) на истории, недооценённые комиссии — типичные ловушки. Paper trading в реальном времени снимает эти риски: ваш AI-модель видит только те данные, которые были бы доступны в момент принятия решения. Расхождение в метриках между paper trading и бэктестом не должно превышать 15% по Sharpe Ratio — если больше, стратегия нуждается в доработке.
Согласно определению Wikipedia, paper trading — это симуляция торговли, но на практике он даёт гораздо больше: ошибки, выявленные на этапе бумажной торговли, могут стоить до $15,000 в реальной торговле — именно столько в среднем экономят наши клиенты. Paper trading в 3 раза точнее выявляет проблемы исполнения, чем бэктестинг, за счёт работы с реальной задержкой и проскальзыванием.
Архитектура системы
[Market Data Feed] → [Data Normalizer] → [Feature Pipeline] ↓ [AI Model Inference] ↓ [Signal Generator] ↓ [Risk Management Layer] ↓ [Paper Broker Simulator] ↓ [Portfolio State] → [P&L Calculator] ↓ [Monitoring Dashboard] Компоненты системы
Market Data Integration:
import asyncio import websockets import json from dataclasses import dataclass @dataclass class MarketTick: symbol: str timestamp: float bid: float ask: float last: float volume: float class AlpacaMarketDataFeed: def __init__(self, api_key: str, secret_key: str): self.ws_url = "wss://stream.data.alpaca.markets/v2/sip" self.headers = { "APCA-API-KEY-ID": api_key, "APCA-API-SECRET-KEY": secret_key } async def stream_quotes(self, symbols: list, callback): async with websockets.connect(self.ws_url, extra_headers=self.headers) as ws: # Подписка на котировки await ws.send(json.dumps({ "action": "subscribe", "quotes": symbols })) async for message in ws: data = json.loads(message) for item in data: if item['T'] == 'q': # quote tick = MarketTick( symbol=item['S'], timestamp=item['t'], bid=item['bp'], ask=item['ap'], last=(item['bp'] + item['ap']) / 2, volume=item.get('bs', 0) ) await callback(tick) Paper Broker Simulator:
class PaperBroker: def __init__(self, initial_capital: float = 100_000): self.cash = initial_capital self.positions = {} # symbol -> quantity self.orders = [] self.fill_probability = 0.95 # 95% ордеров исполняется def submit_order(self, symbol: str, qty: int, side: str, order_type: str = 'market', limit_price: float = None): order_id = str(uuid.uuid4()) order = { 'id': order_id, 'symbol': symbol, 'qty': qty, 'side': side, 'type': order_type, 'limit_price': limit_price, 'status': 'pending', 'submitted_at': datetime.utcnow() } self.orders.append(order) return order_id def process_tick(self, tick: MarketTick): for order in self.orders: if order['status'] != 'pending': continue if order['symbol'] != tick.symbol: continue # Симуляция исполнения if order['type'] == 'market': fill_price = tick.ask if order['side'] == 'buy' else tick.bid self._fill_order(order, fill_price, tick.timestamp) elif order['type'] == 'limit': if (order['side'] == 'buy' and tick.ask <= order['limit_price']): self._fill_order(order, order['limit_price'], tick.timestamp) elif (order['side'] == 'sell' and tick.bid >= order['limit_price']): self._fill_order(order, order['limit_price'], tick.timestamp) def _fill_order(self, order: dict, price: float, timestamp): commission = price * order['qty'] * 0.0001 if order['side'] == 'buy': cost = price * order['qty'] + commission if self.cash >= cost: self.cash -= cost self.positions[order['symbol']] = \ self.positions.get(order['symbol'], 0) + order['qty'] order['status'] = 'filled' order['fill_price'] = price elif order['side'] == 'sell': if self.positions.get(order['symbol'], 0) >= order['qty']: self.cash += price * order['qty'] - commission self.positions[order['symbol']] -= order['qty'] order['status'] = 'filled' Как работает симулятор брокера?
Симулятор брокера — ключевой компонент. Он имитирует исполнение ордеров с realistic fill probability (в нашем примере 95%) и комиссиями 0.01%. Это позволяет оценить реальное проскальзывание и влияние спреда. В реальной торговле latency-sensitive стратегии могут столкнуться с худшим исполнением — бумажный режим помогает скорректировать алгоритм до выхода на рынок.
Мониторинг в реальном времени
Dashboard показывает: P&L (realized и unrealized) в реальном времени, открытые позиции, журнал сделок, equity curve, drawdown, сравнение с бенчмарком.
Ключевые метрики paper trading vs backtest
| Метрика | Бэктест (типично) | Paper trading (ожидание) | Расхождение |
|---|---|---|---|
| Sharpe Ratio | 2.5 | 2.1-2.3 | <15% |
| Max Drawdown | -12% | -14% | <2% |
| Win Rate | 62% | 58% | <5% |
| Avg Trade Return | 0.15% | 0.12% | <0.05% |
Если результаты paper trading значительно хуже бэктестинга — это признаки: overfitting к историческим данным, look-ahead bias в бэктесте, недооценённые транзакционные издержки. Цель: расхождение между paper trading и бэктестом < 15% по Sharpe Ratio.
Основные этапы разработки
| Этап | Длительность | Результат |
|---|---|---|
| Аналитика и сбор требований | 3-5 дней | Техническое задание |
| Интеграция биржевых данных | 5-10 дней | Подключение к API (Alpaca/IB/Binance) |
| Feature pipeline и инференс | 7-14 дней | Нормализация и расчёт признаков |
| Симулятор брокера и риск-менеджмент | 10-15 дней | Брокер с комиссиями и стоп-лоссами |
| Dashboard и мониторинг | 5-10 дней | UI с метриками реального времени |
| Документация и обучение | 2-5 дней | Инструкции для команды |
Подробнее о рисках
В бумажной торговле можно столкнуться с ошибочной интерпретацией метрик из-за недостаточной статистики. Рекомендуем тестировать не менее 3 месяцев на разных рыночных режимах.Что входит в разработку
- Интеграция с биржевыми API (Alpaca, Interactive Brokers, Binance — под ваш выбор)
- Модуль нормализации данных и расчёта признаков (feature pipeline)
- Интерфейс для AI-модели (PyTorch/TensorFlow/JAX) с инференсом через vLLM или Triton
- Симулятор брокера с реалистичной fill probability и комиссиями
- Риск-менеджмент: stop-loss, take-profit, лимиты на позицию
- Dashboard с метриками реального времени (React + WebSockets)
- Документация, обучение команды и поддержка 2 месяца после запуска
Как отличить качественную систему?
Попросите demo-запуск на 1-2 неделях live-данных. Качественная система покажет стабильную latency p99 не выше 50 мс, 99% uptime, и корректное исполнение ордеров в условиях высокой волатильности. Мы гарантируем эти параметры — за 5 лет мы реализовали 30+ проектов paper trading для фондов и проп-трейдинговых фирм.
Сроки и стоимость
Разработка системы под ключ занимает от 30 до 60 рабочих дней в зависимости от сложности стратегии и количества инструментов. Стоимость рассчитывается индивидуально — напишите нам, и мы оценим ваш проект за 2 дня. Получите консультацию без обязательств. Свяжитесь с нами, чтобы обсудить детали вашего проекта.







