← Monitoring · Simulation

V3+AH Portfolio — Live Guide

17 strategies running in paper-trade. 7 H2H draw/away from V3, 10 Asian Handicap from the mega-sweep. Joint-sim expectation: +12.5% ROI / +€25.2k / 6.5% max DD over 4 months (vol_cap 0.75, max_bet 5%).

1. The big picture

Every match in our coverage triggers up to 17 evaluations — one per strategy. Each strategy has its own slot (when before kickoff it fires), feature schema, model, and decision threshold. When a strategy says "bet", we place; when it says "skip", we log predict_returned_skip. A single match can produce zero, one, or several bets depending on which strategies trigger.

Stakes share a single bankroll under a volume cap (no more than 75% of bankroll committed simultaneously) and a per-bet cap of 5% of bankroll. The portfolio was selected by joint simulation — strategies that duplicated each other or under-contributed were pruned.

Slots

  • T-1440 — 24h before kickoff (early market)
  • T-720 — 12h before
  • T-60 — 1h before (late market, sharp money has moved)
  • T-10 — 10min before kickoff (last chance, tightest spreads)

A given strategy belongs to exactly one slot. If the OA snapshot or BF AH odds aren't available at that moment, the strategy logs no_bf_odds / no_bf_ah_odds and skips this match.

2. V3 H2H entries (7)

V3 is the cross-market H2H model trained on all 86 books × 4 slots. Inputs: bookmaker H2H odds tensor (1032-dim). Output: probability for each of {home, draw, away}. Six of seven V3 entries BACK the draw; one BACKs away at T-60.

Why so many draws? Bookmakers systematically under-price draws in low-scoring leagues, and the V3 cross-market model picks that up. Different (slot, model, cutoff, stake_algo) combinations exploit it from different angles.

OutcomeSlotModelCutoffStake algoOOS PnLOOS betsNote
BACKDRAWT-10xgbc2RIDGE+22,901557BACK draw at T-10. Highest-PnL strategy in the portfolio. RIDGE-weighted stake responds to recent edge stability.
BACKDRAWT-1440xgbc2FLAT+2,351199BACK draw 24h before kickoff. Flat staking — fires on early-market mispricings before liquidity sets the line.
BACKDRAWT-720xgbc2FLAT+1,893341BACK draw 12h before kickoff. Mid-market window, before sharp money but after most line moves.
BACKDRAWT-60catboostc1FLAT+1,660458BACK draw 1h before kickoff. CatBoost on c1 features — different signal source than xgb/c2.
BACKDRAWT-1440catboostc1DD_AWARE+1,477340BACK draw at T-1440 with drawdown-aware staking — pulls back size while equity is below recent peak.
BACKAWAYT-60lgbmc1DD_AWARE+1,06237BACK away at T-60. Only non-draw V3 entry — fires rarely (low n) but with strong ROI.
BACKDRAWT-720catboostc1RIDGE+443382BACK draw at T-720 — different model + stake-algo combination than the xgb/FLAT entry, captures complementary signal.

3. AH entries (10)

AH strategies are trained on the mega-sweep feature schema (5610-dim): all 86 books × 4 slots × 33 lines × IP odds + Betfair back/lay/volume per (slot, line, side) + cross-slot deltas. The model outputs P(home covers the line). Each strategy picks one specific (line, side) combination — we don't ensemble lines.

The 4 sides — what each one means

We've moved away from the older COVERS/DOESNT framing. Each AH strategy now picks one of four explicit sides, which match exactly how the bet sits on the Betfair exchange.

SidePlain EnglishWe WIN whenLiability
BACKHOMEBet that home covers the line.Home covers (e.g. wins by 2+ at line −1.5).= stake
BACKAWAYBet that home does NOT cover (= away wins / draws / wins-by-less).Home fails to cover.= stake
LAYHOMELAY the "home covers" selection — bet AGAINST home covering.Home fails to cover.stake × (odds − 1)
LAYAWAYLAY the "home does not cover" selection — bet AGAINST that side.Home covers.stake × (odds − 1)

Note: BACK_AWAY and LAY_HOME express the same belief (home doesn't cover) but at different prices on the exchange — back odds vs lay odds. Same for BACK_HOME vs LAY_AWAY. Different strategies pick whichever side has the better edge per their model.

The 10 deployed AH entries

LineSideSlotModelOOS PnLOOS betsBacktest c4 PnL
AH -2.50BACKHOMET-720rf+708231,348
AH -2.00LAYAWAYT-10xgb+201512
AH -1.75LAYAWAYT-60lgbm+269171,035
AH -1.50BACKHOMET-1440rf-10519958
AH -1.25LAYAWAYT-720lgbm+8581,076
AH -1.00BACKHOMET-720lgbm+272942
AH -0.75LAYAWAYT-10lgbm+341673,430
AH -0.50LAYHOMET-10lgbm+403452,371
AH -0.25LAYHOMET-10rf+258475,460
AH +0.75BACKAWAYT-10rf+5371103,958

All AH entries use cutoff c4 (the most-recent calibration) and stake algoVOL_TARGET (sized to a fixed % of available BF volume so we don't move the line).

4. Quarter-line settlement (−0.25 / +0.75 / etc.)

Real Betfair settles quarter lines by splitting stake 50/50 across the two adjacent half/whole lines (so a bet at −0.25 settles half on 0 and half on −0.5). Possible outcomes: full win, full loss, half-win, half-loss, half-push.

Our paper-trade (and the joint sim that produced the expected ROI) use the training-label settlement: binary covered/not, no half-splits. Reason: the model is trained on that exact label, so paper-trade-vs-joint-sim parity requires the same convention. The difference materialises only on draws and exact-margin outcomes — for live money this is a small known semantic gap (~half a stake on rare matchups) we'll close before going to real money.

The audit script tools/overnight_sanity_check.py flags every quarter-line bet so we can eyeball them.

5. Bet flow (per evaluation)

  1. simulation_runner heartbeats every 5 min, schedules a threading.Timer at slot-time before each upcoming kickoff.
  2. At slot-time: pull the OA snapshot tagged with that slot from oddsapi_snapshots.
  3. Build the feature vector for the strategy: 1032-dim for V3 H2H, 5610-dim for AH (includes BEX back/lay/volume from betfair_ah_snapshots).
  4. Run the model. For V3 → P(home/draw/away). For AH → P(home covers the line).
  5. Strategy decides BACK / LAY / skip based on its threshold. Skip → log predict_returned_skip.
  6. If betting: pull live BF odds for that market. Compute stake via the strategy's algorithm (FLAT, RIDGE, DD_AWARE, or VOL_TARGET).
  7. Apply portfolio caps: vol_cap (0.75), max_bet_pct (0.05), min_bet_eur (10). Adjust stake or reject (stake_below_min).
  8. Place on Betfair (paper). Deduct liability from bankroll. Lock until kickoff + 2h.
  9. After settle grace: pull final score from BF, apply per-side win/loss formula, credit bankroll.

6. Glossary

  • Edge — model probability minus market-implied probability at the quoted odds.
  • Cutoff (c1 / c2 / c4) — feature-set version. Different cutoffs use different bookmaker / slot subsets at training time. c4 is the most recent.
  • Stake algos:
    • FLAT — same € stake every bet.
    • RIDGE — Kelly-like, dampened by recent edge variance.
    • DD_AWARE — pulls back size while bankroll is below recent peak.
    • VOL_TARGET — stake sized as a % of available exchange volume (used for AH).
  • vol_cap — total liability committed across all open bets ≤ 75% of bankroll.
  • max_bet_pct — single bet ≤ 5% of bankroll, regardless of what the algo says.
  • min_bet_eur — bets below €10 stake are dropped (stake_below_min).
  • Liability (LAY) — what we lose if the LAY loses. stake × (odds − 1).