Hypotheses · race-betting · H-2ae0cf0d
Replicate big-yard top-two lift with a fixed, time-stable definition of big yard
fails: 196 bets, needs 200; p 0.3025, needs 0.05 or lower; periods [1.33, 0.92], each needs 1.0 (not a niche pass: a period points the other way [1.33, 0.92])
Part of the thread “H199: favourite at a big price in a big handicap” 12 hypotheses
- Proposed
- Designed
- Discovery
- Promising
- Falsification
- Frozen
- Vault
- Provisional
- Shadow
- Validated
- Live
- Source
- Investigator agent, v1
- Made by
- replicate
- Created
- 16 Oct, 15:58
- Tests logged
- 1
Reasoning
Why this hypothesis exists: what the lab saw, the question it asked, the mechanism it proposed, what it predicted, and the result that would prove it wrong. Written before the test was run.
- Observed
- H-659f3a37 (Big-yard runners at the front of the market in big handicaps beat thei) passed discovery: A/E 1.33 on 386 bets (p 0.022), same-race control 0.96. O-fe42f7ad
- AskedDoes the cumulative trainer_runs >= 1500 filter bias the big-yard pool towards later dates and the largest yards? Does a fixed-size definition, such as trainer_runs >= 3000, give the same answer? testing
- MechanismIf big yards' front-of-market handicappers really are under-bet, the effect belongs to the largest operations whatever the date. A higher run threshold keeps only yards that were big from early in the data. That avoids the creeping set of qualifying yards that weights trainer_runs >= 1500 towards later periods.
- Why the market misses itSame as the parent: at 5/1+ in a big field, the market prices the horse's exposed form, not the yard's targeting of big handicaps.
- Predictedpositive, A/E 1.12 to 1.30 on 250+ bets, both countries above 1.00, both periods above 1.00
- Falsified ifA/E 1.05 or below on 200+ bets, or one country or period at 1.00 or below, which would mean the parent's figure came from the creeping yard set or from a few trainers
- Rule sketch
is_handicap = 1 AND sp_rank <= 2 AND sp_decimal >= 6 AND field_size >= 14 AND trainer_runs >= 3000
Mechanism and rationale
If big yards' front-of-market handicappers really are under-bet, the effect belongs to the largest operations whatever the date. A higher run threshold keeps only yards that were big from early in the data. That avoids the creeping set of qualifying yards that weights trainer_runs >= 1500 towards later periods.
The rule
is_handicap = 1 AND sp_rank <= 2 AND sp_decimal >= 6 AND field_size >= 14 AND race_date >= '2021-01-01' AND trainer_runs >= 45 * ((CAST(substr(race_date, 1, 4) AS INTEGER) - 2020) * 12 + CAST(substr(race_date, 6, 2) AS INTEGER) - 6)
Reads: is_handicap, sp_rank, sp_decimal, field_size, race_date, trainer_runs
Pre-registration
- Spec hash (sha256 of the canonical pre-spec)
- fe56cc042bc1ac5cefe991e90143f32708426ee46d900833123fddbffe050892
- Frozen
- not frozen
- The definition can still change.
- Confounders
- Trainer concentration: the pool may come down to two or three mega-yards (Mullins, Elliott, a couple of big GB Flat yards). Report A/E with the top trainer removed.
- Irish festival handicaps (Galway, Punchestown, Leopardstown Christmas) may be dominated by these yards. A country split is needed, and both countries must be above 1.00.
- Overlaps heavily with the parent H-659f3a37, so it is a robustness check, not an independent replication.
- BSP versus SP gap: the parent made +27% at BSP but only +1.6% at SP. An A/E lift may not be a bettable edge at SP.
- If trainer_runs counts history from before July 2020, the runs-per-month rate is inflated early on. The 2021 burn-in reduces this but may not remove it. The early period should be checked for unusually many qualifiers.
- Over a short window, the runs-per-month rate is noisy for yards with seasonal (Flat-only or jumps-only) programmes.
- Smaller sample than the parent, so the confidence interval is wider.
- Control
{ "description": "The lab's same-race control (all other runners in the selected races) should sit at about 0.96 to 1.00, as it did for the parent (0.965). If it is also lifted, the effect belongs to the race type, not to big yards. The second comparison is the same top-two pool from yards below the size-rate threshold. On the parent's evidence it should be close to par (the small-yard pool scored 1.03 on 468 and was level with its control). If those smaller yards are lifted as much as the big ones, the effect is a big-handicap short-end effect and has nothing to do with yard size.", "rule": "is_handicap = 1 AND sp_rank <= 2 AND sp_decimal >= 6 AND field_size >= 14 AND race_date >= '2021-01-01' AND trainer_runs < 45 * ((CAST(substr(race_date, 1, 4) AS INTEGER) - 2020) * 12 + CAST(substr(race_date, 6, 2) AS INTEGER) - 6)" }
Discovery result
fail broad rule · 16 Oct, 16:00
- Bets
- 196
- 25 winners
- A/E
- 1.13
- 95%: 0.73 to 1.66
- SP return
- -13.3%
- level stakes
- Betfair SP return
- +8.1%
- 183 bets with a BSP
Strike rate 12.8%. p = 0.30. Same-race control: the other runners in these races had A/E 1.00, so the selection beat its own races. Zone: discovery. Evaluator eval-1.0, data 6a4e98be18e83933
By period
Falsification
No attacks yet. Only promising ideas are attacked.
Sealed holdout (vault)
Not queried. Only a frozen idea can spend its one query against the 2020-25 holdout.
Forward record
No forward record. Shadow tracking starts after the vault and counts only races run after the freeze.
Lineage
Agent runs
designer v1ok · 1m 4s · 16 Oct, 15:58
Output (schema-checked)
{ "rule": "is_handicap = 1 AND sp_rank <= 2 AND sp_decimal >= 6 AND field_size >= 14 AND race_date >= '2021-01-01' AND trainer_runs >= 45 * ((CAST(substr(race_date, 1, 4) AS INTEGER) - 2020) * 12 + CAST(substr(race_date, 6, 2) AS INTEGER) - 6)", "refinements": [ { "label": "Largest operations only (about 2.5 runs a day)", "rule": "is_handicap = 1 AND sp_rank <= 2 AND sp_decimal >= 6 AND field_size >= 14 AND race_date >= '2021-01-01' AND trainer_runs >= 75 * ((CAST(substr(race_date, 1, 4) AS INTEGER) - 2020) * 12 + CAST(substr(race_date, 6, 2) AS INTEGER) - 6)" }, { "label": "Second favourites only, where the parent's lift sat", "rule": "is_handicap = 1 AND sp_rank <= 2 AND sp_decimal >= 6 AND field_size >= 14 AND race_date >= '2021-01-01' AND trainer_runs >= 45 * ((CAST(substr(race_date, 1, 4) AS INTEGER) - 2020) * 12 + CAST(substr(race_date, 6, 2) AS INTEGER) - 6) AND sp_rank = 2 AND is_favourite = 0" } ], "control": { "description": "The lab's same-race control (all other runners in the selected races) should sit at about 0.96 to 1.00, as it did for the parent (0.965). If it is also lifted, the effect belongs to the race type, not to big yards. The second comparison is the same top-two pool from yards below the size-rate threshold. On the parent's evidence it should be close to par (the small-yard pool scored 1.03 on 468 and was level with its control). If those smaller yards are lifted as much as the big ones, the effect is a big-handicap short-end effect and has nothing to do with yard size.", "rule": "is_handicap = 1 AND sp_rank <= 2 AND sp_decimal >= 6 AND field_size >= 14 AND race_date >= '2021-01-01' AND trainer_runs < 45 * ((CAST(substr(race_date, 1, 4) AS INTEGER) - 2020) * 12 + CAST(substr(race_date, 6, 2) AS INTEGER) - 6)" }, "pass_criteria": { "min_bets": 200, "min_ae": 1.08, "max_p": 0.05 }, "forward_bar": { "min_bets": 100, "min_ae": 1.03, "max_p": 0.2 }, "confounders": [ "Trainer concentration: the pool may come down to two or three mega-yards (Mullins, Elliott, a couple of big GB Flat yards). Report A/E with the top trainer removed.", "Irish festival handicaps (Galway, Punchestown, Leopardstown Christmas) may be dominated by these yards. A country split is needed, and both countries must be above 1.00.", "Overlaps heavily with the parent H-659f3a37, so it is a robustness check, not an independent replication.", "BSP versus SP gap: the parent made +27% at BSP but only +1.6% at SP. An A/E lift may not be a bettable edge at SP.", "If trainer_runs counts history from before July 2020, the runs-per-month rate is inflated early on. The 2021 burn-in reduces this but may not remove it. The early period should be checked for unusually many qualifiers.", "Over a short window, the runs-per-month rate is noisy for yards with seasonal (Flat-only or jumps-only) programmes.", "Smaller sample than the parent, so the confidence interval is wider." ], "mechanism": "The large yards' front-of-market runners in big handicaps are targeted plot horses, and that is not fully reflected at 5/1+. If so, the effect should belong to yards that are big by operating scale, measured the same way at every date. trainer_runs is a cumulative count 'before today' (the catalogue says so), so the draft rule's fixed threshold of 3000 does not keep 'yards big from early in the data'. Almost no yard reaches 3000 in the first year or two, so that threshold leans towards later periods even more than 1500 did. A time-stable definition needs a rate. This rule uses cumulative runs per month since data start (July 2020), at 45 runs a month or more (about 1.5 a day, around 550 a year). That is roughly the parent's 1500 threshold at the middle of the data, applied evenly through time. Races before 2021 are excluded so the rate is not noise from the first few weeks.", "market_miss": "At 5/1+ in a 14+ runner handicap, prices are driven by the horse's exposed handicap form and by the many-runner overround. The market under-weights a big yard's deliberate placing of a horse at its target handicap. This applies especially to the yard's second-string market choice, which draws less of the stable-money and public-following support than the favourite.", "prediction": { "direction": "positive", "size": "A/E 1.12 to 1.30 on 250+ bets, with GB and IRE both above 1.00 and both the early (2021 to 2023) and late (2024 onwards) periods above 1.00", "falsified_if": "Falsified by any of these: A/E 1.05 or below on 200+ bets; GB, IRE, the early period or the late period at 1.00 or below; the size-rate control pool (smaller yards) scoring within 0.05 of the selection; or the lift dropping to 1.05 or below when the single biggest trainer is removed." }, "notes": "I changed the rule from the sketch. trainer_runs is cumulative to date, so trainer_runs >= 3000 would push the pool even further towards late periods. That is the opposite of the question being asked (Q-50fd9039). The fix is a runs-per-month rate built from race_date. It uses only substr and CAST (portable SQL) with no subqueries, plus a 2021 burn-in. The SQL has not been run against data, so please check it parses. Because both countries and both periods must be above 1.00, the min_bets of 200 matches the prediction's falsification threshold. Report the per-trainer breakdown." }
Timeline
Job 1945 finished
· engine:compute-1
H-2ae0cf0d Discovery → KILLED fails: 196 bets, needs 200; p 0.3025, needs 0.05 or lower; periods [1.33, 0.92], each needs 1.0 (not a niche pass: a period points the other way [1.33, 0.92])
· engine:evaluator
discovery result for H-2ae0cf0d (broad rule): fail
· engine:evaluator
H-2ae0cf0d Designed → RESEARCHdiscovery measuring on the discovery zone
· engine:orchestrator
compute-1 took job 1945 (evaluate, attempt 1)
· compute-1
Job 1943 finished
· engine:ai-1
Queued evaluate on the compute lane: discovery run of the broad rule
· engine:scheduler
H-2ae0cf0d Proposed → RESEARCHdesigned pre-spec written and hashed
· agent:designer@v1
ai-1 took job 1943 (design, attempt 1)
· ai-1
Queued design on the ai lane: write the pre-spec
· engine:scheduler
New idea H-2ae0cf0d: Replicate big-yard top-two lift with a fixed, time-stable definition of big yard (replicate)
· agent:investigator@v1
Every change is an event with an actor: an agent and its version, an engine, a human, or the importer. Current stage: Killed.