Skip to content
← Research papers

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.

Market foresight premium (MFP) by MLB checkpoint
Checkpoint (inning)nMarket skillModel skillMarket entropy (bits)MFP
13,5890.0333-0.01540.95530.051
22,8030.0805-0.08050.89710.1794
33,0970.074-0.04060.79930.1434
43,0340.0386-0.09510.73860.181
53,1390.11720.0350.65830.1249
63,5790.15060.06480.61060.1404
73,4470.24630.16120.54140.1571
82,8330.39690.35740.47570.0831
91,1100.55470.54740.45890.0159
10460.2858-0.06310.84880.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.

Half-life of pregame line movement, by sport
SportHalf-life (hours before start)Final-hour movement shareMove pairs (n)Observation window
International soccer2.750.2610164,0722026-06-19 to 2026-07-17 (29 days, 29 files)
MLB3.670.18131,307,1282026-06-18 to 2026-07-17 (30 days, 30 files)
NBA4.760.3247182,0542026-06-18 to 2026-07-17 (30 days, 30 files)
Tennis>6.0 (censored)0.1070809,9862026-07-03 to 2026-07-17 (15 days, 15 files)
WNBA>6.0 (censored)0.1176333,5402026-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.

Pregame movement by sport and minutes-to-start bucket
SportSeries used (n)Move pairs (n)Median snapshot interval (min)0-1h mean abs move6h+ mean abs moveFinal-hour movement share
MLB5,7941,307,1281.0830.000190.000090.1813
NBA160182,0541.1170.001170.000070.3247
International soccer494164,0721.0670.000720.000180.2610
Tennis2,510809,9861.1170.000190.000080.1070
WNBA920333,5401.1170.000390.000250.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>.

Market Overreaction
Market Overreaction chart
scripts/platformkit/analytics_showcase/out/market_overreaction.jsonSource as of 2026-09-16n not published

Moved-to price versus realized outcome rate, by move-size bucket and sport (MLB, international soccer).

Moved-to price versus outcome rate, by sport and move-size bucket
SportMove bucketnMoved-to priceOutcome rateMoved-to minus outcome
MLB0-1pt19,0440.52380.49360.0302
MLB1-3pt4,7630.52510.49510.0300
MLB3-6pt2,0290.52060.45640.0642
MLB6-10pt7820.51790.47060.0473
MLB10pt+5550.49990.46310.0368
International soccer0-1pt3,5640.42080.7045-0.2837
International soccer1-3pt5410.34560.6128-0.2671
International soccer3-6pt650.29500.6077-0.3127
International soccer6-10pt110.26320.5455-0.2823
International soccer10pt+570.43600.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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
Back to research papers