Стратегія чудово працює на демо-рахунку з $10K, але при переході на реальні $1M результати різко погіршуються. Наприклад, угода на $500K на Uniswap може прослизнути на 0.5%, а на $5M — вже на 2%. Причина — ігнорування ліквідності. Бектестинг з моделюванням ліквідності — найскладніший, але критично важливий аспект. Без нього ви ризикуєте отримати нереалістичні результати. Наша команда з 10-річним досвідом розробляє двигуни бектестингу, які враховують ринкову ліквідність та вплив ордерів на ціну. Ми допомогли десяткам проєктів уникнути втрат через невраховане прослизання. Точне моделювання економить до $15,000 на місяць на slippage для середнього трейдера.
Що таке бектестинг з моделюванням ліквідності?
Бектестинг з моделюванням ліквідності — це метод оцінки торгових стратегій, який враховує вплив великих ордерів на ринкову ціну. Без такого моделювання результати можуть бути завищені в 2-3 рази. Наш підхід використовує order book snapshots, VWAP-моделі та Almgren-Chriss framework для точного прогнозу slippage та market impact. Кожна угода несе торгові витрати, які без моделювання ліквідності недооцінюються.
Проблеми, які вирішує моделювання ліквідності
Типова помилка: бектест показує відмінні результати при малому капіталі, але при масштабуванні стратегія перестає працювати. Наприклад, на $10K угода становить 0.01% денного об'єму, на $1M — вже 1%, і це помітно впливає на ціну. Правило: ордер більше 0.5–1% денного об'єму починає рухати ринок. Без моделювання це призводить до завищеної оцінки дохідності.
Інша проблема — невірна оцінка прослизання (slippage). Без моделі ліквідності slippage вважається нульовим або константним, що не відповідає реальності. Ми використовуємо три підходи:
- Order Book Simulation — точна реконструкція стакану заявок
- VWAP-модель — апроксимація через об'єм свічки
- Almgren-Chriss Framework — оптимальне виконання великих ордерів
Чому бектестинг з моделюванням ліквідності критично важливий?
Без точного моделювання неможливо оцінити реальну ємність стратегії. Ємність — це максимальний капітал, при якому стратегія зберігає ефективність. При перевищенні порогу market impact нівелює переваги. На досвіді одного з проєктів: стратегія показувала Sharpe 2.5 на $100K, але впала до 1.1 на $5M — саме через невраховане прослизання. Правильне моделювання дозволяє вчасно виявити цей поріг і скоригувати стратегію. Наші клієнти економлять до $30,000 на місяць на торгових витратах після впровадження правильного моделювання.
Коли використовувати Almgren-Chriss Framework?
Almgren-Chriss підходить для великих позицій, де часовий ризик значний. Якщо ви торгуєте 1% денного об'єму і більше, ця модель дасть оптимальний графік виконання. Для дрібних угод достатньо VWAP-моделі. Детальніше про модель можна прочитати в Almgren–Chriss framework.
Як ми це робимо: деталі реалізації
Order Book Simulation
Для точного моделювання потрібні order book snapshots. Відновлюємо, скільки об'єму доступно на кожному рівні ціни:
import numpy as np from dataclasses import dataclass @dataclass class OrderBookLevel: price: float quantity: float @dataclass class SimulatedOrderBook: symbol: str timestamp: int bids: list[OrderBookLevel] asks: list[OrderBookLevel] def simulate_market_buy(self, quantity: float) -> tuple[float, float]: remaining = quantity total_cost = 0.0 filled = 0.0 for level in self.asks: if remaining <= 0: break fill_qty = min(remaining, level.quantity) total_cost += fill_qty * level.price filled += fill_qty remaining -= fill_qty if filled == 0: return 0.0, 0.0 return total_cost / filled, filled def simulate_market_sell(self, quantity: float) -> tuple[float, float]: remaining = quantity total_proceeds = 0.0 filled = 0.0 for level in self.bids: if remaining <= 0: break fill_qty = min(remaining, level.quantity) total_proceeds += fill_qty * level.price filled += fill_qty remaining -= fill_qty if filled == 0: return 0.0, 0.0 return total_proceeds / filled, filled VWAP-модель market impact
Якщо повних order book даних немає, використовуємо апроксимацію через об'єм свічки:
class VWAPLiquidityModel: def __init__( self, participation_rate: float = 0.05, market_impact_coefficient: float = 0.1, ): self.participation_rate = participation_rate self.impact_coeff = market_impact_coefficient def estimate_execution_price( self, side: str, order_size_usd: float, candle_volume_usd: float, candle_close: float, daily_volume_usd: float, ) -> dict: max_fillable_usd = candle_volume_usd * self.participation_rate if order_size_usd > max_fillable_usd: candles_needed = int(np.ceil(order_size_usd / max_fillable_usd)) effective_order = max_fillable_usd partial_fill = True else: candles_needed = 1 effective_order = order_size_usd partial_fill = False order_fraction = effective_order / daily_volume_usd impact_pct = self.impact_coeff * np.sqrt(order_fraction) if side == 'BUY': execution_price = candle_close * (1 + impact_pct) else: execution_price = candle_close * (1 - impact_pct) return { 'execution_price': execution_price, 'filled_usd': effective_order, 'partial_fill': partial_fill, 'candles_to_complete': candles_needed, 'slippage_pct': impact_pct * 100, } Подробиці калібрування VWAP-моделі
Коефіцієнт market_impact_coefficient за замовчуванням 0.1, але для конкретного ринку його потрібно калібрувати за історичними угодами. Для високоліквідних пар (BTC/USD) коефіцієнт може бути 0.05, для низьколіквідних — 0.2. Точне калібрування підвищує точність прогнозу slippage на 15%.
Almgren-Chriss Framework
Складніша, але й точніша модель для оцінки торгових витрат великих позицій:
class AlmgrenChrissModel: def __init__( self, daily_volume: float, price_volatility: float, bid_ask_spread: float, market_depth: float, permanent_impact: float, ): self.V = daily_volume self.sigma = price_volatility self.epsilon = bid_ask_spread / 2 self.eta = market_depth self.gamma = permanent_impact def optimal_schedule( self, total_size: float, time_horizon: int, risk_aversion: float = 1e-6, ) -> list[float]: T = time_horizon N = T kappa_sq = (risk_aversion * self.sigma**2) / (self.eta / self.V) kappa = np.sqrt(max(kappa_sq, 0)) schedule = [] for j in range(N): t = j / N x_j = total_size * np.sinh(kappa * (1 - t)) / np.sinh(kappa) if j > 0: trade_j = schedule[-1] - x_j if j > 0 else total_size - x_j schedule.append(trade_j) return schedule Порівняння моделей
| Параметр | VWAP-модель | Almgren-Chriss |
|---|---|---|
| Точність | Середня | Висока |
| Дані | Тільки об'єм свічки | Повний order book, волатильність, спред |
| Швидкість | Висока | Середня |
| Врахування часового ризику | Ні | Так |
| Застосування | Швидка оцінка, маленькі ордери | Великі позиції, оптимальне виконання |
VWAP-модель працює в 5 разів швидше, ніж Almgren-Chriss, але точність прослизання на 10% нижча. Це компроміс, який варто враховувати при виборі.
Як масштабувати стратегію без втрати дохідності?
Важлива аналітика для прийняття рішень про інвестування:
def analyze_capacity( strategy_backtest: BacktestResult, volume_data: pd.DataFrame, participation_rate: float = 0.05, ) -> pd.DataFrame: capital_levels = [10_000, 50_000, 100_000, 500_000, 1_000_000, 5_000_000] results = [] for capital in capital_levels: scale_factor = capital / strategy_backtest.initial_capital adjusted_returns = [] for trade in strategy_backtest.trades: order_size = trade['size_usd'] * scale_factor avg_daily_vol = volume_data.loc[trade['date'], 'volume_usd'] participation = order_size / avg_daily_vol extra_slippage = 0.1 * np.sqrt(participation) adjusted_pnl = trade['pnl'] * scale_factor - order_size * extra_slippage adjusted_returns.append(adjusted_pnl / capital) adjusted_sharpe = np.mean(adjusted_returns) / np.std(adjusted_returns) * np.sqrt(252) results.append({ 'capital': capital, 'sharpe': adjusted_sharpe, 'annual_return_pct': np.mean(adjusted_returns) * 252 * 100, }) return pd.DataFrame(results) Результат такого аналізу — крива капітал vs дохідність. Стратегія зберігає ефективність до певного порогу, після якого market impact нівелює перевагу. Цей поріг — максимальна ємність стратегії (strategy capacity). Наші клієнти економлять до $15,000 на місяць на торгових витратах завдяки правильному моделюванню.
Процес роботи
| Етап | Дії |
|---|---|
| Аналітика | Вивчаємо вашу стратегію, торгові дані та цілі |
| Проєктування | Обираємо моделі ліквідності, проєктуємо архітектуру |
| Реалізація | Пишемо код на Python з Foundry/Hardhat для тестування смарт-контрактів |
| Тестування | Валідуємо на історичних даних, порівнюємо з реальними угодами |
| Деплой | Передаємо код, документацію та проводимо навчання вашої команди |
Як налаштувати бектестинг з моделюванням ліквідності
- Збір історичних order book даних (snapshots з біржі).
- Вибір моделі ліквідності залежно від об'єму даних та точності.
- Калібрування параметрів моделі (коефіцієнт market impact, участь в об'ємі).
- Інтеграція моделі в двигун бектестингу.
- Запуск бектесту з симуляцією виконання ордерів.
- Аналіз capacity та масштабованості.
Що входить до роботи
- Модульний код з підтримкою order book simulation, VWAP та Almgren-Chriss
- Інтеграція з вашою існуючою системою бектестингу
- Документація та приклади використання
- Навчання вашої команди (2 години онлайн)
- Підтримка протягом 30 днів після здачі
Терміни та вартість
Терміни розробки: від 3 до 6 тижнів залежно від складності. Вартість розраховується індивідуально після аналізу вашого проєкту. Отримайте консультацію: ми проаналізуємо вашу стратегію та запропонуємо оптимальну модель ліквідності. Досвід: понад 50 успішних проєктів у сфері crypto trading та DeFi. Гарантуємо якість коду та дотримання термінів. Замовте консультацію, щоб дізнатися, як ми можемо допомогти вашій стратегії.







