Hypotheses · shock · H-e586c4e6
Rival: the lift belongs to every chase completer that ran to expectation, not to poor jumpers
Part of the thread “S2: chase completed normal habitual poor jumper” 4 hypotheses
- Proposed
- Designed
- Discovery
- Promising
- Falsification
- Frozen
- Vault
- Provisional
- Shadow
- Validated
- Live
- Source
- Investigator agent, v1
- Made by
- rival-explanation
- Created
- 17 Oct, 03:48
- Tests logged
- 0
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
- S2-chase-completed-normal-habitual-poor-jumper (S2: chase completed normal habitual poor jumper) pointed the predicted way (positive) on the sealed holdout but too weakly to prove it: A/E 1.141 on 1077 bets (p 0.060, false-discovery threshold 0.0034); tracked forward in SHADOW. O-1a861319
- AskedIs 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? testing
- MechanismHorses 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.
- Why the market misses itIf 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.
- Predictedpositive, A/E 1.08 to 1.12 on 4000+ bets if the rival holds
- Falsified ifThe 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 - question idQ-1b7569b6
- operator
Mechanism and rationale
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.
The rule
code = 'Chase' AND finished = 1 AND s BETWEEN -0.75 AND 0.75 AND e > -0.3104
Reads: code, finished, s, e
Pre-registration
- Spec hash (sha256 of the canonical pre-spec)
- 41473db606e3e1f030b27017fc5d6261052a8f7bfc1255681f4dbe6cd7b2c77d
- Frozen
- not frozen
- The definition can still change.
- Confounders
- Price band mix: the complement may hold more short-priced, well-exposed horses than the poor-jumper subset, and A/E behaves differently by price band
- IRE share: IRE shock data starts only in August 2024, and the holdout lift was IRE-heavy (1.366 against GB 1.107)
- Field size: chase field sizes differ by region and class, which changes baseline A/E
- Race-level effect: if same-race rivals also beat their prices, the lift belongs to the race type, not the runner
- e is the expected Jump Index from earlier runs, so it correlates with experience and chase_runs. A split on e may partly be a split on how exposed the horse is
- Window: the s/e columns start in Oct 2023 (GB), so every comparison sits within a short span of seasons
- Control
{ "description": "Primary contrast is the poor-jumper subset of the same base pool (e <= -0.3104), measured over the same window and regions. The rival holds if the complement here scores close to that subset (both near 1.08 to 1.14). Separately, the lab's same-race control (other runners in the same races) should be near 1.00. If those race-mates also show about 1.08 or more, the lift is a property of the races (chase type, field make-up), not of horses running to expectation.", "rule": "code = 'Chase' AND finished = 1 AND s BETWEEN -0.75 AND 0.75 AND e <= -0.3104" }
Discovery result
Not measured yet.
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 · 30s · 17 Oct, 03:48
Output (schema-checked)
{ "rule": "code = 'Chase' AND finished = 1 AND s BETWEEN -0.75 AND 0.75 AND e > -0.3104", "refinements": [ { "label": "GB only (IRE shock data starts Aug 2024 and drove the uneven holdout lift)", "rule": "code = 'Chase' AND finished = 1 AND s BETWEEN -0.75 AND 0.75 AND e > -0.3104 AND region = 'GB'" }, { "label": "16/1 or shorter (strips the price-band mix confounder; long-price noise dominates A/E)", "rule": "code = 'Chase' AND finished = 1 AND s BETWEEN -0.75 AND 0.75 AND e > -0.3104 AND sp_decimal <= 17" } ], "control": { "description": "Primary contrast is the poor-jumper subset of the same base pool (e <= -0.3104), measured over the same window and regions. The rival holds if the complement here scores close to that subset (both near 1.08 to 1.14). Separately, the lab's same-race control (other runners in the same races) should be near 1.00. If those race-mates also show about 1.08 or more, the lift is a property of the races (chase type, field make-up), not of horses running to expectation.", "rule": "code = 'Chase' AND finished = 1 AND s BETWEEN -0.75 AND 0.75 AND e <= -0.3104" }, "pass_criteria": { "min_bets": 1000, "min_ae": 1.05, "max_p": 0.05 }, "forward_bar": { "min_bets": 200, "min_ae": 1, "max_p": 0.2 }, "confounders": [ "Price band mix: the complement may hold more short-priced, well-exposed horses than the poor-jumper subset, and A/E behaves differently by price band", "IRE share: IRE shock data starts only in August 2024, and the holdout lift was IRE-heavy (1.366 against GB 1.107)", "Field size: chase field sizes differ by region and class, which changes baseline A/E", "Race-level effect: if same-race rivals also beat their prices, the lift belongs to the race type, not the runner", "e is the expected Jump Index from earlier runs, so it correlates with experience and chase_runs. A split on e may partly be a split on how exposed the horse is", "Window: the s/e columns start in Oct 2023 (GB), so every comparison sits within a short span of seasons" ], "mechanism": "Chase completers whose last jumping performance came in within ±0.75 s.d. of expectation give the form book no signal to react to. If the market under-bets such horses for being dull and unremarkable, the lift seen in the habitual-poor-jumper subset (e <= -0.31, holdout A/E 1.14 on 1077) is a property of the whole base pool. On this reading the jumping-expectation cut adds nothing, and the complement (e > -0.3104) should show a similar lift.", "market_miss": "Bettors and pricing models react to surprises such as falls, big wins and heavy defeats. A horse that ran exactly to its expected level gives them nothing to update on, so it may drift in the market by neglect. If the lift is real, it comes from that inattention to ordinary form, not from anything to do with jumping.", "prediction": { "direction": "positive", "size": "A/E 1.08 to 1.12 on 4000+ bets if the rival holds", "falsified_if": "Falsified if the complement scores 1.03 or less while the poor-jumper subset (control rule) stays at 1.10 or more over the same window. That would leave e as the carrier. If both pools are at 1.03 or less, neither the rival nor the poor-jumper lead is supported." }, "notes": "I kept the rule sketch unchanged. It uses only pre-off shock columns, and it is the exact complement of the S2 poor-jumper rule within the same base pool, so the two can be compared directly. Rows with a NULL e are excluded by the predicate, as they are in S2. min_bets is raised to 1000 because the pool is predicted to be over 4000. A result built on fewer bets would point to a filtering or data-coverage problem, not an underpowered test. The forward bar is raised to 200 bets for the same reason: this is a large pool. The refinements address only the two confounders flagged in the findings (the IRE window and price mix)." }
Timeline
Job 3194 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 3194 (evaluate, attempt 5)
· compute-1
Job 3194 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 3194 (evaluate, attempt 4)
· compute-1
Job 3194 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 3194 (evaluate, attempt 3)
· compute-1
Job 3194 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 3194 (evaluate, attempt 2)
· compute-1
Job 3194 will retry: OperationalError: no such column: code Traceback (most recent call last): File "/app/lab/src/gallops/orchestrator/loop
· engine:compute-1