# Granular walk-forward research v2

> Predictive research only. Historical granular bookmaker lines/odds are absent, so ROI, yield and betting edge are intentionally not reported.

## Protocol

- Model/hyperparameter selection folds: 2020/2021, 2021/2022, 2022/2023.
- Temporal confirmation excluded from family, hyperparameter and feature-policy selection: 2023/2024; it is used for calibration retention and evidence tiers.
- Already-seen seasons excluded from every metric: 2024/2025, 2025/2026.
- Each fold trains only on seasons strictly earlier than its validation season.
- Every feature vector is frozen before the current result updates history.
- Candidate score averages probability Brier across three market lines plus normalized count RMSE.
- Calibration is fitted on pooled out-of-fold selection predictions and retained only if both Brier and log loss improve on 2023/24.

## Confirmation summary

| Target | Selected family | Feature policy | Fold ranks | N | RMSE | Mean line Brier delta vs rolling | League-clustered wins / 3 | Calibrators kept |
|---|---|---|---|---:|---:|---:|---:|---:|
| away_corners | negative_binomial {'alpha': 1.0} | without:team_rate | 4/4/3 | 2364 | 2.463 | -0.0129 | 3 | 2/3 |
| away_fouls | negative_binomial {'alpha': 1.0} | without:team_rate | 2/1/2 | 2364 | 3.520 | -0.0055 | 3 | 0/3 |
| away_shots | poisson_regularized {'alpha': 1.0} | full | 1/5/9 | 2364 | 4.229 | -0.0193 | 3 | 2/3 |
| away_shots_on_target | poisson_regularized {'alpha': 1.0} | full | 1/5/4 | 2364 | 2.128 | -0.0084 | 3 | 1/3 |
| away_yellow_cards | negative_binomial {'alpha': 1.0} | full | 4/1/3 | 2364 | 1.402 | -0.0042 | 2 | 2/3 |
| home_corners | negative_binomial {'alpha': 1.0} | full | 1/1/3 | 2364 | 2.903 | -0.0104 | 3 | 0/3 |
| home_fouls | negative_binomial {'alpha': 0.1} | full | 2/1/3 | 2364 | 3.496 | -0.0065 | 3 | 3/3 |
| home_shots | negative_binomial {'alpha': 0.01} | without:context | 2/4/2 | 2364 | 4.889 | -0.0174 | 3 | 1/3 |
| home_shots_on_target | negative_binomial {'alpha': 1.0} | full | 1/3/2 | 2364 | 2.424 | -0.0128 | 3 | 0/3 |
| home_yellow_cards | poisson_regularized {'alpha': 1.0} | full | 1/1/7 | 2364 | 1.331 | -0.0030 | 3 | 3/3 |
| total_corners | poisson_regularized {'alpha': 10.0} | full | 1/1/8 | 2364 | 3.364 | -0.0006 | 0 | 0/3 |
| total_fouls | negative_binomial {'alpha': 0.1} | without:team_rate | 4/1/1 | 2364 | 5.070 | -0.0072 | 3 | 3/3 |
| total_shots | poisson_regularized {'alpha': 1.0} | full | 1/1/5 | 2364 | 5.707 | -0.0081 | 3 | 1/3 |
| total_shots_on_target | poisson_regularized {'alpha': 1.0} | full | 2/1/5 | 2364 | 3.158 | -0.0021 | 0 | 0/3 |
| total_yellow_cards | negative_binomial {'alpha': 1.0} | full | 3/6/3 | 2364 | 2.090 | -0.0033 | 1 | 3/3 |

## Feature ablations across time

Positive delta means that removing the group worsened the diagnostic Poisson score. Selection-fold averages are evidence; the 2023/24 value is confirmation only.

### away_corners

| Removed group | Selection mean delta | Helped folds / 3 | Confirmation delta |
|---|---:|---:|---:|
| style | +0.00074 | 3 | +0.00135 |
| context | +0.00033 | 3 | +0.00062 |
| opponent | +0.00011 | 2 | +0.00022 |
| recent | +0.00010 | 1 | +0.00031 |
| league | -0.00002 | 1 | -0.00003 |
| h2h | -0.00005 | 2 | -0.00019 |
| referee | -0.00005 | 0 | -0.00000 |
| referee_interactions | -0.00005 | 0 | -0.00002 |
| team_rate | -0.00011 | 1 | -0.00013 |

### away_fouls

| Removed group | Selection mean delta | Helped folds / 3 | Confirmation delta |
|---|---:|---:|---:|
| recent | +0.00300 | 3 | +0.00139 |
| context | +0.00093 | 3 | +0.00169 |
| referee | +0.00025 | 3 | +0.00011 |
| h2h | +0.00021 | 3 | +0.00014 |
| referee_interactions | +0.00008 | 3 | -0.00006 |
| opponent | +0.00006 | 1 | +0.00032 |
| league | +0.00000 | 1 | +0.00014 |
| style | -0.00005 | 2 | -0.00006 |
| team_rate | -0.00013 | 0 | +0.00001 |

### away_shots

| Removed group | Selection mean delta | Helped folds / 3 | Confirmation delta |
|---|---:|---:|---:|
| recent | +0.00275 | 3 | +0.00204 |
| style | +0.00047 | 3 | +0.00044 |
| opponent | +0.00037 | 2 | +0.00029 |
| context | +0.00013 | 2 | +0.00013 |
| referee_interactions | +0.00003 | 2 | -0.00002 |
| h2h | -0.00001 | 1 | +0.00013 |
| referee | -0.00002 | 2 | -0.00002 |
| team_rate | -0.00003 | 1 | +0.00025 |
| league | -0.00008 | 1 | -0.00012 |

### away_shots_on_target

| Removed group | Selection mean delta | Helped folds / 3 | Confirmation delta |
|---|---:|---:|---:|
| recent | +0.00097 | 3 | +0.00076 |
| style | +0.00055 | 3 | +0.00040 |
| context | +0.00003 | 2 | +0.00045 |
| opponent | +0.00003 | 2 | +0.00010 |
| referee | +0.00001 | 2 | +0.00001 |
| referee_interactions | +0.00000 | 2 | -0.00001 |
| team_rate | -0.00002 | 1 | +0.00042 |
| h2h | -0.00004 | 1 | -0.00020 |
| league | -0.00004 | 1 | -0.00004 |

### away_yellow_cards

| Removed group | Selection mean delta | Helped folds / 3 | Confirmation delta |
|---|---:|---:|---:|
| context | +0.00045 | 3 | +0.00106 |
| league | +0.00043 | 2 | +0.00017 |
| recent | +0.00023 | 3 | +0.00058 |
| referee | +0.00012 | 3 | -0.00033 |
| h2h | +0.00007 | 2 | +0.00016 |
| opponent | +0.00006 | 2 | -0.00002 |
| referee_interactions | +0.00005 | 2 | -0.00004 |
| style | -0.00004 | 1 | -0.00009 |
| team_rate | -0.00009 | 2 | +0.00005 |

### home_corners

| Removed group | Selection mean delta | Helped folds / 3 | Confirmation delta |
|---|---:|---:|---:|
| context | +0.00046 | 2 | +0.00051 |
| team_rate | +0.00026 | 2 | +0.00003 |
| recent | +0.00025 | 3 | +0.00092 |
| league | +0.00022 | 3 | -0.00018 |
| referee_interactions | +0.00008 | 2 | +0.00004 |
| style | +0.00007 | 1 | +0.00022 |
| opponent | +0.00005 | 2 | +0.00003 |
| h2h | +0.00000 | 2 | +0.00008 |
| referee | -0.00001 | 2 | +0.00007 |

### home_fouls

| Removed group | Selection mean delta | Helped folds / 3 | Confirmation delta |
|---|---:|---:|---:|
| recent | +0.00218 | 3 | +0.00202 |
| context | +0.00054 | 3 | +0.00136 |
| referee | +0.00023 | 2 | +0.00015 |
| opponent | +0.00021 | 3 | +0.00017 |
| league | +0.00020 | 2 | -0.00021 |
| h2h | +0.00009 | 1 | -0.00005 |
| team_rate | +0.00003 | 1 | +0.00006 |
| referee_interactions | -0.00011 | 0 | -0.00002 |
| style | -0.00013 | 2 | +0.00022 |

### home_shots

| Removed group | Selection mean delta | Helped folds / 3 | Confirmation delta |
|---|---:|---:|---:|
| recent | +0.00273 | 3 | +0.00261 |
| league | +0.00027 | 2 | +0.00015 |
| opponent | +0.00023 | 2 | +0.00037 |
| style | +0.00019 | 3 | +0.00053 |
| team_rate | +0.00010 | 2 | +0.00003 |
| h2h | +0.00004 | 2 | +0.00017 |
| referee | +0.00002 | 2 | -0.00011 |
| referee_interactions | -0.00002 | 2 | -0.00005 |
| context | -0.00015 | 1 | +0.00016 |

### home_shots_on_target

| Removed group | Selection mean delta | Helped folds / 3 | Confirmation delta |
|---|---:|---:|---:|
| style | +0.00100 | 3 | +0.00149 |
| recent | +0.00082 | 3 | +0.00071 |
| league | +0.00039 | 3 | +0.00034 |
| opponent | +0.00014 | 2 | -0.00010 |
| context | +0.00008 | 2 | +0.00007 |
| h2h | +0.00001 | 1 | -0.00006 |
| referee_interactions | -0.00003 | 0 | -0.00005 |
| referee | -0.00003 | 0 | -0.00012 |
| team_rate | -0.00011 | 1 | +0.00012 |

### home_yellow_cards

| Removed group | Selection mean delta | Helped folds / 3 | Confirmation delta |
|---|---:|---:|---:|
| context | +0.00089 | 3 | +0.00072 |
| recent | +0.00038 | 3 | +0.00052 |
| h2h | +0.00025 | 3 | +0.00011 |
| opponent | +0.00020 | 3 | +0.00006 |
| style | +0.00016 | 2 | +0.00028 |
| league | +0.00014 | 3 | +0.00022 |
| referee_interactions | +0.00007 | 3 | +0.00001 |
| referee | +0.00005 | 2 | +0.00002 |
| team_rate | -0.00004 | 2 | -0.00012 |

### total_corners

| Removed group | Selection mean delta | Helped folds / 3 | Confirmation delta |
|---|---:|---:|---:|
| recent | +0.00030 | 3 | +0.00039 |
| league | +0.00016 | 2 | -0.00021 |
| h2h | +0.00006 | 2 | +0.00019 |
| style | +0.00004 | 2 | +0.00031 |
| team_rate | +0.00004 | 2 | +0.00021 |
| opponent | +0.00004 | 2 | +0.00028 |
| context | +0.00003 | 2 | +0.00007 |
| referee_interactions | -0.00001 | 1 | -0.00001 |
| referee | -0.00002 | 0 | +0.00005 |

### total_fouls

| Removed group | Selection mean delta | Helped folds / 3 | Confirmation delta |
|---|---:|---:|---:|
| recent | +0.00189 | 3 | +0.00255 |
| context | +0.00142 | 3 | +0.00182 |
| referee | +0.00042 | 3 | +0.00021 |
| h2h | +0.00034 | 3 | +0.00016 |
| league | +0.00021 | 2 | +0.00007 |
| opponent | +0.00020 | 2 | -0.00008 |
| style | +0.00017 | 2 | -0.00016 |
| referee_interactions | +0.00001 | 2 | +0.00006 |
| team_rate | -0.00011 | 0 | +0.00002 |

### total_shots

| Removed group | Selection mean delta | Helped folds / 3 | Confirmation delta |
|---|---:|---:|---:|
| recent | +0.00261 | 3 | +0.00408 |
| context | +0.00038 | 3 | +0.00080 |
| league | +0.00038 | 2 | +0.00031 |
| opponent | +0.00029 | 2 | +0.00018 |
| h2h | +0.00010 | 2 | +0.00026 |
| style | +0.00003 | 1 | +0.00064 |
| referee | -0.00003 | 2 | -0.00008 |
| referee_interactions | -0.00006 | 1 | -0.00011 |
| team_rate | -0.00006 | 2 | +0.00020 |

### total_shots_on_target

| Removed group | Selection mean delta | Helped folds / 3 | Confirmation delta |
|---|---:|---:|---:|
| recent | +0.00079 | 3 | +0.00044 |
| style | +0.00056 | 3 | +0.00091 |
| league | +0.00029 | 3 | +0.00059 |
| context | +0.00021 | 3 | +0.00043 |
| h2h | +0.00001 | 1 | -0.00016 |
| referee | -0.00000 | 2 | -0.00000 |
| opponent | -0.00003 | 1 | -0.00009 |
| referee_interactions | -0.00004 | 0 | -0.00002 |
| team_rate | -0.00009 | 1 | +0.00030 |

### total_yellow_cards

| Removed group | Selection mean delta | Helped folds / 3 | Confirmation delta |
|---|---:|---:|---:|
| context | +0.00105 | 3 | +0.00124 |
| league | +0.00034 | 2 | +0.00052 |
| h2h | +0.00020 | 2 | +0.00034 |
| recent | +0.00019 | 2 | +0.00033 |
| referee | +0.00016 | 3 | -0.00037 |
| referee_interactions | +0.00008 | 3 | -0.00001 |
| opponent | +0.00005 | 1 | +0.00013 |
| style | +0.00004 | 2 | +0.00006 |
| team_rate | -0.00009 | 1 | -0.00006 |
