Hypotheses · yard-planned-move · H-a6871a63
Generalise: short-priced planned moves from yards proven poor at that move, all four moves pooled
vault CONTRADICTED: A/E 1.019 on 1804 bets, p 0.6626 against BH threshold 0.001754 over 57 vault tests
Part of the thread “Negative: short-priced planned moves from yards proven poor at that move” 2 hypotheses
- Proposed
- Designed
- Discovery
- Promising
- Falsification
- Frozen
- Vault
- Provisional
- Shadow
- Validated
- Live
- Source
- Investigator agent, v1
- Made by
- generalise
- Created
- 17 Oct, 05:05
- Tests logged
- 11
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-61d14772 (Negative: short-priced recruits to a strong new yard after a heavy bea) pointed the predicted way but failed the bar: A/E 0.81 on 84 bets (p 0.809), control 1.04. O-282acadf
- H-432686d7 (Negative: short-priced planned moves from yards proven poor at that mo) pointed the predicted way but failed the bar: A/E 0.87 on 195 bets (p 0.82), control 1.05. O-bc2c08d8
- AskedPooled across all planned moves (chase debut, handicap debut, new yard, fresh), are short-priced runners from yards with a long, poor record at that move over-bet? answered
- MechanismA planned move (fresh return, new yard, handicap or chase debut) depends on the yard's preparation. Yards that keep getting it wrong do so for lasting reasons: method, facilities, how they place horses. That same handling is behind today's runner too.
- Why the market misses itA short price on a debutant or a returner comes from the horse's own form and reputation. Punters rarely look at a yard's long record with that specific move, and the yard's headline strike rate hides it.
- Predictednegative, A/E 0.85 to 0.93 on 400+ bets
- Falsified ifA/E at or above 0.97 on 350+ bets, or no better than the same-race control
- Rule sketch
Mechanism and rationale
A planned move (fresh return, new yard, handicap or chase debut) depends on the yard's preparation. Yards that keep getting it wrong do so for lasting reasons: method, facilities, how they place horses. That same handling is behind today's runner too.
The rule
sp_decimal <= 6 AND ((tx_chase_debut_runs >= 20 AND tx_chase_debut_wins <= 0.7 * tx_chase_debut_exp) OR (tx_hcap_debut_runs >= 25 AND tx_hcap_debut_wins <= 0.7 * tx_hcap_debut_exp) OR (tx_new_yard_runs >= 25 AND tx_new_yard_wins <= 0.7 * tx_new_yard_exp) OR (tx_fresh_runs >= 30 AND tx_fresh_wins <= 0.7 * tx_fresh_exp))
Reads: sp_decimal, tx_chase_debut_runs, tx_chase_debut_wins, tx_chase_debut_exp, tx_hcap_debut_runs, tx_hcap_debut_wins, tx_hcap_debut_exp, tx_new_yard_runs, tx_new_yard_wins, tx_new_yard_exp, tx_fresh_runs, tx_fresh_wins, tx_fresh_exp
Pre-registration
- Spec hash (sha256 of the canonical pre-spec)
- b4401aa909f5282c4b424b5584466b204375b8ffef7974b77ac69b7ddc789816
- Frozen
- 17 Oct, 05:13
- Nothing in the definition can change after this.
- Confounders
- Moves overlap: one runner can be fresh and on its handicap debut, or in a new yard and returning, so it can qualify under several clauses at once. It counts once as a bet, but the clauses are not independent evidence.
- Short-priced debutants and returners may be over-bet whatever the yard. The good-record control rule tests this.
- A few large yards with many runs may dominate the poor-record group, so the result may reflect a handful of trainers. Check the yard concentration.
- Fresh-run records only start in 2021-03 and the wins columns start a little later, so the fresh clause adds runners only later in the window.
- GB and IRE may behave differently (the new-yard split was 0.81 vs 1.35). The GB-only refinement deals with this. The column is region; country does not exist.
- The 0.7 x expected cut on a sample of 20-30 runs partly captures noise. Some poor records will regress, which pushes the result towards 1.0.
- Control
{ "description": "Primary: the other runners in the same races, which should come in near A/E 1.0 (previous short-priced planned-move controls were about 1.05). The rule has to sit clearly below them. Second check, for the confounder that short-priced debutants and returners are over-bet whatever the yard: short-priced runners making one of the same four moves for yards with an adequate or good record at that move (wins at least 0.9 x expected, same run minimums). These should come in near 1.0. If they are as low as the rule, the effect belongs to short-priced planned moves in general, not to the yard.", "rule": "sp_decimal <= 6 AND ((tx_chase_debut_runs >= 20 AND tx_chase_debut_wins >= 0.9 * tx_chase_debut_exp) OR (tx_hcap_debut_runs >= 25 AND tx_hcap_debut_wins >= 0.9 * tx_hcap_debut_exp) OR (tx_new_yard_runs >= 25 AND tx_new_yard_wins >= 0.9 * tx_new_yard_exp) OR (tx_fresh_runs >= 30 AND tx_fresh_wins >= 0.9 * tx_fresh_exp))" }
Discovery result
pass broad rule · 17 Oct, 05:11
- Bets
- 413
- 75 winners
- A/E
- 0.80
- 95%: 0.63 to 1.00
- SP return
- -28.5%
- level stakes
- Betfair SP return
- -16.7%
- 396 bets with a BSP
Strike rate 18.2%. p = 0.98. Same-race control: the other runners in these races had A/E 1.07, so the selection did not beat its own races. Zone: discovery. Evaluator eval-1.0, data 6a4e98be18e83933
By period
Falsification
Each attack is a deliberate attempt to kill the idea. 6 of 6 survived.
- perturbation: Perturb: looser record cut (0.8x exp), shorter price cap 5.0, run minimums +20%pass
462 bets · A/E 0.93 (0.76 to 1.11) · control 1.03 · 17 Oct, 05:13
Breakdown
betsA/E0.71.01.32025-10-01 to 2026-04-273170.87after 2026-04-271451.05Bars grow from 1.00, the market. Faded bars have fewer than 40 bets. - perturbation: Perturb: wider price cap 7.5, run minimums -20%, 0.7x cut keptpass
630 bets · A/E 0.89 (0.73 to 1.07) · control 1.03 · 17 Oct, 05:13
Sealed holdout (vault)
- Bets
- 1,804
- 17 Oct, 05:13
- A/E
- 1.02
- p = 0.66
- BH threshold then
- 0.0018
- over every vault test so far
- Outcome
- Failed
- vault query (contradicted)fail
1,804 bets · A/E 1.02 (0.93 to 1.12) · control 1.00 · 17 Oct, 05:13
Breakdown
betsA/E0.71.01.32020-226831.052023 to Sept 20251,1210.99
Forward record
No forward record. Shadow tracking starts after the vault and counts only races run after the freeze.
Lineage
Agent runs
designer v1ok · 46s · 17 Oct, 05:05
Output (schema-checked)
{ "rule": "sp_decimal <= 6 AND ((race_type = 'Chase' AND prior_chase_runs = 0 AND tx_chase_debut_runs >= 20 AND tx_chase_debut_wins <= 0.7 * tx_chase_debut_exp) OR (is_handicap = 1 AND prior_handicap_runs = 0 AND tx_hcap_debut_runs >= 25 AND tx_hcap_debut_wins <= 0.7 * tx_hcap_debut_exp) OR (trainer_id <> last_trainer_id AND tx_new_yard_runs >= 25 AND tx_new_yard_wins <= 0.7 * tx_new_yard_exp) OR (days_since_last_run >= 90 AND tx_fresh_runs >= 30 AND tx_fresh_wins <= 0.7 * tx_fresh_exp))", "refinements": [ { "label": "shortest prices only (4.0 or shorter), where over-betting on reputation is strongest", "rule": "sp_decimal <= 4 AND ((race_type = 'Chase' AND prior_chase_runs = 0 AND tx_chase_debut_runs >= 20 AND tx_chase_debut_wins <= 0.7 * tx_chase_debut_exp) OR (is_handicap = 1 AND prior_handicap_runs = 0 AND tx_hcap_debut_runs >= 25 AND tx_hcap_debut_wins <= 0.7 * tx_hcap_debut_exp) OR (trainer_id <> last_trainer_id AND tx_new_yard_runs >= 25 AND tx_new_yard_wins <= 0.7 * tx_new_yard_exp) OR (days_since_last_run >= 90 AND tx_fresh_runs >= 30 AND tx_fresh_wins <= 0.7 * tx_fresh_exp))" }, { "label": "long-proven poor yards (double the minimum record), testing the 'lasting reasons' claim", "rule": "sp_decimal <= 6 AND ((race_type = 'Chase' AND prior_chase_runs = 0 AND tx_chase_debut_runs >= 40 AND tx_chase_debut_wins <= 0.7 * tx_chase_debut_exp) OR (is_handicap = 1 AND prior_handicap_runs = 0 AND tx_hcap_debut_runs >= 50 AND tx_hcap_debut_wins <= 0.7 * tx_hcap_debut_exp) OR (trainer_id <> last_trainer_id AND tx_new_yard_runs >= 50 AND tx_new_yard_wins <= 0.7 * tx_new_yard_exp) OR (days_since_last_run >= 90 AND tx_fresh_runs >= 60 AND tx_fresh_wins <= 0.7 * tx_fresh_exp))" }, { "label": "GB only, since the new-yard finding showed GB and IRE behave differently", "rule": "country = 'GB' AND sp_decimal <= 6 AND ((race_type = 'Chase' AND prior_chase_runs = 0 AND tx_chase_debut_runs >= 20 AND tx_chase_debut_wins <= 0.7 * tx_chase_debut_exp) OR (is_handicap = 1 AND prior_handicap_runs = 0 AND tx_hcap_debut_runs >= 25 AND tx_hcap_debut_wins <= 0.7 * tx_hcap_debut_exp) OR (trainer_id <> last_trainer_id AND tx_new_yard_runs >= 25 AND tx_new_yard_wins <= 0.7 * tx_new_yard_exp) OR (days_since_last_run >= 90 AND tx_fresh_runs >= 30 AND tx_fresh_wins <= 0.7 * tx_fresh_exp))" } ], "control": { "description": "I expect the other runners in the same races to sit near A/E 1.0 to 1.05, as they did in the two earlier negative rules. That control does not answer the main confounder, which is that short-priced debutants and returners may be over-bet whatever the yard. So the second control is short-priced runners making the same four moves from yards with an adequate or better record at that move (wins >= expected on the same minimum sample). The prediction holds only if the poor-yard group falls clearly below this group as well as below the same-race runners.", "rule": "sp_decimal <= 6 AND ((race_type = 'Chase' AND prior_chase_runs = 0 AND tx_chase_debut_runs >= 20 AND tx_chase_debut_wins >= tx_chase_debut_exp) OR (is_handicap = 1 AND prior_handicap_runs = 0 AND tx_hcap_debut_runs >= 25 AND tx_hcap_debut_wins >= tx_hcap_debut_exp) OR (trainer_id <> last_trainer_id AND tx_new_yard_runs >= 25 AND tx_new_yard_wins >= tx_new_yard_exp) OR (days_since_last_run >= 90 AND tx_fresh_runs >= 30 AND tx_fresh_wins >= tx_fresh_exp))" }, "pass_criteria": { "min_bets": 300, "min_ae": 1.05, "max_p": 0.05 }, "forward_bar": { "min_bets": 150, "min_ae": 1, "max_p": 0.2 }, "confounders": [ "Moves overlap: one runner can be fresh, with a new yard and on its handicap debut at once. It counts as one bet, but its yard may be poor at only one of those moves.", "Short-priced debutants and returners may be over-bet whatever the yard. The good-yard control rule is there to test this.", "A few large yards may make up most of the poor-record group. Check how concentrated the yards are before reading the result as a general effect.", "Fresh-run yard records start only in 2021-03, and wins in 2021-04, so the fresh branch covers a shorter window than the other three.", "The 0.7 x expected threshold on a 20 to 30 run record partly picks yards on noise, so some regression to the mean is built in. If it is noise, it would push A/E toward 1.0, not below it.", "GB and IRE behaved differently in the new-yard finding (GB 0.81, IRE 1.35), so pooling the two countries could hide or blur the effect." ], "mechanism": "A planned move (fresh return, new yard, handicap debut or chase debut) depends on how the yard prepares and places the horse. Yards that keep getting a particular move wrong do so for lasting reasons: method, facilities, placing. Today's runner gets the same handling, so its chance is lower than its form suggests. The two narrower tests both pointed down (chase/handicap debut 0.87 on 195, recruits to a strong yard after a beating 0.81 on 84) but neither had enough bets on its own. Pooling the four moves is meant to get a sample big enough to settle it.", "market_miss": "A short price on a debutant or returner comes from the horse's own form and reputation. Punters rarely look up a yard's long record with that specific move, and a decent overall strike rate hides it. So the price does not account for how badly this yard handles this move.", "prediction": { "direction": "negative", "size": "A/E 0.85 to 0.93 on 400+ bets, at least 0.07 below the same-race control and below the good-yard control", "falsified_if": "A/E at or above 0.97 on 350+ bets, or no lower than the same-race control, or no lower than short-priced runners making the same moves from yards with an adequate record (the good-yard control)" }, "notes": "I changed the sketch in one way. Each branch now requires the runner to actually be making that move: chase debut is race_type = 'Chase' AND prior_chase_runs = 0; handicap debut is is_handicap = 1 AND prior_handicap_runs = 0; new yard is trainer_id <> last_trainer_id; fresh is days_since_last_run >= 90, the same cut-off as the family's fresh rules. Without these conditions a non-null tx_* value alone could select runners that are not making the move. If the tx_* columns are already only filled in for runners making the move, the conditions change nothing. Thresholds are as in the sketch. The direction is negative, so min_ae 1.05 means A/E at or below about 0.952 (1/1.05). I raised min_bets to 300 because the point of pooling is a sample big enough to decide the question." }
Timeline
Job 3177 finished
· engine:compute-1
H-a6871a63 Vault → KILLEDfailed the vault vault CONTRADICTED: A/E 1.019 on 1804 bets, p 0.6626 against BH threshold 0.001754 over 57 vault tests
· engine:orchestrator
vault result for H-a6871a63 (vault query (contradicted)): fail
· engine:orchestrator
H-a6871a63 Frozen → FROZENvault vault query started
· engine:orchestrator
compute-1 took job 3177 (vault, attempt 1)
· compute-1
Job 3165 finished
· engine:compute-1
Queued vault on the compute lane: frozen: one sealed vault query
· engine:scheduler
H-a6871a63 Falsification → FROZEN survived falsification
· engine:falsification
falsification result for H-a6871a63 (partition: Partition: handicaps only, where form-based pricing should be most exposed): pass
· engine:evaluator
compute-1 took job 3165 (attack, attempt 1)
· compute-1
Job 3164 finished
· engine:compute-1
falsification result for H-a6871a63 (price_band: Price band: exclude the shortest end, SP 3.0 to 6.0 only): pass
· engine:evaluator
compute-1 took job 3164 (attack, attempt 1)
· compute-1
Job 3163 finished
· engine:compute-1
falsification result for H-a6871a63 (partition: Partition: fresh-return and new-yard clauses only (debut clauses removed)): pass
· engine:evaluator
compute-1 took job 3163 (attack, attempt 1)
· compute-1
Job 3162 finished
· engine:compute-1
falsification result for H-a6871a63 (control: Control: short-priced planned moves with yard record ignored (run minimums only)): pass
· engine:evaluator
compute-1 took job 3162 (attack, attempt 1)
· compute-1