Розробка бота на базі VWAP
VWAP (Volume Weighted Average Price) — середньозважена по об'єму ціна. Показує справедливу ціну інструменту з урахуванням обсягу торгів. Трейдери використовують VWAP як динамічний рівень підтримки/опору та для оцінки якості виконання.
Що таке VWAP
VWAP розраховується накопичувально з початку торговельної сесії (або за період):
VWAP = Σ(Price × Volume) / Σ(Volume)
Ціна вище VWAP → інструмент торгується вище справедливої вартості (потенціал продажу).
Ціна нижче 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
# VWAP bounds — стандартні відхилення від VWAP
self.upper_band_std = 2.0 # продаємо при ціні вище VWAP + 2σ
self.lower_band_std = 2.0 # купуємо при ціні нижче VWAP - 2σ
async def calculate_vwap(self) -> tuple[Decimal, Decimal, Decimal]:
"""Повертає (vwap, upper_band, lower_band)"""
# Отримуємо дані з початку сесії
ohlcv = await self.exchange.fetch_ohlcv(self.symbol, '1m', limit=480) # 8 годин
df = pd.DataFrame(ohlcv, columns=['ts','open','high','low','close','volume'])
# Типична ціна
df['typical_price'] = (df['high'] + df['low'] + df['close']) / 3
# VWAP: накопичувальне зважене середнє
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]))
# Стандартне відхилення від VWAP
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' # ціна сильно нижче VWAP
elif current_price > upper:
return 'SELL' # ціна сильно вище VWAP
elif abs(current_price - vwap) / vwap < Decimal('0.001'):
return 'CLOSE_POSITION' # ціна у VWAP — виходимо
return 'HOLD'
VWAP як інструмент виконання (VWAP execution)
У інституціональній торгівлі VWAP — це не тільки індикатор, але й алгоритм виконання крупного ордера. Задача: виконати 1000 BTC так, щоб середня ціна виконання була близька до ринкового VWAP.
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)
Розробка VWAP бота з bands strategy та моніторингом відхилення від VWAP: 2–3 тижні.







