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 дня. Получите консультацию без обязательств. Свяжитесь с нами, чтобы обсудить детали вашего проекта.







