Розробка моделі прогнозування ліквідності
Ліквідність крипторинку — не константа. Вона різко падає в періоди ринкового стресу, поза робочими годинами та при аномальних подіях. Модель прогнозування ліквідності дозволяє алгоритмічним системам адаптувати стратегію: змінювати розміри ордерів, розширювати спреди, відкладати виконання.
Метрики ліквідності
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) та інтеграцією з алгоритмами виконання.







