Розробка системи бектестування з моделюванням ліквідності

Торгова стратегія, яка чудово працює на демо-рахунку, часто втрачає прибуток при переході на реальний капітал — через неврахований вплив великих ордерів на ціну. Ми розробляємо системи бектестингу з моделюванням ліквідності, які враховують ринковий контекст і прослизання. Наша команда реалізує проєкт під ключ — від концепції до підтримки, щоб ви отримували надійні результати, масштабовані разом із вашим бізнесом.
Часті запитання

Стратегія чудово працює на демо-рахунку з $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
            else:
                trade_j = 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 для тестування смарт-контрактів
Тестування Валідуємо на історичних даних, порівнюємо з реальними угодами
Деплой Передаємо код, документацію та проводимо навчання вашої команди

Як налаштувати бектестинг з моделюванням ліквідності

  1. Збір історичних order book даних (snapshots з біржі).
  2. Вибір моделі ліквідності залежно від об'єму даних та точності.
  3. Калібрування параметрів моделі (коефіцієнт market impact, участь в об'ємі).
  4. Інтеграція моделі в двигун бектестингу.
  5. Запуск бектесту з симуляцією виконання ордерів.
  6. Аналіз capacity та масштабованості.

Що входить до роботи

  • Модульний код з підтримкою order book simulation, VWAP та Almgren-Chriss
  • Інтеграція з вашою існуючою системою бектестингу
  • Документація та приклади використання
  • Навчання вашої команди (2 години онлайн)
  • Підтримка протягом 30 днів після здачі

Терміни та вартість

Терміни розробки: від 3 до 6 тижнів залежно від складності. Вартість розраховується індивідуально після аналізу вашого проєкту. Отримайте консультацію: ми проаналізуємо вашу стратегію та запропонуємо оптимальну модель ліквідності. Досвід: понад 50 успішних проєктів у сфері crypto trading та DeFi. Гарантуємо якість коду та дотримання термінів. Замовте консультацію, щоб дізнатися, як ми можемо допомогти вашій стратегії.

Напрямки блокчейн-розробки

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1141