Что такое арбитраж: ваш первый сканер за 10 минут

Урок 1 курса по арбитражу. Что означает арбитраж, почему возникают разрывы цен и как написать сканер на десять строк Python, который сравнивает лучшую цену bid и ask одной монеты на двух биржах.

Урок 1 курса "Арбитраж: от нуля до собственного сканера". Опыт торговли не нужен. Нужны Python и десять минут.

Пример с карандашом

Представьте две лавки на одной улице. В лавке A пара кроссовок стоит 100 долларов. В лавке B готовы купить такую же пару у любого за 108 долларов. Вы покупаете ее в A, проходите двадцать метров, продаете в B и оставляете себе 8 долларов. Вам не пришлось гадать, станут ли кроссовки популярнее или потеряют популярность. Нужно было только заметить, что цены не совпадают.

Это и есть арбитраж: купить что-то там, где это дешевле, и в тот же момент продать то же самое там, где дороже, оставив себе разницу.

В этой фразе важны две части:

  • "то же самое": в обеих лавках продается одна и та же пара кроссовок;
  • "в тот же момент": если подождать неделю, цены могут измениться, и разница исчезнет.

Почему возникают разрывы цен?

На криптобирже тысячи людей и программ каждую секунду покупают и продают биткоин. На каждой бирже своя толпа участников, поэтому цены немного различаются. Новости доходят до бирж с небольшой задержкой, а перевод денег между ними занимает время. Поэтому цена одной и той же монеты на двух биржах почти одинаковая, но редко совпадает точь-в-точь.

Разрывы остаются небольшими благодаря программам, которые следят за ними и закрывают их. Сегодня вы создадите совсем простую версию такой программы.

Два важных слова: bid и ask

На бирже есть список заявок. Покупатели указывают, по какой цене готовы купить, а продавцы — по какой готовы продать.

  • Bid — самая высокая цена, которую кто-то готов заплатить за монету прямо сейчас.
  • Ask — самая низкая цена, за которую кто-то готов продать монету прямо сейчас.

Если вы хотите немедленно купить, то платите по ask. Если хотите немедленно продать, то получаете цену bid. На одной бирже ask всегда выше bid. Расстояние между ними называется спредом. Это встроенная в биржевую торговлю цена сделки.

Небольшой пример с числами:

Bid (здесь вы продаете)Ask (здесь вы покупаете)
Биржа A100.00100.10
Биржа B100.30100.40

Покупаете на A по ask, за 100.10. Продаете на B по bid, за 100.30. Разница составляет 100.30 − 100.10 = 0.20 на монету. На 1000 монет это 200 до вычета комиссий.

Теперь наоборот: покупаете на B за 100.40, продаете на A за 100.00. Теряете 0.40 на монету. Значит, если разрыв есть, то только в одном направлении.

Правило в одной строке:

Разрыв = bid там, где продаете, − ask там, где покупаете.

Если разрыв положительный, его стоит проверить. Если он равен нулю или отрицательный, проверять нечего.

Три важных предупреждения перед кодом

  1. Комиссии. Каждая биржа берет небольшой процент с каждой сделки. Разрыв 0.20 при цене 100 — это 0.2 процента. Если общая комиссия на двух биржах составляет 0.2 процента, прибыли не будет. В следующем уроке мы подробно разберем комиссии.
  2. Объем. Лучшая цена bid и ask действует только для небольшого количества монет. Если вы захотите торговать большим объемом, придется "съедать" следующие заявки по худшим ценам. Этому посвящены уроки 9 и 10.
  3. Скорость. Пока вы замечаете разрыв, кто-то другой уже может его закрыть. Об этом урок 11.

Сегодняшняя программа — термометр: она показывает, есть ли разрыв, и ничего не говорит о том, получится ли на нем заработать.

Мини-сканер

Этот сканер показывает прямой и самый простой вариант: один запрос к каждой бирже, одно вычитание, никаких комиссий, объемов и обработки ошибок. Это простейшая рабочая версия, и в следующих уроках вы увидите, в чем она ошибается: комиссии разберем в уроке 4, глубину стакана — в уроке 9, время — в уроке 11. Сначала создадим простую версию, чтобы позже каждая доработка решала уже знакомую проблему.

Программа запрашивает у двух бирж лучшие цены bid и ask одной и той же монеты и выводит разрыв в обоих направлениях. Она использует только общедоступные данные. Аккаунт, ключ API и деньги не нужны.

import json
import urllib.request

def get(url):
    with urllib.request.urlopen(url, timeout=10) as r:
        return json.load(r)

# Биржа A: Binance, пара BTC / USDT
a = get("https://api.binance.com/api/v3/ticker/bookTicker?symbol=BTCUSDT")
a_bid, a_ask = float(a["bidPrice"]), float(a["askPrice"])

# Биржа B: Kraken, та же монета
b = get("https://api.kraken.com/0/public/Ticker?pair=XBTUSDT")
b = next(iter(b["result"].values()))
b_bid, b_ask = float(b["b"][0]), float(b["a"][0])

print("A bid/ask:", a_bid, a_ask)
print("B bid/ask:", b_bid, b_ask)
print("buy A, sell B:", round(b_bid - a_ask, 2))
print("buy B, sell A:", round(a_bid - b_ask, 2))

Сохраните код в файл scanner.py и запустите командой python3 scanner.py.

Какой результат вы увидите

Вы увидите четыре цены и два числа. Для биткоина на двух крупных биржах оба числа обычно отрицательные или близки к нулю. Иногда одно из них оказывается немного больше нуля. Во время тестового запуска bid и ask на одной бирже были около 75,782, а на другой — 75,786: в одном направлении разрыв составил +3.89, в другом −4.00. Положительное значение — это 3.89 / 75,782 = 0.005 процента, что намного меньше комиссий около 0.2 процента. Это нормально, и в этом главный урок: на ликвидных монетах и ликвидных биржах рынок эффективен, поэтому разрыв, который покроет комиссии, встречается редко и быстро исчезает.

Запустите программу несколько раз с интервалом в минуту. Следите, как меняются оба числа. Запишите лучшее значение, которое увидите.

Если один запрос не сработает, возможно, биржа блокирует вашу страну или сеть. Замените ее другой биржей, у которой есть общедоступный API цен. Структура программы останется такой же.

Попросите ИИ-агента написать код

В этом курсе вы вместе с ИИ-агентом, например Claude Code или Codex, создадите собственного арбитражного бота. Агент пишет код. Вы решаете, что создавать, и проверяете результат. Проверку нельзя поручить кому-то другому: агент может вывести уверенно выглядящее, но неверное число.

Сравним два варианта просьбы о сегодняшней программе.

Расплывчатая просьба:

Сделай мне сканер арбитража.

Агенту придется самому решить все детали: какие биржи и монету выбрать, что должен выводить "сканер" и нужно ли учитывать комиссии. Он может создать что-то большое, в чем вы не разберетесь.

Просьба, в которой четко указано, что вам нужно:

Напиши scanner.py на Python без дополнительных библиотек. Получи лучшие цены bid и ask для BTC/USDT на Binance и Kraken через их общедоступные REST API. Выведи обе котировки и разрыв в обоих направлениях по формуле bid_sell минус ask_buy. Не используй ключи API и не совершай сделки. Ограничь код 40 строками, а символ пары укажи в начале файла.

Так вы сможете сами проверить ответ: разрыв для каждого направления должен равняться одной цене bid минус одной цене ask, и результат можно пересчитать на калькуляторе. Придерживайтесь этого подхода весь курс: просите небольшой фрагмент, запускайте его, проверяйте одно число вручную и сохраняйте версию — например, коммитом git или просто копией файла.

Упражнение

  1. Запустите сканер три раза и каждый раз запишите четыре цены и оба разрыва.
  2. Замените BTCUSDT и XBTUSDT на другую монету, которая есть на обеих биржах, например ETH. Разрыв больше или меньше, чем у биткоина? У менее торгуемых монет разрывы обычно шире. Подумайте почему.
  3. Рассчитайте вручную разрыв в процентах от цены покупки: gap / ask * 100. Сравните его с комиссией 0.1 процента на каждой бирже, то есть с общей комиссией 0.2 процента. Был ли хотя бы один из трех ваших результатов выше этого уровня?

Что дальше

Сегодня вы сравнили два числа. Настоящая арбитражная система делает то же самое для тысяч пар на многих биржах, а затем подробно проверяет лучшие варианты. В уроке 2 мы разберем разные виды арбитража, а в уроке 3 — этапы работы любой системы.