Розробка алгоритму triangular арбітража
Triangular арбітраж — циклічна торговля трьома валютними парами в рамках однієї біржі для отримання прибутку з ціннісних невідповідностей. Не вимагає переводів між біржами — все відбувається на одній платформі. Ключовий параметр: швидкість. Можливості тривають мілісекунди.
Принцип triangular арбітража
Цикл з трьох пар: A → B → C → A
Приклад:
- BTC/USDT: 45,000 (1 BTC = 45,000 USDT)
- ETH/USDT: 3,000 (1 ETH = 3,000 USDT)
- ETH/BTC: 0.0668 (1 ETH = 0.0668 BTC)
Теоретично: 1 ETH повинен коштувати 3000/45000 = 0.0667 BTC. Реально: 1 ETH = 0.0668 BTC. Невідповідність = 0.01 BTC (~$45).
Торговельний цикл:
- Продаємо 45,000 USDT → купуємо 15 ETH (по ETH/USDT 3000)
- Продаємо 15 ETH → отримуємо 1.002 BTC (по ETH/BTC 0.0668)
- Продаємо 1.002 BTC → отримуємо 45,090 USDT (по BTC/USDT 45,000)
Прибуток: 90 USDT − комісії. Якщо 3 × taker fee 0.04% = 0.12% ≈ 54 USDT → net profit ~$36.
Формула прибыльності цикла
def calculate_cycle_profit(pair1_rate, pair2_rate, pair3_rate, fee=0.001):
"""
Перевіряємо цикл: USDT → BTC → ETH → USDT
"""
# Починаємо з 1 USDT
after_trade1 = (1 / pair1_rate) * (1 - fee) # USDT → BTC
after_trade2 = (after_trade1 / pair2_rate) * (1 - fee) # BTC → ETH
after_trade3 = after_trade2 * pair3_rate * (1 - fee) # ETH → USDT
profit = after_trade3 - 1 # > 0 = прибутковий
return profit
Пошук прибутникових циклів
Graph підхід: будуємо граф валют, де рёбра — торговельні пари з вагами (log обмінних курсів). Шукаємо негативні цикли алгоритмом Bellman-Ford.
import networkx as nx
import math
def find_arbitrage_cycles(tickers):
G = nx.DiGraph()
for symbol, ticker in tickers.items():
base, quote = symbol.split('/')
bid = ticker['bid']
ask = ticker['ask']
if bid > 0:
# base → quote: продаємо base, отримуємо quote
G.add_edge(base, quote, weight=-math.log(bid))
if ask > 0:
# quote → base: купуємо base, платимо quote
G.add_edge(quote, base, weight=-math.log(1/ask))
# Шукаємо негативні цикли (прибуткові арбітражі)
try:
cycle = nx.find_negative_cycle(G, source='USDT')
return cycle
except nx.NetworkXError:
return None
Швидкість виконання критична
Triangular арбітраж — висококонкурентна ніша. Можливості тривають 100–500ms. Оптимізаціі:
Pre-computed paths: не обчислюємо цикли з нуля при кожному оновленні. Заздалегідь визначаємо всі можливі трійки, у реальному часі тільки перевіряємо їхню прибутковість.
Selective monitoring: не монітеруємо всі пари (Binance має ~2000). Вибираємо топ-50 по обсягу.
Order preparation: всі параметри ордерів (symbol, quantity, price) обчислюються заздалегідь, надсилаємо при спрацюванні.
WebSocket для всіх пар: REST polling занадто повільний. Binance підтримує stream кількох пар: wss://stream.binance.com/stream?streams=btcusdt@bookTicker/ethusdt@bookTicker/ethbtc@bookTicker
Розрахунок оптимального розміру сделки
def optimal_trade_size(step1_depth, step2_depth, step3_depth, max_slippage=0.001):
"""
Максимальний обсяг де slippage не з'їдає прибуток
"""
# Per step: скільки обсягу можемо взяти в межах max_slippage
size1 = get_available_liquidity(step1_depth, max_slippage)
size2 = get_available_liquidity(step2_depth, max_slippage)
size3 = get_available_liquidity(step3_depth, max_slippage)
# Мінімальне з трьох — наше обмеження
return min(size1, size2, size3)
Ризики
Partial fill: один з трьох ордерів виконаний частково. Виникає відкрита позиція. Потрібен обробник: негайно закрити залишок по ринку.
Stale data: ціни дані > 200ms застарілі — пропустити можливість.
API rate limits: три одночасних ордери споживають три API requests. На сотнях сигналів на хвилину можемо упертися в limits.
Front-running: market makers бачать паттерн, закриває arb спред швидше за нас.
Реалістичні очікування
На топових парах (BTC/ETH/BNB), triangular арбітраж надзвичайно конкурентний — професіональні HFT боти закривають спреди за мілісекунди. Можливості частіше на менш ліквідних altcoin парах, але там вищий slippage та менший обсяг.
Розробляємо triangular arb систему з граф-алгоритмом пошуку циклів, real-time WebSocket моніторингом, паралельним виконанням трьох ордерів та обробником partial fills.







