Paper trading — симуляція реальної торгівлі без використання реального капіталу. На відміну від бектестування (тестування на історичних даних), paper trading відбувається в реальному часі: стратегія отримує live-дані з біржі, генерує сигнали та надсилає віртуальні ордери в симулятор брокера. Це дозволяє виявити проблеми, невидимі при бектестуванні: затримки даних, проблеми з виконанням ордерів, технічні збої. Ми розробляємо такі системи під ключ, щоб ваш AI-алгоритм пройшов усі стадії валідації без ризику для капіталу.
Чому paper trading — обов'язковий етап?
Навіть ідеально налаштований бектест може давати хибну впевненість. Look-ahead bias, переучування (overfitting) на історії, недооцінені комісії — типові пастки. Paper trading в реальному часі знімає ці ризики: ваша AI-модель бачить лише ті дані, які були б доступні в момент прийняття рішення. Розходження в метриках між paper trading і бектестом не повинно перевищувати 15% по Sharpe Ratio — якщо більше, стратегія потребує доопрацювання.
Згідно з визначенням Вікіпедії, 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 дні. Отримайте консультацію без зобов'язань. Зв'яжіться з нами, щоб обговорити деталі вашого проєкту.







