Справка: тотализатор ББет, модели и выплаты

Как устроены прогнозы, системная ставка и выплаты в этом приложении

Категории и выплаты

Тираж ББет — 15 матчей. После розыгрыша для каждого купона считается число угаданных исходов (hits): от 0 до 15. Категория записывается как N/15, например 12/15 — угадано 12 матчей.

Выплата начинается только с категории 9/15. Меньше 9 угаданных — выплата 0 ₽, независимо от ставки.

Накопительная формула выплаты
выплата = ставка × (coef₉ + coef₁₀ + … + coefhits)

Коэффициенты задаёте вы в блоке «Проверка купонов» (9/15 … 15/15). При 12/15 выплата включает категории 9, 10, 11 и 12 одновременно.

Пример расчёта

Ставка 30 ₽, коэффициенты: 9→1, 10→2, 11→5, 12→10, 13→25, 14→100, 15→500.

УгаданоКатегории в выплатеСумма коэф.Выплата
4/15— (ниже порога)00 ₽
8/15— (ниже порога)00 ₽
9/15только 9130 ₽
10/159 + 10390 ₽
12/159 + 10 + 11 + 1218540 ₽

Фильтры: когда точно знаете исход 4 матчей

Речь не о том, что «в тираже угадали только 4 матча из 15» (это 4/15 — без выплаты). Речь о ограничениях в генераторе: вы уверены, что, например, матчи 1–4 закончатся победой гостей (2), и отмечаете на этих матчах только исход 2.

Главная идея

Если фильтр верный, эти 4 матча уже «в кармане» — у каждого из K вариантов будет +4 к счёту. Для категории 9/15 остаётся угадать ещё 5 из 11 свободных матчей, а не 9 из 15.

Как это считается

hits = (угаданные зафиксированные) + (угаданные среди остальных)
для 9/15 при F верных фильтрах: нужно ещё (9 − F) из (15 − F) оставшихся
Зафиксировано верноУже естьНужно ещёИз скольких матчей
00915
44511
6639
9906

Пример: матчи 1–4 только «2»

  1. В блоке «Ограничения исходов» на матчах 1–4 снимаете 1 и X, оставляете только 2.
  2. Генератор строит все K вариантов только с «2» на этих позициях; K «не тратится» на другие исходы там.
  3. Beam/adaptive перебирает комбинации уже по 11 оставшимся матчам — варианты различаются только там.
  4. Если в тираже действительно 2 на 1–4, каждый вариант стартует с 4/15 «бесплатно».

Как повышаются шансы на ≥9/15

Если фильтр ошибочен — все K вариантов проигрывают на этих матчах
  • Зафиксировали «2», а сыграло «1» — 0 из 4 на этих матчах во всех вариантах.
  • Максимум по купону — 11/15 (если идеально угадать все 11 остальных).
  • Для 9/15 тогда нужно 9 из 11 на свободных матчах (~82%) — намного жёстче, чем 5/11 при верном фильтре.
  • Неверный жёсткий фильтр (только один исход) хуже, чем без фильтра: вы выкинули из системы все варианты с правильным исходом на этом матче.

Когда фильтр безопаснее

Тип ограниченияПримерРиск
Один исход (жёстко) только 2 Максимальный выигрыш при угадывании, ноль при промахе
Два исхода 12, без ничьей Исключаете один исход; K ветвится между двумя
Все три без ограничений Модель решает сама — как без фильтра

Фильтры имеет смысл ставить только когда уверенность высокая (отложенный матч, явный фаворит, уже известный промежуточный счёт и т.п.). Модель не проверяет, правы вы или нет — она просто обнуляет запрещённые исходы и пересчитывает вероятности на остальных.

Системная ставка (K вариантов)

Один «простой» купон — 15 исходов. Системная ставка — это K разных полных купонов на один тираж. Каждый вариант проверяется отдельно: у одного может быть 4/15, у другого 9/15.

Стоимость системы ≈ K × ставка на вариант (если ставка одинаковая). Выигрыш — сумма выплат по всем вариантам, попавшим в категории ≥9/15.

Генератор строит K вариантов так, чтобы охватить наиболее вероятные комбинации исходов, а не один argmax-прогноз на каждый матч.

Модели прогноза

Для каждого матча модель выдаёт три вероятности: 1, X, 2 (сумма = 1). Из них строятся K вариантов купона.

Два набора моделей

НаборПризнакиРекомендация
bookmaker 22 признака: только линия букмекера (pool_p1/px/p2), энтропия, маржа, ранг в купоне По умолчанию — точнее на тесте
full 37 признаков: букмекер + проценты игроков (p1/px/p2) + расхождения Экспериментальный, прироста не даёт

Ансамбль из 5 алгоритмов

В каждом наборе обучены и усредняются (soft voting):

Итоговая вероятность матча = среднее вероятностей всех пяти моделей. Артефакты: artifacts/models_bookmaker_only/ и artifacts/models/.

Калибраторы

Для стратегий calibrated и calibrated+adaptive вероятности дополнительно проходят изотоническую калибровку (отдельно для классов 1, X, 2) и перенормируются. Калибраторы обучены на out-of-fold прогнозах bookmaker-ансамбля и хранятся в artifacts/calibrators.joblib.

Как обучались модели

Данные

Формат строки: number_cupon,p1,px,p2,pool_p1,pool_px,pool_p2,result

Процесс обучения

  1. Построение признаков функцией build_features() (features.py)
  2. Кросс-валидация GroupKFold (5 фолдов) — группировка по number_cupon, чтобы матчи одного купона не попадали и в train, и в test
  3. Метрики на OOF: точность на матч, среднее угаданных/15, доля купонов с ≥9/15
  4. Финальное обучение на всех 1611 купонах → сохранение *.joblib

Скрипты:

Типичная точность (bookmaker-ансамбль, CV на 1611 купонах)

МетрикаЗначениеСмысл
Точность на матч~39.9%Один argmax-прогноз на матч
Среднее угаданных~6.0 / 15Один вариант купона
P(≥9/15), 1 вариант~9.7%Один купон без системы
P(≥9/15), K=200~53.8%Хотя бы один из 200 вариантов (CV, beam)

Отсюда идея системной ставки: один прогноз редко даёт 9/15, но среди K вариантов шанс растёт.

Стратегии генерации K вариантов

Все стратегии строят K полных купонов из матрицы вероятностей (15 матчей × 3 исхода).

СтратегияКак работаетКалибровка
beam Beam search: на каждом матче оставляет top-K частичных путей по сумме log(p) нет
calibrated То же, но на калиброванных вероятностях да
adaptive «Уверенные» матчи фиксируются (argmax), «неуверенные» ветвятся на 2 лучших исхода нет
calibrated+adaptive Adaptive branching на калиброванных вероятностях да

Adaptive branching — ключевая идея:

Рекомендация (hold-out test_holdout.csv, 3 тиража): calibrated+adaptive, K=200, margin=0.20 — 2 из 3 тиражей получили хотя бы один вариант ≥9/15.

K, margin и автоподбор

K — число вариантов

Сколько разных полных купонов генерируется на тираж. Больше K → выше шанс попасть в ≥9/15, но выше стоимость системы. Диапазон в интерфейсе: 1–5000. Дефолт: 200.

margin — порог «неуверенности»

Используется только в adaptive-стратегиях. Дефолт: 0.20.

Автоподбор (галочка в генераторе)

Анализирует вероятности текущего тиража без знания результата: средний margin, число неуверенных матчей, оценку числа adaptive-комбинаций. Подбирает K и margin из сетки кандидатов. Не гарантирует 9/15 — только подстраивает параметры под «сложность» тиража.

Фильтры и ограничения (как задать в UI)

Подробнее про эффект на ≥9/15 — в разделе «Фильтры: 4 известных матча». Здесь — как включить ограничения в генераторе.

Разрешённые исходы (allowed_outcomes)

Для каждого матча можно оставить только нужные исходы (1, X, 2). Запрещённые исходы обнуляются, остальные перенормируются.

Веса исходов (outcome_weights)

Опционально: для матча задаётся доля вариантов с каждым исходом в процентах. Например, «1 = 75%, 2 = 25%» при K=200 → ~150 вариантов с «1» и ~50 с «2» на этом матче. Включите чекбокс «веса (%)» в блоке ограничений.

Веса распределяют K между исходами (метод largest remainder). Вероятности модели по-прежнему используются для ранжирования вариантов внутри каждой страты.

Полу-рандом и лимиты на весь купон

Блок «Лимиты на купон и полу-рандом» в генераторе — дополнительные настройки поверх стратегии и фильтров по матчам. Работают вместе с любой стратегией (calibrated+adaptive и др.).

Полу-рандом (random_mix)

Ползунок 0–100% задаёт долю «шума» в вероятностях перед генерацией. На каждом матче итоговые вероятности смешиваются:

pитог = (1 − mix) × pмодель + mix × pравномерно

Запрещённые исходы (allowed_outcomes) учитываются: равномерный шум только по разрешённым исходам. При random_mix = 0 генерация идёт как обычно (beam / adaptive), без разведения K купонов.

Мин. различие между K купонами (min_variant_diff)

Доступно только при включённом полу-рандоме (random_mix > 0). Ползунок задаёт, насколько должны отличаться друг от друга сгенерированные K купонов. При 15 матчах и пороге 30% любые два варианта различаются минимум в 5 матчах (⌈0,30 × 15⌉).

Алгоритм строит большой пул кандидатов (топ + случайные сэмплы с учётом random_mix и лимитов), затем жадно выбирает K самых вероятных, попарно удовлетворяющих порогу. Adaptive при полу-рандоме с порогом не используется. Несовместимо с весами (%) по матчам.

Лимиты на число исходов в каждом варианте

Ограничивают, сколько раз в одном полном купоне (15 матчей) может встретиться каждый исход. Проверяется каждый из K вариантов отдельно.

ПолеПримерСмысл
Макс. «1»6Не больше 6 побед хозяев во всём купоне
Макс. «X»4Не больше 4 ничьих
Макс. «2»Пусто = без лимита на «2»
Типичный сценарий: полу-рандом 30–50%, макс. X = 4–5, макс. 1 = 6–7 — чтобы не получать «нереалистичные» купоны с 8–10 ничьими или перекосом в одну сторону, но сохранить опору на модель.

Консенсус в таблице результатов

Строка «⌀» — argmax по K вариантам: какой исход чаще всего встречается на каждом матче среди сгенерированных купонов. Это не отдельная модель, а сводка по системе.

Метрики и ожидания

Важно различать:
  • ML-метрики (≥9/15 на прогнозе) — насколько модель угадывает результаты
  • Выплаты — деньги по коэффициентам ББет, которые вы задаёте вручную
Модель не знает коэффициенты тиража — только вероятности исходов.

Что ожидать от одного argmax-прогноза

~6 правильных из 15 в среднем, редко 9+. Для сравнения на hold-out:

Базовые линии (без K вариантов)

ИсточникКупон 1Купон 2Купон 3
Букмекер (pool argmax)5/157/155/15
Пул игроков3/156/156/15
Модель (калибр.)3/155/157/15

Подробнее в репозитории: README.md, artifacts/holdout_report.txt, artifacts/bookmaker_only_results.json.