Разработка алгоритма cross-exchange арбитража
Cross-exchange арбитраж — покупка актива на одной бирже и продажа на другой, где цена выше. Теоретически безрисковая прибыль. На практике — гонка с тысячами других арбитражных ботов, и выигрывают те, кто быстрее и умнее управляет балансами.
Типы cross-exchange арбитража
Spot арбитраж: покупаем BTC на Binance по $45,000, продаём на Kraken по $45,050. Прибыль $50 минус fees и transfer costs.
Basis арбитраж: покупаем BTC spot, продаём BTC futures (perpetual или delivery). Прибыль от spread между spot и futures (basis).
Funding rate арбитраж: покупаем spot, открываем short perpetual на бирже с высоким положительным funding rate. Получаем funding каждые 8 часов, хеджируя рыночный риск.
Stablecoin арбитраж: разные stablecoin пары (USDT/USDC) торгуются по разным ценам на разных биржах.
Главное ограничение: задержка переводов
Перевод BTC между биржами занимает 10–60 минут. За это время спред закроется. Поэтому реальный cross-exchange арбитраж работает только при наличии предварительно размещённых балансов на обеих биржах.
Решение: поддерживаем балансы на обеих биржах одновременно. Арбитраж происходит мгновенно (два ордера на двух биржах параллельно). Балансы выравниваются позже в фоновом режиме.
Binance balance: 5 BTC + 225,000 USDT
Kraken balance: 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 на fees, заработали $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: name -> 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']
# Учитываем fees
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,
'buy_price': buy_price,
'sell_price': sell_price,
'profit_pct': profit_pct
})
# И обратное направление
buy_price2 = tickers[sell_exchange]['ask']
sell_price2 = tickers[buy_exchange]['bid']
buy_cost2 = buy_price2 * (1 + self.get_fee(sell_exchange, 'taker'))
sell_revenue2 = sell_price2 * (1 - self.get_fee(buy_exchange, 'taker'))
profit_pct2 = (sell_revenue2 - buy_cost2) / buy_cost2
if profit_pct2 > self.min_profit:
opportunities.append({
'buy_exchange': sell_exchange,
'sell_exchange': buy_exchange,
'profit_pct': profit_pct2
})
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)
Риск-менеджмент
Max trade size: не более X% от минимального баланса на бирже Circuit breaker: при P&L < -0.5% за сессию — стоп Stale price detection: не торгуем если данные от биржи > 500ms устарели
Разрабатываем полноценную arb систему с параллельным мониторингом 5–10 бирж, управлением балансами и детальным P&L tracking.







