Биржа ставок как Betfair на своих данных: как устроена и что нужно для запуска
Как сделать свою биржу ставок по модели Betfair: чем биржа отличается от букмекера, какие данные даёт SportAPI, как сопоставлять ставки «за» и «против» и откуда взять ликвидность с первого дня.

Своя биржа ставок по модели Betfair состоит из двух слоёв: спортивных данных и ядра биржи. Данные — события, рынки, live-состояние и блокировки исходов — и расчёт рынков после матча даёт SportAPI. Ядро — книгу заявок, сопоставление ставок «за» и «против», кошельки и комиссию — пишет ваша команда или SportAPI в рамках разработки платформы под ключ. Данные по одному виду спорта стоят от $30 в месяц, а коэффициенты SportAPI решают главную проблему новой биржи — пустые рынки на старте.
Ниже — чем биржа отличается от букмекера, из каких частей она состоит, как сопоставлять ставки, как наполнить рынки ликвидностью с первого дня и как рассчитывать рынки после матча.
Чем биржа ставок отличается от букмекера
У букмекера игрок ставит против конторы по её коэффициентам. На бирже игроки ставят друг против друга: один ставит «за» исход (back), другой — «против» (lay), а биржа зарабатывает комиссию с чистого выигрыша.
| Букмекер | Биржа ставок | |
|---|---|---|
| Кто принимает ставку | Контора | Другой игрок |
| Кто задаёт коэффициент | Контора, с маржой | Игроки, через заявки |
| Ставка «против» исхода | Нет | Да, lay |
| Доход оператора | Маржа в коэффициентах | Комиссия с чистого выигрыша на рынке |
| Главный риск оператора | Результаты игроков | Пустые рынки без ликвидности |
Из-за отсутствия маржи коэффициенты на бирже обычно выше, чем у букмекеров, — это и привлекает игроков.
Из чего состоит биржа ставок
| Компонент | Что делает | Откуда |
|---|---|---|
| Каталог событий и рынков | Виды спорта, турниры, матчи, рынки и исходы | SportAPI: menu, events, event |
| Идентификаторы исходов | Стабильный ID каждого исхода для книги заявок | SportAPI: oc_pointer |
| Live-состояние | Счёт, период, время матча | SportAPI: live-линия |
| Приостановка рынков | Остановка торгов в опасные моменты | SportAPI: флаг oc_block |
| Опорные цены и ликвидность | Стартовые цены для маркетмейкера | SportAPI: коэффициенты линии |
| Расчёт рынков | Итог каждого исхода: выигрыш, проигрыш, возврат | SportAPI: услуга расчёта купонов (Coupon API) |
| Книга заявок и сопоставление | Сведение ставок «за» и «против» | Ваше ядро |
| Кошельки и комиссия | Баланс, резерв ответственности, комиссия | Ваше ядро |
Половина биржи — это данные, и их не нужно собирать самому. Вторая половина — ядро, и именно на него стоит направить силы команды.
Данные: события, рынки и идентификаторы исходов
Каталог биржи строится из API спортивной линии: menu даёт дерево видов спорта и турниров, events — матчи, event — все рынки матча. У каждого исхода есть указатель oc_pointer, например:
758850796|1|1|0 → матч 758850796, группа 1 (1x2), исход 1 (П1), параметр 0
Используйте oc_pointer как ID исхода в книге заявок: он стабилен, однозначно связывает заявки с матчем и рынком и тот же самый приходит в live. Формат указателя описан в модели коэффициентов.
Ядро: сопоставление ставок «за» и «против»
Каждый исход — это своя книга заявок. Ставка «за» ждёт, пока кто-то предложит такой же или более высокий коэффициент; ставка «против» — такой же или более низкий. Упрощённое ядро на Python:
from dataclasses import dataclass
@dataclass
class Order:
user: str
side: str # "back" — ставка за исход, "lay" — против исхода
odds: float
stake: float # сумма ставки бэкера; для lay — сколько ставок «за» готовы принять
class SelectionBook:
"""Книга заявок одного исхода, например oc_pointer 758850796|1|1|0."""
def __init__(self, selection_id):
self.selection_id = selection_id
self.backs, self.lays, self.matched = [], [], []
def place(self, order):
resting = self.lays if order.side == "back" else self.backs
# бэкер получает самый высокий коэффициент, лэйер — самый низкий
resting.sort(key=lambda o: o.odds, reverse=order.side == "back")
for other in resting:
if order.side == "back":
fits = other.odds >= order.odds
else:
fits = other.odds <= order.odds
if not fits or order.stake == 0:
break
size = min(order.stake, other.stake)
backer, layer = (order, other) if order.side == "back" else (other, order)
self.matched.append(
{"back": backer.user, "lay": layer.user, "odds": other.odds, "stake": size}
)
order.stake -= size
other.stake -= size
resting[:] = [o for o in resting if o.stake > 0]
if order.stake > 0:
(self.backs if order.side == "back" else self.lays).append(order)
def maker_quotes(odds_1x2, spread=0.03):
"""Цены маркетмейкера вокруг коэффициентов SportAPI, очищенных от маржи."""
inverse = {outcome: 1 / odds for outcome, odds in odds_1x2.items()}
total = sum(inverse.values())
quotes = {}
for outcome, value in inverse.items():
fair = total / value # коэффициент без маржи букмекера
quotes[outcome] = {
"lay": round(fair * (1 - spread), 2),
"back": round(fair * (1 + spread), 2),
}
return quotes
Пример: маркетмейкер готов принять ставки на П1 по 2.42, Анна хочет поставить «за» по коэффициенту не ниже 2.30 и получает лучшую доступную цену:
print(maker_quotes({"П1": 2.22, "Ничья": 3.72, "П2": 2.48}))
book = SelectionBook("758850796|1|1|0")
book.place(Order("maker", "lay", 2.42, 100)) # маркетмейкер принимает ставки на П1 по 2.42
book.place(Order("anna", "back", 2.30, 40)) # Анна согласна на 2.30 и выше — получает 2.42
print(book.matched)
print([(o.user, o.stake) for o in book.lays])
[{'back': 'anna', 'lay': 'maker', 'odds': 2.42, 'stake': 40}]
[('maker', 60)]
В реальной бирже к этому добавляются частичные исполнения с приоритетом по времени, резерв ответственности лэйера (ставка × (коэффициент − 1)), отмена заявок и аудит каждой сделки. Но логика остаётся той же.
Ликвидность с первого дня: маркетмейкер на коэффициентах SportAPI
Главная проблема новой биржи — пустые рынки: игроку не с кем заключить сделку, и он уходит. Решение — собственный бот-маркетмейкер, который выставляет заявки «за» и «против» вокруг честной цены.
Честную цену даёт линия SportAPI: если убрать из коэффициентов маржу, получится оценка вероятности каждого исхода. Функция maker_quotes из кода выше делает именно это:
Коэффициенты линии: П1 2.22 Ничья 3.72 П2 2.48 (маржа около 12%)
Честные коэффициенты: П1 2.49 Ничья 4.18 П2 2.78
Маркетмейкер: ставки «за» П1 принимает по 2.42, ставки «против» — по 2.57
Игрок видит на бирже 2.42 вместо 2.22 у букмекера, а маркетмейкер зарабатывает на спреде между ценами «за» и «против». По мере роста биржи заявки игроков вытесняют бота, и ликвидность становится живой. Обновляйте цены бота при каждом изменении линии — в live это раз в несколько секунд.
Live: приостановка рынков
В опасный момент — пенальти, удар по воротам, гол — коэффициенты резко меняются. Если рынок продолжает торговаться, быстрые игроки забирают заявки по устаревшим ценам. Поэтому биржи приостанавливают рынки.
В live-линии SportAPI у исхода есть флаг oc_block: true означает, что исход временно закрыт. Используйте его как сигнал:
oc_blockсталtrue→ приостановите рынок и не принимайте новые заявки.- Решите, что делать с неисполненными заявками: отменить или сохранить — это правило биржи, сообщите его игрокам заранее.
oc_blockсноваfalse→ откройте рынок, маркетмейкер выставляет новые цены по свежей линии.
Многие биржи добавляют к live-ставкам задержку в несколько секунд — ещё одна защита от торговли по опережающей информации.
Расчёт рынков и комиссия
После матча рынок закрывается и рассчитывается: каждый исход получает итог — выиграл, проиграл, возврат или половинный результат на азиатских рынках. Этот расчёт не нужно писать самому: его выполняет услуга расчёта купонов SportAPI. Она уже знает правила тоталов, фор и возвратов, сама отслеживает результат матча и присылает итог по каждому исходу через callback или по запросу. Ядру биржи остаётся распределить выплаты между участниками сделок и удержать комиссию.
Комиссия биржи берётся с чистого выигрыша игрока на рынке. Пример при комиссии 5%:
Ставка «за» 100 по коэффициенту 3.00 сыграла → чистый выигрыш 200
Комиссия 5% → 10, игрок получает 190 сверх ставки
Если игрок на одном рынке и выиграл, и проиграл несколько сделок, комиссия считается с итогового результата по рынку, а не с каждой сделки.
Лицензия, платежи и проверка игроков
Биржа ставок — это деятельность, которая требует лицензии в юрисдикции, где вы работаете, проверки игроков и платёжной инфраструктуры. Эти вопросы решаются до запуска, параллельно с разработкой. SportAPI закрывает спортивные данные и разработку платформы, но не выдаёт лицензий и не ведёт кошельки игроков.
Сколько стоит и с чего начать
| Что нужно | Стоимость |
|---|---|
| События, рынки, prematch и live, коэффициенты по одному виду спорта | от $30 в месяц |
| Расчёт рынков — услуга расчёта купонов | от $300 в месяц |
| Ядро биржи, кошельки, интерфейс | Своя команда или разработка платформы под ключ |
| Проверка до оплаты | Тестовый ключ SportAPI на 2 дня, все виды спорта |
Ошибки при запуске биржи
- Запуск без ликвидности. Пустая книга заявок отпугивает первых игроков навсегда. Маркетмейкер на коэффициентах линии нужен с первого дня.
- Торговля в опасный момент. Без приостановки по
oc_blockбиржа теряет деньги маркетмейкера и доверие игроков. - Собственные ID исходов. Если связывать заявки с матчами по названиям команд, неизбежны ошибки. Используйте
oc_pointer. - Комиссия с каждой сделки. Игроки бирж ждут комиссию с чистого выигрыша по рынку — иначе активные трейдеры уйдут.
- Слишком много видов спорта сразу. Ликвидность размазывается. Начните с футбола и пары топ-лиг, потом расширяйтесь.
Частые вопросы
Можно ли сделать биржу ставок только на данных SportAPI?
Данные и расчёт — да: события, рынки, live, блокировки и расчёт исходов после матча SportAPI закрывает полностью. Ядро биржи — книга заявок, кошельки и комиссия — разрабатывается отдельно: вашей командой или SportAPI под ключ.
Откуда на новой бирже возьмутся коэффициенты?
От игроков — через заявки. А на старте их задаёт маркетмейкер, который выставляет цены вокруг коэффициентов линии SportAPI без маржи.
Как бирже узнать, что рынок нужно приостановить?
По флагу oc_block в live-линии: когда исход временно закрыт, рынок на бирже тоже останавливается.
Чем биржа выгоднее для игрока, чем букмекер?
Коэффициенты без маржи и возможность ставить «против» исхода. Оператор зарабатывает комиссию с чистого выигрыша, а не на марже.
Можно ли проверить данные до оплаты?
Да. Тестовый ключ на 2 дня включает все виды спорта, prematch и live — этого хватит, чтобы построить каталог рынков и запустить маркетмейкера на тестовой бирже.
Что сделать сегодня
- Получите тестовый ключ SportAPI и постройте каталог событий из
menuиevents. - Сделайте
oc_pointerидентификатором исхода в своей книге заявок. - Запустите маркетмейкера на коэффициентах линии без маржи.
- Подключите приостановку рынков по
oc_block. - Подключите расчёт рынков через услугу расчёта купонов и комиссию с чистого выигрыша.
Напишите менеджеру SportAPI в Telegram, для каких видов спорта и рынков вы строите биржу, — вы получите тестовый ключ к API спортивной линии и коэффициентов или обсудите разработку платформы под ключ.
Betfair — товарный знак его владельца. SportAPI не связан с Betfair; название используется только для описания модели биржи ставок.