SportAPI
Букмекерские платформы

Биржа ставок как 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 означает, что исход временно закрыт. Используйте его как сигнал:

  1. oc_block стал true → приостановите рынок и не принимайте новые заявки.
  2. Решите, что делать с неисполненными заявками: отменить или сохранить — это правило биржи, сообщите его игрокам заранее.
  3. 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 — этого хватит, чтобы построить каталог рынков и запустить маркетмейкера на тестовой бирже.

Что сделать сегодня

  1. Получите тестовый ключ SportAPI и постройте каталог событий из menu и events.
  2. Сделайте oc_pointer идентификатором исхода в своей книге заявок.
  3. Запустите маркетмейкера на коэффициентах линии без маржи.
  4. Подключите приостановку рынков по oc_block.
  5. Подключите расчёт рынков через услугу расчёта купонов и комиссию с чистого выигрыша.

Напишите менеджеру SportAPI в Telegram, для каких видов спорта и рынков вы строите биржу, — вы получите тестовый ключ к API спортивной линии и коэффициентов или обсудите разработку платформы под ключ.

Betfair — товарный знак его владельца. SportAPI не связан с Betfair; название используется только для описания модели биржи ставок.

← Все статьи