Розробка TWAP (Time-Weighted Average Price) алгоритму виконання
TWAP (Time-Weighted Average Price) — алгоритм виконання великих ордерів шляхом рівномірного розподілу обсягу у часі. Мета не у отриманні прибутку від руху ціни, а у мінімізації рыночного впливу при виконанні: великий ордер, виставлений одночасно, зсуне ціну проти вас. TWAP ділить його на рівні частини через рівні інтервали.
Принцип роботи
Потрібно купити 100 BTC за 4 години без сильного впливу на ринок:
Кожні 10 хвилин: купити 100/24 ≈ 4.17 BTC
Всього 24 інтервали × 4.17 BTC = 100 BTC
Простий TWAP: рівні частки через рівні часові інтервали.
Адаптивний TWAP враховує ринкові умови:
- Пропускаємо інтервал якщо поточна ціна значно вища за TWAP (не купуємо дорого)
- Збільшуємо розмір ордера якщо ціна нижче поточного TWAP
- Пауза при аномально високій волатильності
Реалізація
import asyncio
from datetime import datetime, timedelta
class TWAPExecutor:
def __init__(self, symbol, total_qty, duration_minutes, exchange):
self.symbol = symbol
self.total_qty = total_qty
self.n_slices = duration_minutes // 5 # кожні 5 хвилин
self.slice_qty = total_qty / self.n_slices
self.exchange = exchange
self.executed_qty = 0
async def execute(self):
interval = (5 * 60) # секунди
for i in range(self.n_slices):
await self.execute_slice()
if i < self.n_slices - 1:
await asyncio.sleep(interval)
async def execute_slice(self):
remaining = self.total_qty - self.executed_qty
qty = min(self.slice_qty, remaining)
# Використовуємо limit order близько до mid-price для економії на комісіях
ticker = await self.exchange.fetch_ticker(self.symbol)
mid_price = (ticker['bid'] + ticker['ask']) / 2
limit_price = mid_price * 1.0005 # 0.05% вище mid
order = await self.exchange.create_limit_buy_order(
self.symbol, qty, limit_price
)
self.executed_qty += qty
return order
Limit vs Market ордери у TWAP
Market orders: гарантоване виконання, але гірша ціна. Slippage на BTC може бути 0.02–0.1% на обсягу > $100K.
Limit orders: краща ціна, але ризик невиконання. Якщо ордер не виконаний за інтервал — конвертуємо у market близько до кінця інтервалу.
Hybrid підхід: виставляємо limit агресивніше за mid. Якщо 80% інтервалу невиконаний — snipe через market order.
TWAP benchmark та оцінка якості
Execution quality = середнє виконання vs ринковий TWAP за період:
TWAP_benchmark = Σ(price_i × volume_i) / Σ(volume_i) за період виконання
Якщо алгоритм купив по average price нижче ринкового TWAP — добре виконання. Вище — погане.
Slippage report: по кожному слайсу фіксуємо: ціна quote, ціна fill, bid/ask spread у момент виконання.
Застосування
- Виконання великих ордерів фондів без руху ринку
- Регулярні DCA (Dollar Cost Averaging) покупки
- Liquidation великих позицій
- Rebalancing портфеля
Стек: Python (asyncio + CCXT), PostgreSQL для зберігання ордерів та execution report, REST API для управління (запуск, зупинка, статус виконання). Уведомлення про прогрес через Telegram.







