Open a typical football prediction site on any given Saturday and you'll find a pick for every match on the slate — Brighton vs Burnley at 3pm, FC Liefering vs Wattens at 4:30, an MLS reserve game at midnight. A number next to each one. A confidence band. An 'expert lock' label.
None of those numbers can mean anything individually if the model is forced to produce one for every match. The most informative thing a model can say about most fixtures is 'I have nothing useful here.'
What abstain means at Cortex
Abstain is a first-class output. When the model can't identify a quantifiable gap between its own read and the market price, it returns one of five named reasons instead of a pick:
- line_efficient — the market already prices the call we'd make
- thin_data — too few signals to ground a confident read
- conflicting_signals — form, head-to-head, and news disagree
- small_sample — the underlying stat lacks enough appearances
- high_variance — outcome distribution too wide (derbies, cup ties)
Each reason maps to a hard rule. Abstain rows stay public on their fixture, the same way published picks do — we don't graduate them out of the record to make the win-rate look healthier.
The math behind it
If you force a model to publish on every match, the median match has near-zero signal. The model's job becomes guessing at a number, and the resulting confidence label tells you nothing about whether the call is good — only that the model didn't refuse.
By skipping the matches where the data is thin, we keep the published-pick distribution heavy on calls the model has something real to say about. The calibration page shows what that does to the hit rate.
Why this is the product
A subscription that says 'we'll tell you when not to act' sells worse than one that says 'we'll find you a winner every day.' We know that. We're building the first one anyway. Confidence numbers that survive scrutiny are worth more than confidence numbers that don't.