Розробка арбітражного бота
Арбітраж — це використання цінових розбіжностей між ринками для отримання прибутку без (теоретично) ринкового ризику. На практиці ризик exists: execution risk, latency risk, funding risk. Розберемось реальні арбітражні стратегії та їхнім технічну реалізацію.
Типи арбітражних стратегій
Простий арбітраж (міжбіржевий)
Один актив торгується на двох біржах по різній ціні. BTC на Binance — $42,100, на OKX — $42,150. Купуємо на Binance, продаємо на OKX, різниця $50 — наша прибуток.
Головна проблема: до моменту виконання обох ніг ціни вирівняються. Потрібна максимально низька latency та попередньо розташовані баланси на обох біржах.
Triangular Arbitrage (внутрибіржевий)
На одній біржі: BTC → ETH → USDT → BTC. Якщо добуток курсів > 1 + комісії — есть можливість.
Statistical Arbitrage (Pairs Trading)
Більш складний підхід: пошук статистично коінтегрованих пар (BTC/ETH історично рухаються разом). При розхідженні спреду сверх порога — long відстаючого, short обгоняючого.
Execution Ризики та їхня мітігація
Execution Risk
Між виявленням можливості та виконанням ціна може зміниться. Binance WebSocket latency — 10–50 мс. Інший бот може "з'їсти" можливість.
Мітігація:
- Colocation: сервер в одному датацентрі з біржею
- WebSocket замість REST: підписка на orderbook оновлення
- Pre-placed orders: limit ордери близько до ринку
Inventory Risk
Якщо одна нога виконалась, а інша ні — залишається відкрита позиція з ринковим ризиком. Це називається "leg risk".
Transfer Risk (міжбіржевий)
Міжбіржевий арбітраж вимагає утримання балансів на обох біржах. Трансфер між займає 10–60 хвилин (кілька підтвердждень блокчейну). Ціна може змінитися.
Рішення: капіталомістка модель — держити достатній баланс на кожній біржі заранее. Ребалансировка кожні кілька годин при дисбалансу сверх порога.
P&L та моніторинг
class ArbitragePnL:
def record_trade(self, trade: ArbitrageTrade):
gross_profit = trade.sell_amount - trade.buy_amount
fees = trade.buy_fee + trade.sell_fee + trade.transfer_fee
net_profit = gross_profit - fees
self.daily_pnl += net_profit
self.total_volume += trade.quantity
if net_profit < 0:
self.losing_trades += 1
log.warning(f"Losing arbitrage: net {net_profit:.4f} USDT")
def get_stats(self) -> dict:
return {
'daily_pnl': self.daily_pnl,
'win_rate': self.winning_trades / max(self.total_trades, 1),
'avg_profit_per_trade': self.daily_pnl / max(self.total_trades, 1),
'volume': self.total_volume,
}
| Тип арбітражу | Необхідний капітал | Складність | Конкуренція |
|---|---|---|---|
| Міжбіржевий spot | Високий | Середня | Дуже висока |
| Triangular (внутри біржи) | Середній | Середня | Висока |
| Statistical / Pairs | Середній | Висока | Помірна |
| Cross-chain (DeFi) | Середній | Дуже висока | Помірна |
| Funding rate | Середній | Низька | Помірна |
Сроки розробки
- Простий міжбіржевий арбітраж з 2 біржами: 4–6 тижнів
- Triangular arb: 3–4 тижні
- Statistical arb: 6–10 тижнів (включаючи research коінтеграції)
- Production-ready система з моніторингом та авто-ребалансировкою: 3–4 місяці







