Skip to main content

Odds Generation — game · set + set · set (tennis)

Enter the match's Game Handicap and Game Total in Malay and its Moneyline in decimal — margins still embedded. Tennis scores are not counts: they are a nested race — point → game (win by 2 from deuce) → set (first to 6 by 2, tiebreak at 6-6) → match — so totals come out bimodal (straight sets vs a decider) with a parity comb (a set never totals 11 games; a 7-6 counts 13). The engine (ADR-030):

  1. strips each bookmaker margin (Power method — every book here is two-way; tennis has no draw);
  2. pins the serve sum pA + pB to the tour/surface prior (ATP ≈ 1.29, WTA ≈ 1.14) and bisects the serve difference against the Game Handicap — the match quotes leave the sum on a near-flat ridge, so it is a prior, not a fit;
  3. consumes the Game Total with whichever knob can reach it: τ, a match-level form mixture (matches shorten), or extra serve sum (matches lengthen) — the difference re-solves at every trial;
  4. never fits the Moneyline: on the ridge it is the cross-anchor consistency readout (Δ ML) — a large value means the book's ML disagrees with its own game lines at this prior, a risk signal;
  5. prices both scopes off the one solved distribution — set · set (Moneyline, Set Handicap, Set Total) and game · set (match game lines plus every per-set sheet, conditional on the set being played).
Stage 1 — the nested race: point → game (win by 2 from deuce) → set (first to 6 by 2, tiebreak at 6-6) → match (best of 3); every level is a race, no level is a count
Stage 1 — a race nested three levels deep: point → game (win by 2 from deuce) → set (first to 6 by 2, tiebreak at 6-6) → match — every level a race, no level a count

Each stage re-solves the same fair targets, so the stage switcher is a true before/after — flip iid @ prior / Length and watch the totals hump move while the handicap holds. Best-of-3 and best-of-5 are format configs (all four slams play a 10-point decider tiebreak since 2022); switching loads that format's seed quotes.

Game Handicap (Malay)
Game Total (Malay)
Moneyline (Decimal) — consistency readout
Serve-sum prior · margins

/ steps a field, Shift steps bigger; Malay pairs step their partner the opposite way. The Moneyline is never fitted — it is the cross-anchor consistency readout (Δ ML in the diagnostics); clear it to skip the readout.

Valid inputs: Malay in [−1, +1] non-zero with margin, decimals above 1, serve-sum prior in (1.04, 1.54). Quotes are whole-match; per-set sheets derive from the same solve, conditional on the set being played.

p_A 0.6650p_B 0.6250τ 0.0300P(set 3) 41.5%TB 42.8%round-trip Δp 2.0e-7 / 2.6e-6Δ ML 0.03%
Match distribution
p_A 0.6650p_B 0.6250Σ 1.290τ 0.0300TB 42.8%E[games] 24.4
Final sets score — P(home s, away s) ×100
A=0A=1A=2
H=017.6
H=116.8
H=240.924.7
Games margin pmf — P(home games − away games) ×100
-10-9-8-7-6-5-4-3-2-10+1+2+3+4+5+6+7+8+9+10+11
0.10.30.71.93.15.26.76.24.83.53.84.16.610.012.811.48.45.92.71.40.40.1
Games total pmf ×100
131415161718192021222324252627282930313233343536373839
0.10.51.63.05.86.98.37.95.38.36.21.13.44.63.13.94.24.35.04.93.12.33.01.80.30.60.5
two humps — straight sets vs a decider — with a parity comb: no set totals 11 games, a 7-6 counts 13
home awayone distribution, both scopes: the sets table is set·set, the pmfs are game·set
8 in scope
a match always has a winner — no tie leg
OutcomeFairDecPricedMalay
Home65.6%1.5241.491+0.49
Away34.4%2.9092.752-0.57
How these numbers are computed
1 · Strip the bookmaker margins (Power method — every book here is two-way)
Game Handicap -2.50 → P(home covers)
HomeAway
Malay quote+0.82-0.95
Decimal dd1.82002.0526
Implied q=1/dq = 1/d0.54950.4872
Fair p=q1/xp = q^{1/x}0.53170.4683
Fair decimal 1/p1/p1.88082.1353
overround Q = 1.0366 → solve q11/x+q21/x=1q_1^{1/x} + q_2^{1/x} = 1 → x = 0.9480fair P(home covers) = 53.17%
Game Total 22.50 → P(over)
OverUnder
Malay quote+0.85-0.98
Decimal dd1.85002.0204
Implied q=1/dq = 1/d0.54050.4949
Fair p=q1/xp = q^{1/x}0.52320.4768
Fair decimal 1/p1/p1.91142.0972
overround Q = 1.0355 → solve q11/x+q21/x=1q_1^{1/x} + q_2^{1/x} = 1 → x = 0.9496fair P(over) = 52.32%
Moneyline — stripped for the CONSISTENCY READOUT, never fitted
HomeAway
Decimal quote1.502.79
Decimal dd1.50002.7900
Implied q=1/dq = 1/d0.66670.3584
Fair p=q1/xp = q^{1/x}0.65600.3440
Fair decimal 1/p1/p1.52452.9067
overround Q = 1.0251 → solve q11/x+q21/x=1q_1^{1/x} + q_2^{1/x} = 1 → x = 0.9616fair P(home ML) = 65.60%

Standalone strips: Margin — two-way (Power).

2 · The nested race — point → game → set → match

Tennis games are not counts: every level is a race with absorbing barriers. A server holding with point probability pp wins the game with the closed form

Phold(p)=p4 ⁣(1+4q+10q2)+20p3q3p212pqq=1pP_{\text{hold}}(p) = p^4\!\left(1 + 4q + 10q^2\right) + 20p^3q^3\,\frac{p^2}{1-2pq} \qquad q = 1-p

(deuce is a geometric race; this run: hold(A) = 0.853, hold(B) = 0.785). A tiny DP walks the tiebreak over the real serve rotation (F, S, S, F, F, …; the 6-6 deuce closes as α/(α+β)\alpha/(\alpha+\beta)), the set lattice alternates servers by game — a set totals {6..10, 12, 13} games, never 11, and a 7-6 counts 13 — and the match folds sets carrying the games margin and total pmfs, the sets joint and every per-set grid. The pre-match serve coin toss is averaged. Everything is exact DP; the engine was validated against a 200k-run Monte Carlo.

3 · The ridge — why the sum is a prior and the Moneyline is a readout

The handicap pins the serve difference, but (HDP, OU, ML) leave the serve sum and the form shock τ on a near-flat ridge: a weak-serve iid fit can match all three quotes yet misprice every tiebreak-sensitive tail. So the sum comes from the tour/surface prior (1.29 here; ATP ≈ 1.29, WTA ≈ 1.14 — per-set quotes identify it per match, ADR-030 O2), and the totals anchor is consumed by τ\tau — a 3-node mixture (pA+zτ,  pBzτ), z{3,0,+3}(p_A + z\tau,\; p_B - z\tau),\ z \in \{-\sqrt3, 0, +\sqrt3\} that preserves the sum but compounds over sets, fixing the iid model's known favorite overconfidence — or by extra sum when the market runs longer than the iid baseline.

StageΣ = p_A + p_Bp_Ap_BτknobΔ coverΔ totalΔ ML (readout)
iid @ prior1.29000.66420.62580.00001.4e-76.4e-22.75%
Length (τ)1.29000.66500.62500.0300tau2.0e-72.6e-60.03%

The ML is deliberately not a fitting target: with the prior right it lands on its own (ΔML ≈ 0 on the seed quotes); a large ΔML means the book's ML disagrees with its own game lines at this prior — a risk signal, not a solver failure.

4 · Periods — sets are random, so per-set prices are conditional

Unlike basketball quarters, set 3 exists only with probability 41.5% here (set 3 with 41.5%). Per-set markets are void if the set is not played, so their fair prices condition on it — and under the τ mixture the conditioning re-weights the form nodes (deciders come disproportionately from the close-form nodes). Set 1 is unconditional. The same fold also yields the set·set scope for free: the sets joint prices the ML, set handicap and set totals with zero extra parameters.

5 · Read “Moneyline” · margins · notes

Full match: P(home wins the set race) off the sets joint — no tie leg. Per set: the set winner, conditional on the set being played (void otherwise). Fair groups are re-margined exactly as in goal-regular (Power ladder two-way, Shin multi-way).

targets  tH = powerStrip(HDP pair)   tO = powerStrip(OU pair)   [ML stripped → readout only]

stage iid    : sum = PRIOR(tour/surface)       bisect diff  until P(A covers | dist) = tH
stage length : model over > tO ? bisect τ ∈ [0, .06]   (form mixture — matches shorten)
                               : bisect sum upward      (more serve — matches lengthen)
               — the difference re-solves inside every trial (same-targets discipline)

dist: hold(p) closed form → tiebreak DP (serve rotation) → set lattice (alternating serve;
      totals ∈ {6..10,12,13}, 7-6 = 13 games) → match fold over (sets, first server)
scopes: ONE dist prices set·set (ML, set HDP/OU) and game·set (match + per-set, conditional)

Engine + invariants: docs/src/lib/odds/tennis.ts, __tests__/tennis.test.ts; decision record ADR-030 (extends ADR-029).