Стратегія чудово працює на демо-рахунку з $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. Гарантуємо якість коду та дотримання термінів. Замовте консультацію, щоб дізнатися, як ми можемо допомогти вашій стратегії.







