Research paper
How the closing reference moves
Foresight by checkpoint, movement half-life, pregame absorption, and overreaction by bucket -- measured, not explained
Abstract
This paper measures four properties of the devigged closing price, the reference forecast used across the site, without attributing any of the movement to a cause. First, a market foresight premium (MFP) series shows how much resolving power the reference carries over a scoreboard-only model at successive in-game checkpoints, per bit of remaining uncertainty: reference skill is positive at all ten MLB checkpoints, model skill is negative at five of them, and MFP reads 0.051 at checkpoint 1 (n=3,589) and 0.0159 at checkpoint 9 (n=1,110), its lowest reading. That series was rebuilt on 2026-09-17 from the segment-clean corpus, and revision 1's climb to 0.5208 is withdrawn. Second, a half-life estimate shows how many hours before start half of a sport's measured pregame line motion has occurred: 2.75 hours for international soccer, 3.67 for MLB, 4.76 for NBA, with tennis and WNBA censored at the coarsest measured boundary (">6.0"). Third, a bucketed breakdown of that same pregame motion shows where it concentrates in time, sport by sport. Fourth, a moved-to-price-versus-outcome test, bucketed by move size and rebuilt on 2026-09-16 from the segment-clean tick corpus, shows the moved-to price sitting 0.03 to 0.0642 above the eventual outcome rate in MLB (n=555 to 19,044) and 0.2671 to 0.3184 below it in international soccer (n=11 to 3,564); revision 1 of that table, computed on the joined corpus, read 0.0518 to 0.0801 and -0.1945 to -0.3648 on roughly three times the rows. The four instruments do not share one observation window.
1 Question
The devigged closing price is CourtVision's reference forecast, and before it closes it moves. This paper asks four measurement-only questions about that movement: how much resolving power the reference carries over a scoreboard-only model at each in-game checkpoint; how many hours before start a sport's pregame price finishes half its measured motion; where in time that motion concentrates; and how a just-moved-to price compares with the outcome eventually realized, bucketed by move size.
Each measurement below comes from one artifact, already published as a module on the analytics site. This paper restates their per-checkpoint, per-sport and per-bucket numbers in one place, with the denominators attached, and repeats what each artifact's own novelty note says about the instrument.
2 Data and definitions
Four artifacts back this paper, and each carries its own observation window or none at all; they are not pooled. novel_market_foresight_premium.json holds a market foresight premium (MFP) series at successive in-game checkpoints for two sports: ten MLB innings (checkpoint n from 46 to 3,589) and nineteen international-soccer minute marks in 5-minute steps (checkpoint n from 33 to 402). MFP compares the reference's resolving power and a scoreboard-only model's, each relative to a naive baseline, and divides the gap by the reference's remaining entropy in bits (floored at 0.15 bits). It is composed from info_arrival_curve.json and market_convergence.json and publishes an as_of of 2026-09-17 but no observation window. Both inputs are revision 2 on the segment-clean corpus -- info_arrival_curve.json rebuilt 2026-09-16, market_convergence.json 2026-09-17 -- so the series no longer mixes revisions.
novel_line_half_life.json holds one half-life estimate per sport -- the hours before start by which half of that sport's total measured pregame line motion has occurred -- for the five sports that cleared a 20-pregame-move-pair floor. The estimate is built from four coarse minutes-to-start buckets (6h+, 3-6h, 1-3h, 0-1h) and linear interpolation to the 50 percent point. It reads a scraped line-history feed dated 2026-07-25 and publishes a per-sport window rather than one shared span, each ending 2026-07-17: 30 days for MLB and NBA, 29 for international soccer, 15 for tennis and 14 for WNBA, one file per day.
micro_absorption.json holds the same underlying per-series consecutive-snapshot devigged-probability movement, broken into the same four minutes-to-start buckets, with n_series_used, n_pregame_snapshots, n_move_pairs, and a median snapshot interval reported per sport. It is the direct source for the half-life artifact's bucket totals, is dated 2026-07-25, and carries the same per-sport windows, so only these two artifacts share a window.
market_overreaction.json holds, for MLB and international soccer only, five move-size buckets (0-1pt, 1-3pt, 3-6pt, 6-10pt, 10pt+) each carrying n, the price the market moved to (moved_to_price), the outcome rate eventually realized (outcome_rate), and their difference (moved_to_minus_outcome). It was rebuilt on 2026-09-16 from the segmented in-game corpora, which it now names alongside an as_of, where the withdrawn revision published neither; it still publishes no observation window, so its rows cannot be placed on the half-life artifact's calendar.
3 Method
This paper restates published numbers; it computes nothing beyond the same-artifact difference already labeled moved_to_minus_outcome in market_overreaction.json. The defining expressions of the four instruments, as documented in their own artifacts, are:
MFP(t) = ((naive-market)/naive - (naive-model)/naive) / max(entropy_market_bits, 0.15)
G(h) = cumulative absolute movement from far-to-near / total absolute movement; half_life = h where G(h) = 0.50 (linearly interpolated)
moved_to_minus_outcome = moved_to_price - outcome_rate, within one move-size bucket
The half-life and absorption bucket totals are built from summed ABSOLUTE per-snapshot moves, not net price travel: a price that moves up and back down contributes to the total the same as a price that moves once and stays. This is stated in the half-life artifact's own declared_confounds and is carried through to every half-life and absorption number in this paper.
4 Results
Checkpoint foresight, MLB. Table 1 lists all ten MLB checkpoints, rebuilt on the segment-clean corpus. Reference skill is positive at all ten, so the reference beats the naive baseline throughout; model skill is negative at checkpoints 1 to 4 and at 10 but positive from the 5th inning through the 9th, where the scoreboard-only model catches up. MFP -- the reference's resolving-power gap over the model, normalized by remaining reference entropy -- no longer rises through the game. It reads 0.051 at checkpoint 1, sits between 0.0831 and 0.181 from the 2nd inning through the 8th, and collapses to 0.0159 at checkpoint 9 as the two forecasters converge. The 0.411 at checkpoint 10 (extra innings, n=46) is the series maximum and a thin tail, not a tenth step. Revision 1's climb to a peak of 0.5208 depended on the joined corpus and is withdrawn.
| Checkpoint (inning) | n | Market skill | Model skill | Market entropy (bits) | MFP |
|---|---|---|---|---|---|
| 1 | 3,589 | 0.0333 | -0.0154 | 0.9553 | 0.051 |
| 2 | 2,803 | 0.0805 | -0.0805 | 0.8971 | 0.1794 |
| 3 | 3,097 | 0.074 | -0.0406 | 0.7993 | 0.1434 |
| 4 | 3,034 | 0.0386 | -0.0951 | 0.7386 | 0.181 |
| 5 | 3,139 | 0.1172 | 0.035 | 0.6583 | 0.1249 |
| 6 | 3,579 | 0.1506 | 0.0648 | 0.6106 | 0.1404 |
| 7 | 3,447 | 0.2463 | 0.1612 | 0.5414 | 0.1571 |
| 8 | 2,833 | 0.3969 | 0.3574 | 0.4757 | 0.0831 |
| 9 | 1,110 | 0.5547 | 0.5474 | 0.4589 | 0.0159 |
| 10 | 46 | 0.2858 | -0.0631 | 0.8488 | 0.411 |
MLB checkpoints run 1 through 9 innings plus a checkpoint-10 extra-innings tail (n=46). Market skill is positive in all ten rows; model skill is negative in five and positive at checkpoints 5 through 9. International soccer runs 19 checkpoints from kickoff to the 90th minute, mean MFP 0.9225, mfp_last 1.4861; not tabulated here for space. Source: novel_market_foresight_premium.json results.mlb.checkpoints[].
Half-life of pregame line movement. Table 2 gives the hours-before-start point at which each sport's measured pregame motion is half complete. Where that crossing falls inside the open-ended 6h+ bucket, the artifact reports it as censored (label ">6.0", half_life_hours null) rather than guessing a value past the measured range.
| Sport | Half-life (hours before start) | Final-hour movement share | Move pairs (n) | Observation window |
|---|---|---|---|---|
| International soccer | 2.75 | 0.2610 | 164,072 | 2026-06-19 to 2026-07-17 (29 days, 29 files) |
| MLB | 3.67 | 0.1813 | 1,307,128 | 2026-06-18 to 2026-07-17 (30 days, 30 files) |
| NBA | 4.76 | 0.3247 | 182,054 | 2026-06-18 to 2026-07-17 (30 days, 30 files) |
| Tennis | >6.0 (censored) | 0.1070 | 809,986 | 2026-07-03 to 2026-07-17 (15 days, 15 files) |
| WNBA | >6.0 (censored) | 0.1176 | 333,540 | 2026-07-04 to 2026-07-17 (14 days, 14 files) |
KBO and NPB are excluded (0 pregame move pairs, below the 20-pair floor). Domestic soccer is excluded: all of its measured movement fell in the open-ended 6h+ bucket with mean_abs_move 0.0, which the source artifact flags as a timestamp-coverage artifact, not a finding about that sport's line. Source: novel_line_half_life.json results[], excluded[].
Absorption of pregame movement by time bucket. Table 3 gives the same underlying per-sport series and snapshot counts, split into the four minutes-to-start buckets used to build the half-life estimate above. NBA's final-hour bucket carries the largest single-bucket mean absolute move of any sport-bucket pair in this table (0.00117), about seventeen times its own 6h+-bucket value (0.00007); every other sport's final-hour value is smaller relative to its own early-window value.
| Sport | Series used (n) | Move pairs (n) | Median snapshot interval (min) | 0-1h mean abs move | 6h+ mean abs move | Final-hour movement share |
|---|---|---|---|---|---|---|
| MLB | 5,794 | 1,307,128 | 1.083 | 0.00019 | 0.00009 | 0.1813 |
| NBA | 160 | 182,054 | 1.117 | 0.00117 | 0.00007 | 0.3247 |
| International soccer | 494 | 164,072 | 1.067 | 0.00072 | 0.00018 | 0.2610 |
| Tennis | 2,510 | 809,986 | 1.117 | 0.00019 | 0.00008 | 0.1070 |
| WNBA | 920 | 333,540 | 1.117 | 0.00039 | 0.00025 | 0.1176 |
KBO and NPB had 0 pregame move pairs (below the 20-pair floor) and are excluded. Domestic soccer's move pairs all fell in the 6h+ bucket with mean_abs_move 0.0 (a timestamp-coverage artifact) and is excluded from this table. Source: micro_absorption.json sports.<sport>.

Moved-to price versus realized outcome rate, by move-size bucket and sport (MLB, international soccer).
| Sport | Move bucket | n | Moved-to price | Outcome rate | Moved-to minus outcome |
|---|---|---|---|---|---|
| MLB | 0-1pt | 19,044 | 0.5238 | 0.4936 | 0.0302 |
| MLB | 1-3pt | 4,763 | 0.5251 | 0.4951 | 0.0300 |
| MLB | 3-6pt | 2,029 | 0.5206 | 0.4564 | 0.0642 |
| MLB | 6-10pt | 782 | 0.5179 | 0.4706 | 0.0473 |
| MLB | 10pt+ | 555 | 0.4999 | 0.4631 | 0.0368 |
| International soccer | 0-1pt | 3,564 | 0.4208 | 0.7045 | -0.2837 |
| International soccer | 1-3pt | 541 | 0.3456 | 0.6128 | -0.2671 |
| International soccer | 3-6pt | 65 | 0.2950 | 0.6077 | -0.3127 |
| International soccer | 6-10pt | 11 | 0.2632 | 0.5455 | -0.2823 |
| International soccer | 10pt+ | 57 | 0.4360 | 0.7544 | -0.3184 |
Revision 2, as_of 2026-09-16, on the segment-clean corpus. moved_to_minus_outcome is moved_to_price minus outcome_rate within the same bucket, a same-artifact difference of two cited numbers. The international-soccer 6-10pt bucket carries n=11. Source: market_overreaction.json buckets.<sport>.<bucket>.
5 Robustness and what would falsify this
- The market foresight premium's own novelty note grades it INCREMENTAL: the paired model/market/naive instrument is a published Kalshi/NBA method, and only the per-bit normalization is claimed as unpublished (novel_market_foresight_premium.json prior_art_verdict, prior_art_citation).
- The half-life packaging is graded NOVEL_PACKAGING, not a new phenomenon: only the single per-sport half-life constant is fresh packaging (novel_line_half_life.json prior_art_verdict, prior_art_citation).
- The overreaction bucket test is graded INCREMENTAL against a published cross-sport study and a published in-play soccer study; the contribution is applying the same instrument at consecutive-row grain to the corpora held here (market_overreaction.json novelty.verdict, novelty.closest_prior_work).
- Half-life and absorption totals sum ABSOLUTE per-snapshot moves, so they measure price churn, not net travel; a back-and-forth sequence inflates the same total one large repricing would (novel_line_half_life.json declared_confounds).
- Tennis and WNBA are censored, not zero: their 50-percent crossing falls past the 6-hour boundary of the coarsest bucket, so ">6.0" is the most specific statement available (novel_line_half_life.json results[].half_life_label, crossing_in_open_bucket).
- The MLB checkpoint-10 foresight row (extra innings) carries n=46, nearly two orders of magnitude below the largest checkpoint (n=3,589); its MFP of 0.411, the highest in the series, is a thin-sample estimate (novel_market_foresight_premium.json results.mlb.checkpoints[]).
- Model skill is positive at checkpoints 5 through 9, so MFP's late fall is the model closing on the reference, not the reference weakening (info_arrival_curve.json checkpoints.mlb).
- The four instruments do not share an observation window: the half-life and absorption artifacts read one scraped feed with a per-sport span (14 to 30 days, each ending 2026-07-17), while the foresight-premium and overreaction artifacts read the in-game tick corpora and publish no window at all (novel_line_half_life.json results[].observation_window; micro_absorption.json observation_window).
- Both in-game tables are revision 2, rebuilt a day apart (overreaction 2026-09-16, foresight premium 2026-09-17), and the rebuild moved every MFP row: info_arrival_curve.json now reports 1,110 MLB ticks at the 9th-inning checkpoint where the withdrawn revision reported 2,282.
6 Limitations
- The market foresight premium mixes real information the market prices with plain misspecification of the single state-only model used as the model_skill baseline; an MFP above zero shows only that this particular model trails the reference at that checkpoint.
- The half-life and absorption instruments cover one scraped window per sport (14 to 30 days, each ending 2026-07-17), not a full season; neither the foresight-premium nor the overreaction artifact publishes an observation window.
- The overreaction bucket test compares a moved-to price against a realized outcome rate at consecutive-row grain, not at independent game-level grain, so bucket n overstates the number of independent observations behind each rate.
- None of the four artifacts records what caused a given price move, only that a move of a given size happened at a given time; nothing here should be read as a claim about why prices move.
- The international-soccer 6-10pt overreaction bucket (n=11) and the MLB checkpoint-10 foresight row (n=46) are reported for completeness, not as reliable standalone estimates.
- Both in-game tables are revision 2 on the segment-clean corpus and neither is under review, but they were rebuilt a day apart and still publish no observation window.
7 How to read this on the site
The calibration inspector (inspector id calibration) carries the checkpoint-level model-market gap and entropy series behind the foresight-premium table above, published as the analyses market-convergence-by-checkpoint and market-disagreement-brier-by-bucket. The devigged-movement-by-time-to-close analysis restates the same per-series snapshot movement used to build the half-life and absorption tables here, at the same four minutes-to-close buckets; no finer checkpoint view of that movement is published.
The novel_market_foresight_premium, novel_line_half_life, micro_absorption, and market_overreaction modules publish the charts and the full per-sport, per-checkpoint, and per-bucket arrays this paper's tables are drawn from, including what was left out for space (all 19 international-soccer checkpoints, and the kbo/npb/domestic-soccer exclusions noted in Tables 2 and 3). The in-game join-integrity finding, linked below, records which artifacts were rebuilt and when.
Evidence
- novel_market_foresight_premium.jsonas_of 2026-09-17Source path: /analytics/m/novel_market_foresight_premium/
Evidence field inventory (17 paths)
- as_of
- corpus
- results.mlb.mfp_mean
- results.mlb.checkpoints[].checkpoint
- results.mlb.checkpoints[].n
- results.mlb.checkpoints[].market_skill
- results.mlb.checkpoints[].model_skill
- results.mlb.checkpoints[].entropy_market_bits
- results.mlb.checkpoints[].mfp
- results.mlb.mfp_first
- results.mlb.mfp_last
- results.soccer_intl.mfp_first
- results.soccer_intl.mfp_last
- results.soccer_intl.mfp_mean
- entropy_floor_bits
- prior_art_verdict
- prior_art_citation
- info_arrival_curve.jsonas_of 2026-09-16Source path: /analytics/m/info_arrival_curve/
Evidence field inventory (3 paths)
- as_of
- corpus
- checkpoints.mlb["9"].n
- novel_line_half_life.jsonas_of 2026-07-25Source path: /analytics/m/novel_line_half_life/
Evidence field inventory (17 paths)
- results[].sport
- results[].half_life_hours
- results[].half_life_label
- results[].crossing_in_open_bucket
- results[].final_hour_movement_share
- results[].n_move_pairs
- results[].observation_window
- excluded[].sport
- excluded[].reason
- observation_window.start
- observation_window.end
- observation_window.days
- observation_window.files
- observation_window.note
- prior_art_verdict
- prior_art_citation
- declared_confounds
- micro_absorption.jsonas_of 2026-07-25Source path: /analytics/m/micro_absorption/
Evidence field inventory (10 paths)
- sports[].n_series_used
- sports[].n_pregame_snapshots
- sports[].n_move_pairs
- sports[].interval_minutes.median
- sports[].move_by_bucket["0-1h"].mean_abs_move
- sports[].move_by_bucket["6h+"].mean_abs_move
- sports[].final_hour_movement_share
- sports.kbo.status
- sports.npb.status
- sports.soccer.move_by_bucket["6h+"].mean_abs_move
- market_overreaction.jsonas_of 2026-09-16Source path: /analytics/m/market_overreaction/
Evidence field inventory (12 paths)
- as_of
- corpus
- buckets.mlb[].n
- buckets.mlb[].moved_to_price
- buckets.mlb[].outcome_rate
- buckets.mlb[].moved_to_minus_outcome
- buckets.soccer_intl[].n
- buckets.soccer_intl[].moved_to_price
- buckets.soccer_intl[].outcome_rate
- buckets.soccer_intl[].moved_to_minus_outcome
- novelty.verdict
- novelty.closest_prior_work