Розробка алгоритму cross-exchange арбітража
Cross-exchange арбітраж — покупка активу на одній біржі та продаж на іншій, де ціна вище. Теоретично безрисковий прибуток. На практиці — гонитва з тисячами інших арбітражних ботів, і перемагають ті, кого швидше та розумніше управляють балансами.
Типи cross-exchange арбітража
Spot арбітраж: купуємо BTC на Binance по $45,000, продаємо на Kraken по $45,050. Прибуток $50 мінус комісії та витрати transfer.
Basis арбітраж: купуємо BTC spot, продаємо BTC futures (perpetual або delivery). Прибуток від спреду між spot та futures (basis).
Funding rate арбітраж: купуємо spot, відкриваємо short perpetual на біржі з високим позитивним funding rate. Отримуємо funding кожні 8 годин, хеджуючи ринковий ризик.
Stablecoin арбітраж: різні stablecoin пари (USDT/USDC) торгуються по різних ціна на різних біржах.
Головне обмеження: затримка переводів
Перевід BTC між біржами займає 10–60 хвилин. За це час спред закриється. Тому реальний cross-exchange арбітраж працює тільки при наявності попередньо розміщених балансів на обох біржах.
Рішення: утримуємо балансів на обох біржах одночасно. Арбітраж відбувається миттєво (два ордери на двох біржах паралельно). Балансів вирівнюються пізніше у фоновому режимі.
Binance баланс: 5 BTC + 225,000 USDT
Kraken баланс: 5 BTC + 225,000 USDT
Арбітражна можливість: BTC дешевше на Binance на $80
→ Купити 1 BTC на Binance (225,000 → 179,950 USDT, BTC: 5 → 6)
→ Продати 1 BTC на Kraken (BTC: 5 → 4, USDT: 225,000 → 270,030 USDT)
Після: Binance: 6 BTC + 179,950 USDT | Kraken: 4 BTC + 270,030 USDT
Всього: 10 BTC + 449,980 USDT (було 10 BTC + 450,000)
Втратили $20 на комісіях, заробили $80 gross → $60 net profit
Алгоритм пошуку арбітражних можливостей
import asyncio
from decimal import Decimal
class CrossExchangeArbitrage:
def __init__(self, exchanges, min_profit_pct=0.05):
self.exchanges = exchanges # dict: назва -> ccxt exchange
self.min_profit = min_profit_pct / 100
async def scan_opportunities(self, symbol):
# Паралельні запити на найкращі ціни зі всіх бірж
tasks = {
name: asyncio.create_task(ex.fetch_ticker(symbol))
for name, ex in self.exchanges.items()
}
tickers = {name: await task for name, task in tasks.items()}
opportunities = []
exchanges = list(tickers.keys())
for i, buy_exchange in enumerate(exchanges):
for sell_exchange in exchanges[i+1:]:
buy_price = tickers[buy_exchange]['ask']
sell_price = tickers[sell_exchange]['bid']
# Враховуємо комісії
buy_cost = buy_price * (1 + self.get_fee(buy_exchange, 'taker'))
sell_revenue = sell_price * (1 - self.get_fee(sell_exchange, 'taker'))
profit_pct = (sell_revenue - buy_cost) / buy_cost
if profit_pct > self.min_profit:
opportunities.append({
'buy_exchange': buy_exchange,
'sell_exchange': sell_exchange,
'profit_pct': profit_pct
})
return sorted(opportunities, key=lambda x: x['profit_pct'], reverse=True)
Виконання: Паралельні ордери
Обидва ордери надіслані одночасно для мінімальної latency:
async def execute_arbitrage(self, opportunity, qty):
buy_task = asyncio.create_task(
self.exchanges[opportunity['buy_exchange']].create_market_buy_order(symbol, qty)
)
sell_task = asyncio.create_task(
self.exchanges[opportunity['sell_exchange']].create_market_sell_order(symbol, qty)
)
buy_result, sell_result = await asyncio.gather(buy_task, sell_task)
return buy_result, sell_result
Ризик частичного виконання: один з ордерів міг не виконатися або виконатися частково. Потрібен механізм вирівнювання позицій.
Управління балансами
Автоматична ребалансировка між біржами:
- Моніторинг балансів кожні N хвилин
- При відхиленні балансу > 20% від цільового → ініціювати transfer
- Transfer проходить у фоні, не блокуючи торговлю
- Моніторинг підтверджень транзакції
Latency оптимізація
- VPS у датацентрах бірж: AWS Tokyo для Binance/Bybit, AWS Frankfurt для Kraken/Bitfinex
- Ping 1–5ms до серверів бірж
- Попередня аутентифікація та утримання з'єднань
- Кеш балансів у памяті (оновлюється через WebSocket)
Risk management
Max trade size: не більше X% від мінімального балансу на біржі Circuit breaker: P&L < -0.5% за сесію → стоп Stale price detection: не торгуємо якщо дані від біржи > 500ms застарілі
Розробляємо повноцінну arb систему з паралельним моніторингом 5–10 бірж, управлінням балансами та детальним P&L tracking.







