Hypotheses · shock · S2-chase-completed-normal-habitual-poor-jumper
S2: chase completed normal habitual poor jumper
holdout SUPPORTIVE: A/E 1.141 on 1077 (GB 1.107, IRE 1.366), p 0.0595 against BH 0.003448 over 29 tests
Starts the thread “S2: chase completed normal habitual poor jumper” 4 hypotheses
- Proposed
- Designed
- Discovery
- Promising
- Falsification
- Frozen
- Vault
- Provisional
- Shadow
- Validated
- Live
- Source
- Imported from the RaceiQ holdout
- Made by
- import
- Created
- 15 Oct, 23:10
- Tests logged
- 2
Mechanism and rationale
Shock test S2-chase-completed-normal-habitual-poor-jumper (shock.py, frozen before the holdout was fetched)
The rule
code = 'Chase' AND finished = 1 AND s BETWEEN -0.75 AND 0.75 AND e <= -0.3104024419783082
Reads: code, finished, s, e
Pre-registration
- Spec hash (sha256 of the canonical pre-spec)
- 330c2256dbac974b760c0a655b82de768200c83707fae29ef271b4465785816c
- Frozen
- 14 Oct, 01:00
- Nothing in the definition can change after this.
- Direction
positive
- Frozen in
research/experiments/raceiq/shock_tests
- Frozen on
2026-10-14
- Id
S2-chase-completed-normal-habitual-poor-jumper
- Rule
code = 'Chase' AND finished = 1 AND s BETWEEN -0.75 AND 0.75 AND e <= -0.3104024419783082
Result (from the archive)
info discovery, no error in the remark · 15 Oct, 23:10
- Bets
- 467
- A/E
- 1.03
- winners vs the prices
- SP return
- -21.8%
- level stakes
- Betfair SP return
- -3.7%
- 467 bets with a BSP
Strike rate 12.0%.
By period
Falsification
No attacks yet. Only promising ideas are attacked.
Sealed holdout (vault)
- Bets
- 1,077
- 14 Oct, 13:00
- A/E
- 1.14
- p = 0.060
- BH threshold then
- 0.0034
- over every vault test so far
- Outcome
- Failed
- from the archive
Forward record
- forward check refusederror
· 15 Oct, 23:21
Lineage
Agent runs
investigator v1ok · 49s · 17 Oct, 03:47
Output (schema-checked)
{ "reflection": "This thread has one link so far: a frozen shock test. It selects horses whose previous run was a completed chase in which they ran to expectation (s between -0.75 and 0.75), and whose expected Jump Index from earlier runs was poor (e <= -0.31), so they are habitual poor jumpers. In discovery it was near flat (A/E 1.031 on 467). On the sealed holdout it was stronger: A/E 1.141 on 1077 bets, p 0.060. That is nowhere near the false-discovery threshold of 0.0034 across 29 tests, so it sits in SHADOW and is not an edge. The lift is uneven: GB 1.107, IRE 1.366. IRE jump-shock data only starts in August 2024, so the IRE figure rests on a shorter, thinner window. Discovery and holdout disagree by about 0.11, which counts against a stable effect.\n\nThe most plausible mechanism is that the market reads beaten lengths and form figures. A poor jumper that still finishes has lost ground at its fences, so its finishing form understates its ability. The thread has not yet shown that the jumping variable e causes the lift. It may just be the s-normal, completed-chase base pool, or a price-band effect. Three things need checking next:\n- whether the base pool without the e cut shows the same lift;\n- whether the lift grows as e worsens or as the beaten margin grows;\n- whether the horses do better when the fences are taken away (hurdles today).", "answers": [], "questions": [ { "question": "Is the holdout lift caused by the poor-jumping condition (e), or would any horse that completed a chase last time to expectation (s normal) show it?", "rationale": "If the base pool (code='Chase', finished=1, s between -0.75 and 0.75) scores about 1.10 without the e cut, then e adds nothing and the thread is about something else. Columns: code, finished, s, e.", "observation_ids": [ "O-1a861319" ], "priority": 0.7 }, { "question": "Does the lift grow as the expected jumping gets worse, or as the last beaten margin grows (more of the defeat put down to jumping)?", "rationale": "A dose-response is what the misleading-form mechanism predicts. If the mechanism is real, A/E should rise as e falls further below -0.31 and as last_beaten_lengths grows. Columns: e, last_beaten_lengths, jumping_errors_last3, sp_decimal.", "observation_ids": [ "O-1a861319" ], "priority": 0.55 }, { "question": "Is the IRE concentration (1.366 against GB 1.107) real, or is it the shorter IRE data window and a small IRE sample?", "rationale": "IRE shock columns only start in August 2024. Read the IRE bet count by month and by course to see whether a few meetings carry the figure. Columns: region, course, sp_rank, field_size.", "observation_ids": [ "O-1a861319" ], "priority": 0.35 } ], "hypotheses": [ { "title": "Rival: the lift belongs to every chase completer that ran to expectation, not to poor jumpers", "family": "shock", "operator": "rival-explanation", "question_id": null, "new_question": 0, "parent_id": "S2-chase-completed-normal-habitual-poor-jumper", "reasoning": { "observation_ids": [ "O-1a861319" ], "question": "Does the e <= -0.31 cut add anything over the base pool of completed chases run to expectation?", "mechanism": "Horses that ran exactly to expectation last time give the form book no surprise to react to. Any under-betting may then be a feature of that 'unremarkable' pool, not of jumping.", "market_miss": "If the base pool is under-bet, the cause is the market neglecting horses with dull, ordinary form, and jumping has nothing to do with it.", "prediction": { "direction": "positive", "size": "A/E 1.08 to 1.12 on 4000+ bets if the rival holds", "falsified_if": "The base pool scores 1.03 or less while the poor-jumper subset stays at 1.10 or more. That would leave e as the carrier." }, "rule_sketch": "code = 'Chase' AND finished = 1 AND s BETWEEN -0.75 AND 0.75 AND e > -0.3104" }, "confounders": [ "price band mix", "IRE share of the holdout", "field size" ], "expected_survival": 0.3 }, { "title": "Test-mechanism: habitual poor chase jumpers switched to hurdles today", "family": "shock", "operator": "test-mechanism", "question_id": null, "new_question": 1, "parent_id": "S2-chase-completed-normal-habitual-poor-jumper", "reasoning": { "observation_ids": [ "O-1a861319" ], "question": "If poor jumping hides these horses' ability, does dropping to smaller obstacles release it?", "mechanism": "Over fences, a poor jumper loses ground and momentum at each obstacle, so its finishing form understates its engine. Hurdles cost less to jump, so more of that hidden ability shows.", "market_miss": "The market prices a hurdle runner off its recent chase form figures and beaten lengths. Those figures are depressed by jumping errors that matter less over hurdles.", "prediction": { "direction": "positive", "size": "A/E 1.10 to 1.25 on 150+ bets", "falsified_if": "A/E 1.00 or less on 150+ bets, or no better than the parent's chase-today runners." }, "rule_sketch": "code = 'Chase' AND finished = 1 AND s BETWEEN -0.75 AND 0.75 AND e <= -0.3104 AND race_type = 'Hurdle'" }, "confounders": [ "trainer switching intent", "novice hurdle class drop", "small sample" ], "expected_survival": 0.3 }, { "title": "Sharpen: poor jumpers whose last chase defeat was heavy", "family": "shock", "operator": "sharpen", "question_id": null, "new_question": 1, "parent_id": "S2-chase-completed-normal-habitual-poor-jumper", "reasoning": { "observation_ids": [ "O-1a861319" ], "question": "Is the lift largest where the beaten margin most overstates the horse's weakness?", "mechanism": "A heavy beating by a habitual poor jumper is partly lengths lost at fences, not lack of pace. The mechanism says the misleading form, and so the mispricing, should be largest when the margin is big.", "market_miss": "Punters and the odds read last_beaten_lengths directly. The jumping cost behind those lengths is not visible in the form figures.", "prediction": { "direction": "positive", "size": "A/E 1.15 to 1.30 on 300+ bets", "falsified_if": "A/E at or below the parent's 1.14, or 1.00 or less, on 300+ bets." }, "rule_sketch": "code = 'Chase' AND finished = 1 AND s BETWEEN -0.75 AND 0.75 AND e <= -0.3104 AND last_beaten_lengths >= 10" }, "confounders": [ "long prices and the favourite-longshot bias", "class of the last race", "ground" ], "expected_survival": 0.25 } ], "findings": [ { "statement": "The habitual-poor-jumper chase-completer rule was near flat in discovery (1.031 on 467) and stronger on the holdout (1.141 on 1077, p 0.060), still far short of the false-discovery bar. It is a lead for forward tracking, not an edge.", "kind": "method", "observation_ids": [ "O-1a861319" ] }, { "statement": "The holdout lift is uneven by country: IRE 1.366 against GB 1.107. IRE shock data only starts in August 2024, so the IRE part rests on a shorter window and should be checked before anyone trusts it.", "kind": "data", "observation_ids": [ "O-1a861319" ] } ] }
Timeline
Job 2107 gave up: OperationalError: no such column: code Traceback (most recent call last): File "/app/lab/src/gallops/orchestrator/loop
· engine:compute-1
compute-1 took job 2107 (forward_check, attempt 5)
· compute-1
Job 2107 will retry: OperationalError: no such column: code Traceback (most recent call last): File "/app/lab/src/gallops/orchestrator/loop
· engine:compute-1
compute-1 took job 2107 (forward_check, attempt 4)
· compute-1
Job 2107 will retry: OperationalError: no such column: code Traceback (most recent call last): File "/app/lab/src/gallops/orchestrator/loop
· engine:compute-1
compute-1 took job 2107 (forward_check, attempt 3)
· compute-1
Job 2107 will retry: OperationalError: no such column: code Traceback (most recent call last): File "/app/lab/src/gallops/orchestrator/loop
· engine:compute-1
compute-1 took job 2107 (forward_check, attempt 2)
· compute-1
Job 2107 will retry: OperationalError: no such column: code Traceback (most recent call last): File "/app/lab/src/gallops/orchestrator/loop
· engine:compute-1