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

Проєктуємо та розробляємо блокчейн-рішення повного циклу: від архітектури смарт-контрактів до запуску DeFi-протоколів, NFT-маркетплейсів та криптобірж. Аудит безпеки, токеноміка, інтеграція з наявною інфраструктурою.
Показано 1 з 1Усі 1306 послуг
Розробка моделі прогнозування ліквідності
Складний
~1-2 тижні
Часті запитання

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

Етапи блокчейн-розробки

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

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1288
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1198
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    902
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1122
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    589
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    859

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

Ліквідність крипторинку — не константа. Вона різко падає в періоди ринкового стресу, поза робочими годинами та при аномальних подіях. Модель прогнозування ліквідності дозволяє алгоритмічним системам адаптувати стратегію: змінювати розміри ордерів, розширювати спреди, відкладати виконання.

Метрики ліквідності

Spread Bid-Ask: найпростіша метрика ліквідності. Вузький спред = висока ліквідність.

Відносний спред = (Ask - Bid) / Mid × 100%

Глибина ринку: сумарний обсяг у книзі ордерів на N% від mid-price. Глибокий книга ордерів поглине великий ордер без сильного провалу.

Коефіцієнт ілік ідності Амігуда: вимірює рух ціни на одиницю обсягу:

def amihud_ratio(returns, volumes, window=24):
    """
    Висока значення = великий рух ціни при малому обсягу = низька ліквідність
    """
    illiquidity = np.abs(returns) / (volumes + 1e-8)
    return illiquidity.rolling(window).mean()

Лямбда Кайла (вплив ціни): регресія зміни ціни на потік ордерів:

def kyles_lambda(price_changes, order_flow, window=100):
    """
    λ = Cov(ΔP, OF) / Var(OF)
    Висока λ = великий вплив на ціну = низька ліквідність
    """
    lambdas = []
    for i in range(window, len(price_changes)):
        dp = price_changes[i-window:i]
        of = order_flow[i-window:i]
        cov = np.cov(dp, of)[0, 1]
        var = np.var(of)
        lambdas.append(cov / max(var, 1e-10))
    return lambdas

Фактори ліквідності

Часові паттерни:

  • Добовий цикл: 14:00–22:00 UTC (перекриття європейської та американської сесій) — максимальна ліквідність
  • Вихідні — ліквідність на 20–30% нижча
  • Свята — особливо низька ліквідність

Ринковий режим:

  • Періоди високої волатильності → маркет-мейкери розширюють спреди або йдуть
  • Трендовий ринок → асиметрична ліквідність (гірша на стороні тренду)

Ефекти між активами:

  • Коли BTC падає, загальна ліквідність ринку погіршується
  • Стресові події (hack, регуляторні) → різке погіршення

Модель прогнозування

import lightgbm as lgb
import pandas as pd
import numpy as np

def create_liquidity_features(df, spread_col='spread', depth_col='depth_1pct'):
    features = pd.DataFrame(index=df.index)
    
    # Часові ознаки
    features['hour'] = df.index.hour
    features['day_of_week'] = df.index.dayofweek
    features['is_weekend'] = (features['day_of_week'] >= 5).astype(int)
    features['hour_sin'] = np.sin(2 * np.pi * features['hour'] / 24)
    features['hour_cos'] = np.cos(2 * np.pi * features['hour'] / 24)
    
    # Лагова ліквідність
    for lag in [1, 4, 12, 24, 48]:
        features[f'spread_lag_{lag}'] = df[spread_col].shift(lag)
        if depth_col in df.columns:
            features[f'depth_lag_{lag}'] = df[depth_col].shift(lag)
    
    # Кільцюючі статистики
    for window in [12, 24, 72]:
        features[f'spread_ma_{window}'] = df[spread_col].rolling(window).mean()
        features[f'spread_std_{window}'] = df[spread_col].rolling(window).std()
    
    # Волатильність (проксі ліквідності)
    returns = df['close'].pct_change() if 'close' in df.columns else pd.Series(index=df.index)
    for window in [12, 24]:
        features[f'vol_{window}h'] = returns.rolling(window).std()
    
    # Обсяг
    if 'volume' in df.columns:
        features['vol_ratio'] = df['volume'] / df['volume'].rolling(24).mean()
    
    # Коефіцієнт Амігуда
    if 'close' in df.columns and 'volume' in df.columns:
        features['amihud'] = amihud_ratio(returns, df['volume'])
    
    return features.dropna()

def train_liquidity_model(liquidity_df, target_col='spread', horizon=4):
    """
    Передбачити спред/ліквідність через період горизонту
    """
    X = create_liquidity_features(liquidity_df)
    y = liquidity_df[target_col].shift(-horizon)  # майбутній спред
    
    # Walk-forward розділення
    split_idx = int(len(X) * 0.8)
    X_train, X_test = X.iloc[:split_idx], X.iloc[split_idx:]
    y_train, y_test = y.iloc[:split_idx], y.iloc[split_idx:]
    
    # Видалити NaN з цілі
    valid_mask = y_train.notna()
    
    model = lgb.LGBMRegressor(
        n_estimators=500,
        learning_rate=0.05,
        num_leaves=31,
        early_stopping_rounds=50
    )
    model.fit(
        X_train[valid_mask], y_train[valid_mask],
        eval_set=[(X_test, y_test.fillna(method='ffill'))],
        callbacks=[lgb.early_stopping(50), lgb.log_evaluation(100)]
    )
    
    return model

Оцінювання впливу на ринок

Перед виконанням великого ордера — прогноз його впливу на ціну:

def estimate_market_impact(order_size_usd, current_depth, 
                           current_spread, lambda_estimate):
    """
    Спрощена модель Альмгрена-Кріса для впливу на ринок
    """
    # Тимчасовий вплив (зникає швидко)
    temporary_impact = lambda_estimate * np.sqrt(order_size_usd)
    
    # Постійний вплив (ринкова інформація)
    permanent_impact = 0.5 * temporary_impact  # зазвичай 50% від тимчасового
    
    # Вартість спреду
    spread_cost = current_spread / 2 * order_size_usd
    
    total_cost = (temporary_impact + permanent_impact + spread_cost)
    total_cost_bps = total_cost / order_size_usd * 10000  # в basis points
    
    return {
        'total_impact_usd': total_cost,
        'total_impact_bps': total_cost_bps,
        'temporary': temporary_impact,
        'permanent': permanent_impact,
        'spread_cost': spread_cost,
        'optimal_execution': total_cost_bps > 10  # потрібен TWAP/VWAP
    }

Прогнозування ліквідності в production

Оновлення реального часу: прогноз ліквідності перераховується кожні 15 хвилин на наступні 4 години.

Інтеграція виконання: перед запуском великого ордера — перевірте прогноз ліквідності. Якщо очікується погіршення (наприклад, кінець робочого дня США наближається через 2 години) — прискорте виконання тепер.

Адаптивні спреди для маркет-мейкингу: при прогнозі зниження ліквідності — автоматично розширити котируємий спред.

Розробка моделі прогнозування ліквідності з часовими ознаками, лаговими spread/depth, урахуванням ринкового режиму, оцінюванням впливу на ринок (Almgren-Chriss) та інтеграцією з алгоритмами виконання.