AH Yield Research
For every Asian Handicap line and side: realized P&L and yield from actual historical market odds, settlement-aware model probability, fair odds and expected value — with sample-size protection and walk-forward validation. No synthetic odds, no fabricated performance.
Methodology in one paragraph
ROI = Σpnl / Σstake (fraction); Yield% = ROI × 100. Hit rate is reported separately and is never labeled ROI. Dirichlet-multinomial posterior over the 5 settlement categories with uniform prior α=(1,1,1,1,1); binary positive-return event uses Beta(1+wins, 1+losses) with pushes excluded. 95% marginal credible intervals reported.
Settlement-aware fair odds solve EV(o*)=0: o* = 1 + (0.5·pHL + pFL) / (pFW + 0.5·pHW). Binary 1/p is NOT used for AH. EV(o) = (pFW + 0.5·pHW)(o−1) − (0.5·pHL + pFL). Edge = model EV − market implied EV from proportional two-way devig (documented binary approximation).
| AH Line | Side | Bets | Hit Rate | Avg Odds | P&L | Yield | ROI 95% CI | Model P | Fair Odds | Model EV | Edge | Sample | State |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| -2 | away | 61 | 68.9% | 1.924 | 14.0 | +22.92% | [+3.37%, +42.46%] | 68.1% | 1.477 | +22.03% | +24.47% | LOW | POSITIVE_VALUE |
| -0.75 | home | 279 | 47.1% | 1.957 | 16.5 | +5.91% | [-4.38%, +16.19%] | 60.5% | 1.838 | +5.54% | +7.66% | MODERATE | NEUTRAL |
| -1.75 | away | 79 | 54.4% | 1.952 | 11.4 | +14.48% | [-5.47%, +34.43%] | 54.3% | 1.697 | +13.56% | +15.92% | LOW | NEUTRAL |
| +1.25 | home | 65 | 53.8% | 1.909 | 9.8 | +15.15% | [-5.53%, +35.82%] | 65.7% | 1.644 | +13.81% | +15.92% | LOW | NEUTRAL |
| -0.5 | away | 325 | 53.2% | 1.953 | 12.7 | +3.90% | [-6.73%, +14.52%] | 53.2% | 1.880 | +3.88% | +6.05% | STRONG | NEUTRAL |
| -0.25 | away | 441 | 44.7% | 1.942 | 3.8 | +0.86% | [-7.20%, +8.92%] | 58.9% | 1.919 | +1.02% | +3.17% | STRONG | NEUTRAL |
| +1 | away | 119 | 54.8% | 2.010 | 9.1 | +7.62% | [-7.73%, +22.97%] | 54.7% | 1.832 | +6.85% | +9.02% | MODERATE | NEUTRAL |
| 0 | home | 315 | 52.2% | 1.953 | 3.6 | +1.13% | [-8.04%, +10.30%] | 52.2% | 1.917 | +1.36% | +3.48% | STRONG | NEUTRAL |
| +0.25 | away | 325 | 42.8% | 2.005 | 3.2 | +0.98% | [-8.70%, +10.67%] | 42.8% | 1.989 | +0.66% | +2.75% | STRONG | NEUTRAL |
| +0.75 | home | 152 | 47.4% | 1.964 | 5.8 | +3.84% | [-10.27%, +17.94%] | 47.4% | 1.871 | +4.35% | +6.52% | MODERATE | NEUTRAL |
| -1 | home | 218 | 50.9% | 1.978 | 1.0 | +0.45% | [-10.80%, +11.70%] | 50.9% | 1.964 | +0.54% | +2.74% | MODERATE | NEUTRAL |
| -0.25 | home | 441 | 41.0% | 1.984 | -19.4 | -4.41% | [-12.62%, +3.81%] | 41.1% | 2.088 | -4.25% | -2.10% | STRONG | NEUTRAL |
| +0.25 | home | 325 | 42.3% | 1.923 | -11.8 | -3.63% | [-12.91%, +5.65%] | 57.2% | 2.011 | -3.68% | -1.59% | STRONG | NEUTRAL |
| -1.5 | away | 122 | 53.3% | 1.942 | 5.2 | +4.25% | [-13.19%, +21.68%] | 53.2% | 1.880 | +3.28% | +5.49% | MODERATE | NEUTRAL |
| 0 | away | 315 | 47.8% | 1.972 | -13.3 | -4.23% | [-13.52%, +5.05%] | 47.8% | 2.090 | -4.09% | -1.97% | STRONG | NEUTRAL |
| +0.5 | home | 210 | 51.0% | 1.932 | -2.4 | -1.14% | [-14.33%, +12.04%] | 50.9% | 1.963 | -1.58% | +0.55% | MODERATE | NEUTRAL |
| -1 | away | 218 | 49.1% | 1.946 | -7.1 | -3.27% | [-14.37%, +7.83%] | 49.1% | 2.038 | -3.26% | -1.06% | MODERATE | NEUTRAL |
| +0.5 | away | 210 | 49.0% | 1.992 | -4.1 | -1.93% | [-15.50%, +11.64%] | 49.1% | 2.038 | -2.25% | -0.12% | MODERATE | NEUTRAL |
| -1.25 | away | 150 | 44.0% | 1.949 | -2.7 | -1.79% | [-15.87%, +12.29%] | 56.6% | 1.985 | -1.58% | +0.53% | MODERATE | NEUTRAL |
| -1.25 | home | 150 | 43.3% | 1.974 | -2.6 | -1.76% | [-16.04%, +12.52%] | 43.4% | 2.015 | -1.76% | +0.35% | MODERATE | NEUTRAL |
| +1.5 | away | 61 | 54.1% | 2.005 | 5.0 | +8.26% | [-17.03%, +33.56%] | 54.0% | 1.855 | +7.83% | +9.96% | LOW | NEUTRAL |
| -0.5 | home | 325 | 46.8% | 1.968 | -26.2 | -8.05% | [-18.75%, +2.65%] | 46.8% | 2.137 | -7.87% | -5.70% | STRONG | NEUTRAL |
| -0.75 | away | 279 | 39.4% | 1.967 | -23.8 | -8.52% | [-18.89%, +1.86%] | 39.5% | 2.193 | -8.85% | -6.72% | MODERATE | NEUTRAL |
| +0.75 | away | 152 | 41.1% | 1.957 | -12.7 | -8.37% | [-22.53%, +5.79%] | 52.6% | 2.148 | -7.82% | -5.64% | MODERATE | NEUTRAL |
| +1 | home | 119 | 45.2% | 1.918 | -11.3 | -9.50% | [-24.02%, +5.03%] | 45.3% | 2.203 | -9.07% | -6.90% | MODERATE | NEUTRAL |
| -1.5 | home | 122 | 46.7% | 1.978 | -8.5 | -6.96% | [-24.69%, +10.77%] | 46.8% | 2.137 | -7.33% | -5.13% | MODERATE | NEUTRAL |
| +1.5 | home | 61 | 45.9% | 1.920 | -7.4 | -12.11% | [-36.30%, +12.07%] | 46.0% | 2.169 | -11.14% | -9.01% | LOW | NEUTRAL |
| -1.75 | home | 79 | 37.3% | 1.960 | -14.8 | -18.77% | [-38.79%, +1.25%] | 45.7% | 2.435 | -17.56% | -15.20% | LOW | NEUTRAL |
| +1.25 | away | 65 | 33.8% | 2.017 | -12.5 | -19.18% | [-41.08%, +2.71%] | 34.3% | 2.553 | -18.01% | -15.90% | LOW | NEUTRAL |
| -2 | home | 61 | 31.1% | 1.990 | -17.3 | -28.34% | [-48.74%, -7.95%] | 31.9% | 3.097 | -26.00% | -23.55% | LOW | NEGATIVE_VALUE |
Ranking default uses the lower 95% ROI bound (sample-size protected). Model probability/EV use the pooled posterior for the selected cohort (in-sample); see walk-forward below for out-of-sample results.
AH Data Health
Walk-Forward (out-of-sample, season folds)
| Cohort | OOS Bets | All-Bets Yield | Positive-EV Bets | Positive-EV Yield | Brier | ECE | Positive Folds | Temporal Integrity |
|---|---|---|---|---|---|---|---|---|
| best_available|closing | 3798 | -1.55% | 1609 | -0.71% | 0.2509 | 0.0540 | 1/5 | PASS |
| best_available|opening | 3798 | -1.88% | 1524 | -2.95% | 0.2510 | 0.0303 | 1/5 | PASS |
| bet365|closing | 3798 | -2.36% | 1491 | -2.11% | 0.2509 | 0.0540 | 1/5 | PASS |
| bet365|opening | 3798 | -2.48% | 1418 | -2.86% | 0.2510 | 0.0303 | 1/5 | PASS |
| betbrain_avg|single_quote | 7304 | -3.30% | 3022 | -5.16% | 0.2502 | 0.0276 | 0/2 | PASS |
| pinnacle|closing | 3800 | -1.80% | 1572 | -0.89% | 0.2509 | 0.0542 | 1/5 | PASS |
| pinnacle|opening | 3798 | -2.10% | 1477 | -2.88% | 0.2511 | 0.0305 | 2/5 | PASS |
Limitations
- •No odds timestamps exist in market_odds.jsonl (only match_date plus opening/closing/single_quote labels); T-24h/T-6h/T-1h snapshots are DATA NOT AVAILABLE.
- •BetBrain aggregate columns (2015-16..2018-19 sources) were emitted twice by the legacy ingestion (labeled pinnacle and betbrain). The engine resolves true provenance from source headers and collapses the duplicate, but the raw dataset still contains the mislabeled rows.
- •BetBrain quotes are consensus averages (BbAvAHH/BbAvAHA), not a single bookmaker; they are reported as a separate cohort and never mixed with Pinnacle/Bet365.
- •Only football-data.co.uk closing/opening columns are available; exchange prices and in-play prices are DATA NOT AVAILABLE.
- •best_available requires two genuine books quoting the same match/line/snapshot (Pinnacle + Bet365, 2019-20 onward); earlier eras cannot support a best-price methodology and are excluded from that cohort.
- •Headline cohort contains 22 line/side groups below the 30-bet minimum sample; those are never ranked or promoted.
- •Model EV and fair odds in the value table use the pooled (in-sample) posterior for that line/side; only the walk-forward section is out-of-sample.
- •PROVENANCE_MISLABEL_DETECTED: legacy bookmaker_source labels are not trustworthy for pre-2019 sources.
src/lib/research/ah-yield/), the validation runner (scripts/ah-yield-validation.ts) and the JSON artifact at data/verification/AH_YIELD_ENGINE_REPORT.json. Regression suite: npm run test:ah-yield.