Категории и выплаты
Тираж ББет — 15 матчей. После розыгрыша для каждого купона считается число угаданных исходов (hits): от 0 до 15. Категория записывается как N/15, например 12/15 — угадано 12 матчей.
Выплата начинается только с категории 9/15. Меньше 9 угаданных — выплата 0 ₽, независимо от ставки.
Коэффициенты задаёте вы в блоке «Проверка купонов» (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 | — (ниже порога) | 0 | 0 ₽ |
| 8/15 | — (ниже порога) | 0 | 0 ₽ |
| 9/15 | только 9 | 1 | 30 ₽ |
| 10/15 | 9 + 10 | 3 | 90 ₽ |
| 12/15 | 9 + 10 + 11 + 12 | 18 | 540 ₽ |
Фильтры: когда точно знаете исход 4 матчей
Речь не о том, что «в тираже угадали только 4 матча из 15» (это 4/15 — без выплаты). Речь о ограничениях в генераторе: вы уверены, что, например, матчи 1–4 закончатся победой гостей (2), и отмечаете на этих матчах только исход 2.
Если фильтр верный, эти 4 матча уже «в кармане» — у каждого из K вариантов будет +4 к счёту. Для категории 9/15 остаётся угадать ещё 5 из 11 свободных матчей, а не 9 из 15.
Как это считается
для 9/15 при F верных фильтрах: нужно ещё (9 − F) из (15 − F) оставшихся
| Зафиксировано верно | Уже есть | Нужно ещё | Из скольких матчей |
|---|---|---|---|
| 0 | 0 | 9 | 15 |
| 4 | 4 | 5 | 11 |
| 6 | 6 | 3 | 9 |
| 9 | 9 | 0 | 6 |
Пример: матчи 1–4 только «2»
- В блоке «Ограничения исходов» на матчах 1–4 снимаете 1 и X, оставляете только 2.
- Генератор строит все K вариантов только с «2» на этих позициях; K «не тратится» на другие исходы там.
- Beam/adaptive перебирает комбинации уже по 11 оставшимся матчам — варианты различаются только там.
- Если в тираже действительно 2 на 1–4, каждый вариант стартует с 4/15 «бесплатно».
Как повышаются шансы на ≥9/15
- Меньше задача — 5/11 вместо 9/15 на неизвестных матчах (при 4 верных фильтрах).
- K эффективнее — все варианты идут в одну «ветку» на зафиксированных матчах; разнообразие уходит туда, где неопределённость.
- Меньше лишних комбинаций — без фильтра часть K могла бы содержать «1» или «X» на матче, который вы и так знаете как «2».
- В сводке «Ожидание угаданных» для вариантов обычно растёт: модель не тратит неопределённость на уже зафиксированные позиции.
- Зафиксировали «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):
- LightGBM — градиентный бустинг по деревьям
- XGBoost — ещё один бустинг
- CatBoost — бустинг с категориальными фичами
- MLP — нейросеть (128→64→32), со StandardScaler
- Logistic Regression — линейная модель, со StandardScaler
Итоговая вероятность матча = среднее вероятностей всех пяти моделей.
Артефакты: artifacts/models_bookmaker_only/ и artifacts/models/.
Калибраторы
Для стратегий calibrated и calibrated+adaptive вероятности
дополнительно проходят изотоническую калибровку (отдельно для классов
1, X, 2) и перенормируются. Калибраторы обучены на out-of-fold прогнозах bookmaker-ансамбля
и хранятся в artifacts/calibrators.joblib.
Как обучались модели
Данные
results.csv— основной датасет: 1611 купонов × 15 матчей с известным результатом (result)education.csv— hold-out: 12 купонов (не участвуют в обучении)test_holdout.csv— дополнительный тест: 3 тиража
Формат строки: number_cupon,p1,px,p2,pool_p1,pool_px,pool_p2,result
Процесс обучения
- Построение признаков функцией
build_features()(features.py) - Кросс-валидация GroupKFold (5 фолдов) — группировка по
number_cupon, чтобы матчи одного купона не попадали и в train, и в test - Метрики на OOF: точность на матч, среднее угаданных/15, доля купонов с ≥9/15
- Финальное обучение на всех 1611 купонах → сохранение
*.joblib
Скрипты:
python bookmaker_only.py— bookmaker-модели (основные)python predict.py— full-моделиpython evaluate_holdout.py— сравнение стратегий на hold-out
Типичная точность (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 — ключевая идея:
- Для матча считается
margin = pmax − p2nd - Если
margin < margin_threshold→ ветвление на 2 лучших исхода - Иначе → фиксируется один исход (самый вероятный)
- Если комбинаций меньше K — добивка обычным beam search
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 (0.10–0.15) — больше матчей считаются «неуверенными», больше ветвлений, больше разнообразия
- Больше margin (0.22–0.25) — чаще один исход на матч, меньше комбинаций
Автоподбор (галочка в генераторе)
Анализирует вероятности текущего тиража без знания результата: средний margin, число неуверенных матчей, оценку числа adaptive-комбинаций. Подбирает K и margin из сетки кандидатов. Не гарантирует 9/15 — только подстраивает параметры под «сложность» тиража.
Фильтры и ограничения (как задать в UI)
Подробнее про эффект на ≥9/15 — в разделе «Фильтры: 4 известных матча». Здесь — как включить ограничения в генераторе.
Разрешённые исходы (allowed_outcomes)
Для каждого матча можно оставить только нужные исходы (1, X, 2). Запрещённые исходы обнуляются, остальные перенормируются.
- Только 1 — матч зафиксирован на победу хозяев
- 1X — без 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равномерно
- 0% — только модель (по умолчанию)
- 50% — половина модели, половина равномерного распределения 1/X/2
- 100% — максимальный разброс (почти случайный выбор с учётом фильтров)
Запрещённые исходы (allowed_outcomes) учитываются: равномерный шум только
по разрешённым исходам. При random_mix = 0 генерация идёт как обычно
(beam / adaptive), без разведения K купонов.
Мин. различие между K купонами (min_variant_diff)
Доступно только при включённом полу-рандоме (random_mix > 0).
Ползунок задаёт, насколько должны отличаться друг от друга сгенерированные K купонов.
При 15 матчах и пороге 30% любые два варианта различаются минимум
в 5 матчах (⌈0,30 × 15⌉).
- random_mix = 0 — параметр игнорируется, обычная стратегия
- 30% — рекомендуется при K = 10–50 и полу-рандоме 50%
- 50%+ — сильное разнообразие; при жёстких лимитах 1/X/2 может не набраться K вариантов
Алгоритм строит большой пул кандидатов (топ + случайные сэмплы с учётом
random_mix и лимитов), затем жадно выбирает K самых вероятных, попарно
удовлетворяющих порогу. Adaptive при полу-рандоме с порогом не используется.
Несовместимо с весами (%) по матчам.
Лимиты на число исходов в каждом варианте
Ограничивают, сколько раз в одном полном купоне (15 матчей) может встретиться каждый исход. Проверяется каждый из K вариантов отдельно.
| Поле | Пример | Смысл |
|---|---|---|
| Макс. «1» | 6 | Не больше 6 побед хозяев во всём купоне |
| Макс. «X» | 4 | Не больше 4 ничьих |
| Макс. «2» | — | Пусто = без лимита на «2» |
- Сумма лимитов должна быть ≥ 15, иначе купон невозможен (ошибка генерации).
- Пример: макс. 1 = 6 и макс. X = 4 → минимум 5 исходов «2» в каждом варианте.
- При жёстких лимитах beam search может выдать меньше K уникальных вариантов — недостающие добираются случайной генерацией в рамках тех же лимитов.
Консенсус в таблице результатов
Строка «⌀» — argmax по K вариантам: какой исход чаще всего встречается на каждом матче среди сгенерированных купонов. Это не отдельная модель, а сводка по системе.
Метрики и ожидания
- ML-метрики (≥9/15 на прогнозе) — насколько модель угадывает результаты
- Выплаты — деньги по коэффициентам ББет, которые вы задаёте вручную
Что ожидать от одного argmax-прогноза
~6 правильных из 15 в среднем, редко 9+. Для сравнения на hold-out:
- Купон 1 (сложный): даже K=500 не дал 9/15
- Купоны 2–3: при K=200 по 2–3 варианта с ≥9/15
Базовые линии (без K вариантов)
| Источник | Купон 1 | Купон 2 | Купон 3 |
|---|---|---|---|
| Букмекер (pool argmax) | 5/15 | 7/15 | 5/15 |
| Пул игроков | 3/15 | 6/15 | 6/15 |
| Модель (калибр.) | 3/15 | 5/15 | 7/15 |
Подробнее в репозитории: README.md, artifacts/holdout_report.txt,
artifacts/bookmaker_only_results.json.