Betting Value Engine

Market-Residual v1

Report #5 · 22.08.2026 23:37:26 · source backtest #6

Development rows11 229
Validation rows2 279
Vybraná regularizace100
Holdout readNE

Specifikace

M0Opening no-vig market; nic se neučí.
M1logit(P_final) = logit(P_market) + δ, kde δ je silně regularizovaná logistická korekce.
Development2019/20–2023/24, rolling po sezonách.
Validation2024/25, bez refitu na validation datech.
VýběrVýhradně development Brier score, při shodě development log loss.
ROINevypočteno a nepoužito pro rozhodnutí.
Market feedFootball-Data agregovaný opening no-vig benchmark; bookmaker-specific historie zatím není integrována.

Development rolling test

Každá sezona je predikována pouze z předchozích development sezon. V první sezoně M1 bezpečně používá M0, protože ještě nemá historické reziduální trénovací řádky.

ModelBrierLog lossCalibration errorPočet
M0 – opening market0,24050,67381,18 %11 229
Poisson v2 raw (kontext)0,24570,68450,78 %11 229
M1 – market residual0,24050,67391,23 %11 229

Validation 2024/25

M1 je zde fitnutý pouze na development období. M0 zůstává hlavním benchmarkem; Poisson v2 je zobrazen jako kontext, nikoli jako nový kandidát k ladění.

ModelBrierLog lossCalibration errorPočet
M0 – opening market0,23950,67181,44 %2 279
Poisson v2 raw (kontext)0,24320,67950,91 %2 279
M1 – market residual0,23960,67181,46 %2 279

Výběr regularizace

Validation hodnoty jsou pouze diagnostické a nemohly ovlivnit výběr.

RegularizaceVybranáDevelopment BrierDevelopment log lossValidation BrierValidation log loss
100ANO0,24050,67390,23960,6718
10ne0,24060,67390,23950,6718
1ne0,24080,67450,23950,6717
0.1ne0,24250,67820,23940,6716

Paired bootstrap na validation

Rozdíl je vždy M1 minus comparator; záporná hodnota favorizuje M1. Interval je event-level paired bootstrap, 5 000 replikací, seed 42.

PorovnáníMetrikaBodový rozdíl95% CIP(M1 lepší)
m1_minus_marketBrier0,00000,0000 až 0,000118,36 %
m1_minus_marketLog loss0,00000,0000 až 0,000118,78 %
m1_minus_poisson_v2Brier-0,0036-0,0061 až -0,001299,84 %
m1_minus_poisson_v2Log loss-0,0076-0,0128 až -0,002499,86 %

Validation podle všech lig

LigaPočetM0 BrierV2 BrierM1 BrierM0 log lossM1 log loss
England Championship5420,24360,24490,24370,68020,6803
England Premier League3800,24230,24260,24230,67740,6775
France Ligue 13060,23860,24210,23860,66980,6698
Germany Bundesliga2960,22840,23800,22840,64890,6489
Italy Serie A3750,24360,24840,24360,68040,6804
Spain La Liga3800,23640,24110,23640,66530,6652

Audit modelu a metodika

{
    "identifier": "football-ou25-market-residual-m1",
    "offset": "logit(market_probability)",
    "regularization": 100,
    "observations": 11229,
    "iterations": 3,
    "feature_names": [
        "v2_logit_minus_market_logit",
        "expected_total_goals",
        "history_min_log",
        "history_gap",
        "season_progress",
        "lambda_imbalance",
        "home_attack_strength",
        "home_defense_strength",
        "away_attack_strength",
        "away_defense_strength",
        "newcomer_home",
        "newcomer_away",
        "league__787ef53ef6aaa63e299c3de2e064d8ff0bacf00a",
        "league__d6696a57d064756df605440f8ed399e496f2dbb3",
        "league__03b21abbf0d4c7b4bf6276904abc71fd8e9781ba",
        "league__029373fe60e47c2e06041eed872b1c9de9a083c6",
        "league__67d96333beca94ff7f67a7a7d7f6e18f02f24be4",
        "league__dae49a978b80c49996fb27e320b6f875a2c5a43e"
    ],
    "means": {
        "v2_logit_minus_market_logit": -0.025589252182191994,
        "expected_total_goals": 2.724029866580132,
        "history_min_log": 2.308639324886586,
        "history_gap": 1.8755899902039361,
        "season_progress": 0.5679568630991849,
        "lambda_imbalance": 0.25540964041289643,
        "home_attack_strength": 1.0063701305925206,
        "home_defense_strength": 0.993371245626392,
        "away_attack_strength": 1.0011201884037053,
        "away_defense_strength": 0.9984326430584235,
        "newcomer_home": 0.00792590613589812,
        "newcomer_away": 0.007391575385163416,
        "league__787ef53ef6aaa63e299c3de2e064d8ff0bacf00a": 0.23697568795084156,
        "league__d6696a57d064756df605440f8ed399e496f2dbb3": 0.16475198147653397,
        "league__03b21abbf0d4c7b4bf6276904abc71fd8e9781ba": 0.14622851545106422,
        "league__029373fe60e47c2e06041eed872b1c9de9a083c6": 0.12957520705316591,
        "league__67d96333beca94ff7f67a7a7d7f6e18f02f24be4": 0.16065544572090124,
        "league__dae49a978b80c49996fb27e320b6f875a2c5a43e": 0.1618131623474931
    },
    "scales": {
        "v2_logit_minus_market_logit": 0.2652799589669113,
        "expected_total_goals": 0.31477620767306763,
        "history_min_log": 0.6053417281130792,
        "history_gap": 2.555069822643817,
        "season_progress": 0.3020956237233434,
        "lambda_imbalance": 0.34862375763544856,
        "home_attack_strength": 0.11284634637830572,
        "home_defense_strength": 0.09347544912142465,
        "away_attack_strength": 0.11118499678026528,
        "away_defense_strength": 0.09458250446873898,
        "newcomer_home": 0.08867404438628966,
        "newcomer_away": 0.08565593965680125,
        "league__787ef53ef6aaa63e299c3de2e064d8ff0bacf00a": 0.4252272466236083,
        "league__d6696a57d064756df605440f8ed399e496f2dbb3": 0.37095655551031453,
        "league__03b21abbf0d4c7b4bf6276904abc71fd8e9781ba": 0.3533351620204935,
        "league__029373fe60e47c2e06041eed872b1c9de9a083c6": 0.33583548468004865,
        "league__67d96333beca94ff7f67a7a7d7f6e18f02f24be4": 0.3672128449293481,
        "league__dae49a978b80c49996fb27e320b6f875a2c5a43e": 0.36827932719419537
    },
    "coefficients": {
        "intercept": 0.004104725244877421,
        "v2_logit_minus_market_logit": -8.574374360139057e-5,
        "expected_total_goals": 5.396387835055347e-5,
        "history_min_log": 2.4316644764893276e-5,
        "history_gap": -4.817502237372142e-5,
        "season_progress": 2.107563670457102e-5,
        "lambda_imbalance": 2.743590846677354e-5,
        "home_attack_strength": 1.155647225928113e-5,
        "home_defense_strength": 1.1944462322382415e-6,
        "away_attack_strength": 1.4618346062100222e-5,
        "away_defense_strength": 2.946723504216908e-5,
        "newcomer_home": -6.41830398086575e-6,
        "newcomer_away": 1.901841546805263e-5,
        "league__787ef53ef6aaa63e299c3de2e064d8ff0bacf00a": -5.4967798495927776e-5,
        "league__d6696a57d064756df605440f8ed399e496f2dbb3": 8.521820451018749e-6,
        "league__03b21abbf0d4c7b4bf6276904abc71fd8e9781ba": 5.288176869639538e-5,
        "league__029373fe60e47c2e06041eed872b1c9de9a083c6": 4.593693340777117e-5,
        "league__67d96333beca94ff7f67a7a7d7f6e18f02f24be4": 4.405852309642354e-6,
        "league__dae49a978b80c49996fb27e320b6f875a2c5a43e": -4.21352614032761e-5
    }
}
{
    "M0": "Opening no-vig market probability; no fitted parameters.",
    "M1": "logit(P_final) = logit(P_market) + intercept + regularized coefficients × standardized pre-match features.",
    "features": [
        "Poisson v2 logit difference versus market",
        "Poisson v2 expected total goals and lambda imbalance",
        "historical sample size and imbalance",
        "season phase",
        "home\/away attack and defence strength",
        "newcomer flags",
        "league one-hot features learned from development league names; no league removed after results were seen"
    ],
    "rolling": "Development is evaluated season by season: each season is predicted from earlier development seasons, then added to the training history. Validation is predicted from all development rows without validation refit.",
    "selection": "Regularization is selected only by development Brier score, then development log loss. ROI, thresholds, validation, and later holdout results are excluded.",
    "market_role": "Market is the M0 baseline and the M1 logit offset. No bookmaker-specific historical feed is used.",
    "candidates": [
        "M0 market baseline",
        "M1 market residual"
    ],
    "deferred": [
        "M2 expanded features",
        "XGBoost\/LightGBM",
        "paid bookmaker-specific odds history"
    ],
    "holdout": "The later holdout season is not queried, read, trained on, tuned on, or evaluated in this report.",
    "main_metrics": [
        "Brier score",
        "log loss"
    ],
    "immutable_result": true
}