Market-movement chart: the bookmaker line vs our model, per match

The odds history we have been capturing every 3h finally gets a face:
de-vigged DraftKings probabilities drift as solid lines toward
kickoff, with the model's numbers as dashed references — the honest
benchmark framing, right on the match page. Renders only when at least
two pre-kickoff lines exist. EN/DE copy included.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-06-12 00:53:42 +02:00
parent cbc5ff0468
commit ec185b5918
5 changed files with 110 additions and 1 deletions
+2
View File
@@ -86,6 +86,8 @@ export const de: Dict = {
},
timeline: "Spielverlauf",
momentum: "So schwankte die Siegwahrscheinlichkeit",
oddsMovement: "Marktbewegung vs. Modell",
oddsMovementNote: "Durchgezogene Linien: die Buchmacherquoten ohne Marge, im Verlauf bis zum Anstoß. Gestrichelt: die Wahrscheinlichkeiten unseres Modells. Der Markt ist nur Vergleichsmaßstab — das Modell sieht ihn nie.",
preMatchModel: "Modell vor Anstoß",
modelExpectation: "Modell-Prognose",
expectedGoalsLine: "Erwartete Tore (xG): {home} {away} · Modell-Wahrscheinlichkeiten, keine Wettempfehlung",
+2
View File
@@ -85,6 +85,8 @@ export const en = {
},
timeline: "Timeline",
momentum: "How the win probability swung",
oddsMovement: "Market movement vs the model",
oddsMovementNote: "Solid lines: the bookmaker's odds with the margin removed, drifting toward kickoff. Dashed lines: our model's probabilities. The market is a benchmark — the model never sees it.",
preMatchModel: "Pre-match model",
modelExpectation: "Model expectation",
expectedGoalsLine: "Expected goals: {home} {away} · model probabilities, not betting advice",
+10
View File
@@ -100,6 +100,16 @@ export interface MatchPrediction {
topScore: { home: number; away: number; p: number };
}
/** One captured bookmaker line — history for the market-movement chart. */
export interface OddsPoint {
fixture_num: number;
provider: string;
captured_at: number;
home_ml: number | null;
draw_ml: number | null;
away_ml: number | null;
}
/** A point on the championship-odds-over-time chart. */
export interface OddsHistoryPoint {
t: string;