Створення Volume Profile бота для криптобірж
Ми будуємо Volume Profile ботів на тікових даних Level 2. Такі боти в реальному часі відображають розподіл обсягу за цінами, знаходять зони накопичення великих гравців і автоматично визначають Point of Control (POC) та Value Area. На відміну від VWAP-індикаторів, профіль обсягу показує горизонтальну концентрацію ліквідності, що дозволяє входити в угоди з мінімальним прослизанням.
Кейс з практики: Для Binance Futures ми розробили бота, який аналізує Volume Profile на 1-хвилинних тіках. Результат: 90% угод мали прослизання менше 0.05%, POC використано як динамічний рівень стоп-лосу. Бот відпрацював 8 місяців з uptime 99.96%.
Які проблеми вирішуємо
Стандартні VWAP-індикатори показують лише середню ціну, але не дають картини горизонтального розподілу обсягу. Трейдери часто відкривають позиції на прорив рівнів, які насправді є High Volume Nodes — зонами сконцентрованого інтересу великих гравців. Наш підхід виключає такі помилки: бот аналізує кластери обсягу та здійснює угоди тільки в зонах з низькою активністю (Low Volume Nodes), покращуючи ковзання.
Економічна ефективність: зниження прослизання на 0.5–1.5% від обсягу угоди безпосередньо збільшує PnL. При обороті $100 тис./місяць це дає $500–1500 додаткового прибутку. У порівнянні з VWAP, Volume Profile зменшує прослизання в 3–10 разів на ринках з високою волатильністю.
Як ми розробляємо Volume Profile ботів
Збір та обробка тікових даних
Підключаємось до WebSocket-каналів біржі (Binance, Bybit, OKX) та отримуємо транзакції з міткою часу, ціною та обсягом. Для кожної ціни будується гістограма — скільки контрактів продано/куплено. За період (24 години) отримуємо Volume Profile.
import asyncio import pandas as pd from collections import defaultdict class VolumeProfile: def __init__(self, period_seconds: int = 86400): self.volume_profile = defaultdict(float) # price -> volume self.period_seconds = period_seconds self.start_time = time.time() async def add_trade(self, price: float, volume: float): self.volume_profile[price] += volume def get_poc(self) -> float: """Point of Control — ціна з максимальним обсягом""" return max(self.volume_profile, key=self.volume_profile.get) def get_value_area(self, percentage: float = 0.70) -> tuple[float, float]: total_volume = sum(self.volume_profile.values()) sorted_prices = sorted(self.volume_profile.items(), key=lambda x: -x[1]) cumm = 0 value_area = [] for price, vol in sorted_prices: cumm += vol value_area.append(price) if cumm / total_volume >= percentage: break return min(value_area), max(value_area) def reset(self): self.volume_profile.clear() self.start_time = time.time() У продакшені додаємо згладжування, врахування спреду та обробники помилок при випадінні даних.
Інтеграція торгової логіки
Знайдені POC та Value Area використовуються як динамічні рівні. Бот виставляє лімітні ордери по POC з невеликим зміщенням, використовуючи VWAP Execution для розбивки великих обсягів. Нижче — приклад реалізації VWAP-виконання:
import pandas_ta as ta from decimal import Decimal class VWAPBot: def __init__(self, symbol: str, session_start_hour: int = 0): self.exchange = ccxt.binance({'apiKey': API_KEY, 'secret': SECRET}) self.symbol = symbol self.session_start_hour = session_start_hour self.upper_band_std = 2.0 self.lower_band_std = 2.0 async def calculate_vwap(self) -> tuple[Decimal, Decimal, Decimal]: ohlcv = await self.exchange.fetch_ohlcv(self.symbol, '1m', limit=480) df = pd.DataFrame(ohlcv, columns=['ts','open','high','low','close','volume']) df['typical_price'] = (df['high'] + df['low'] + df['close']) / 3 df['tp_vol'] = df['typical_price'] * df['volume'] df['cum_tp_vol'] = df['tp_vol'].cumsum() df['cum_vol'] = df['volume'].cumsum() df['vwap'] = df['cum_tp_vol'] / df['cum_vol'] current_vwap = Decimal(str(df['vwap'].iloc[-1])) current_price = Decimal(str(df['close'].iloc[-1])) deviation = df['close'] - df['vwap'] std = Decimal(str(deviation.std())) upper_band = current_vwap + std * Decimal(str(self.upper_band_std)) lower_band = current_vwap - std * Decimal(str(self.lower_band_std)) return current_vwap, upper_band, lower_band async def get_signal(self) -> str: vwap, upper, lower = await self.calculate_vwap() current_price = await self.get_current_price() if current_price < lower: return 'BUY' elif current_price > upper: return 'SELL' elif abs(current_price - vwap) / vwap < Decimal('0.001'): return 'CLOSE_POSITION' return 'HOLD' class VWAPExecution: def __init__(self, total_qty: Decimal, start_time: datetime, end_time: datetime): self.total_qty = total_qty self.start_time = start_time self.end_time = end_time self.executed_qty = Decimal('0') def get_slice_quantity(self, current_time: datetime, predicted_volume_pct: Decimal) -> Decimal: remaining_qty = self.total_qty - self.executed_qty slice_qty = self.total_qty * predicted_volume_pct return min(slice_qty, remaining_qty) Як Volume Profile допомагає знаходити ліквідність?
Volume Profile акумулює обсяг кожного тіка в гістограму за цінами. Кластери з максимальним обсягом (POC) — точки, де великі гравці активно торгували. При повторному тестуванні цієї ціни висока ймовірність відскоку або прориву з потужним рухом. Бот використовує цей ефект для входу з мінімальним прослизанням.
Чому ми використовуємо Level 2 дані?
Рівень 2 (стакан) дає інформацію не лише про здійснені угоди, а й про лімітні ордери — приховану ліквідність. Будуючи Volume Profile на основі стакану, ми можемо передбачити зони підтримки/опору до того, як вони будуть протестовані ринком. Це дає перевагу в 100–500 мілісекунд, що критично для високочастотної торгівлі. Детальніше про market microstructure.
Порівняння VWAP та Volume Profile
| Параметр | VWAP | Volume Profile |
|---|---|---|
| Що показує | Середньозважена ціна за період | Розподіл обсягу за цінами |
| Типове застосування | Оцінка якості виконання | Пошук ліквідності, зон накопичення |
| Дані | Ціна×Обсяг (кумулятивно) | Тіки або 1m свічки |
| Вимоги до ресурсів | Низькі | Високі |
| Об'єкт торгівлі | Будь-який | Переважно ф'ючерси та криптовалюти |
Об'ємний профіль дає більш детальну картину, дозволяючи торгувати від рівнів з високою концентрацією обсягу. У порівнянні з VWAP, Volume Profile зменшує прослизання в 3–10 разів на ринках з високою волатильністю.
Що входить у роботу
| Етап | Результат | Термін |
|---|---|---|
| Аналіз стратегії | Визначення бірж, періодів профілю, правил входу/виходу | 2–3 дні |
| Проектування | Архітектура модулів | 3–5 днів |
| Розробка ядра | Volume Profile, брокерський API, логіка ордерів | 10–15 днів |
| Інтеграція, paper trading | Підключення тестового середовища, налагодження slippage та latency | 5–7 днів |
| Деплой, моніторинг | VPS, Grafana, алертинг | 3–4 дні |
| Пост-підтримка | 2 тижні виправлень та оптимізації | 2 тижні |
Покрокова інструкція з налаштування базового бота
- Встановіть Python 3.10+, бібліотеки
ccxt,pandas_ta,asyncio. - Налаштуйте WebSocket-підключення до біржі (приклад для Binance:
wss://stream.binance.com:9443/ws). - Реалізуйте клас
VolumeProfileяк у прикладі вище, запустіть збір даних. - Створіть модуль стратегії, який подає сигнали на основі POC/Value Area.
- Підключіть VWAP-виконання для відправки ордерів.
- Розгорніть на VPS та налаштуйте моніторинг через Grafana.
Документація: повний опис API, конфігів, інструкція із запуску. Гарантія: 7 днів безкоштовних правок після здачі. Досвід: 5+ років у HFT, понад 50 реалізованих ботів, загальний обсяг оброблених ордерів >$10 млн, середній напрацювання на відмову — 99.9%.
Зв'яжіться з нами для обговорення вашої стратегії — ми безкоштовно оцінимо проект та запропонуємо оптимальне рішення. Замовте розробку Volume Profile бота за 3–6 тижнів та отримайте готовий інструмент для торгівлі.
Джерело: Практика впровадження Volume Profile у high-frequency trading (дослідження команди).







