Odds Generation — soccer · goal · regular · DIBP
A comparison candidate to the default page. Steps 1–3 are identical — strip the margins, back-solve the goal rates (λₕ, λₐ) from the hard Handicap and Total anchors — and step 4 extends the default's common shock λ₃ into the diagonal-inflated bivariate Poisson (Karlis–Ntzoufras 2005):
J = (1 − θ) · BP(l₁, l₂, λ₃) + θ · D(ω)
The independent-Poisson grid gains a common-shock coupling λ₃ and a slug of diagonal probability θ·D(ω), where D(ω) is a geometric distribution over the draw cells (0-0, 1-1, 2-2, …) with a fixed decay ω you set — never fitted. The two fitted knobs are (λ₃, θ), and after every trial the engine re-solves (λₕ, λₐ) so the Handicap and Total still hold exactly.
The mechanism has sharp limits, and the walkthrough narrates them. Both knobs are
draw-directional and one-sided: θ injects diagonal mass head-on, while λ₃ reaches the
draw only sideways — the common shock cancels in the goal margin (X − Y = W₁ − W₂), so
λ₃ moves the 1X2 only by trading against the Total (a higher λ₃ forces a lower-scoring,
more draw-heavy match). Neither is a structural home:away lever the way the
φ/σ candidate's σ is: at the common ±0.50-class
Handicap the anchor already pins P(h > a) — the 1X2 home event — so the two knobs
collapse onto one direction and the fit defers to a θ-only draw
solve, a more fundamental rank collapse than the φ/σ candidate's. At a deeper line the home leg
frees up and Gauss–Newton engages λ₃ as well. And because the whole diagonal is one 1X2
outcome, ω is unidentifiable from the 1X2: move it and the fitted 1X2 holds while Correct
Score and Exact Total visibly reshape — the diagonal's shape is imposed by ω rather than
inherited from the baseline grid.
See also the sibling φ/σ-tilt candidate; the default page keeps the common shock but drops the diagonal inflation.
Each period — full match, 1st half, 2nd half — is its own inversion. Timing and cross-half markets (HT/FT, First Goal, …) are out of scope; see the Markets reference.
↑/↓ steps a field, Shift steps bigger; on a Malay pair the partner moves the opposite way. Handicap/Total boards show your line ±0.50 in quarter steps; team-total, 3-way and which-team lines are illustrative — probabilities are exact given λ.
Valid inputs: Malay in [−1, +1] and never 0, 1X2 decimals above 1, and each book must carry margin (implied probabilities summing over 1).
| A=0 | A=1 | A=2 | A=3 | A=4 | A=5+ | |
|---|---|---|---|---|---|---|
| H=0 | 6.90 | 7.35 | 3.91 | 1.39 | 0.37 | 0.10 |
| H=1 | 11.10 | 11.82 | 6.29 | 2.23 | 0.60 | 0.15 |
| H=2 | 8.93 | 9.51 | 5.06 | 1.80 | 0.48 | 0.12 |
| H=3 | 4.79 | 5.10 | 2.72 | 0.96 | 0.26 | 0.07 |
| H=4 | 1.93 | 2.05 | 1.09 | 0.39 | 0.10 | 0.03 |
| H=5+ | 0.83 | 0.89 | 0.47 | 0.17 | 0.04 | 0.01 |
| A=0 | A=1 | A=2 | A=3 | A=4 | A=5+ | |
|---|---|---|---|---|---|---|
| H=0 | 11.10 | 5.64 | 2.93 | 1.02 | 0.26 | 0.07 |
| H=1 | 9.66 | 12.05 | 5.23 | 1.82 | 0.47 | 0.12 |
| H=2 | 8.62 | 8.97 | 5.36 | 1.62 | 0.42 | 0.11 |
| H=3 | 5.12 | 5.33 | 2.77 | 1.21 | 0.25 | 0.06 |
| H=4 | 2.28 | 2.38 | 1.24 | 0.43 | 0.20 | 0.03 |
| H=5+ | 1.14 | 1.18 | 0.61 | 0.21 | 0.06 | 0.04 |
| HDP | H | A |
|---|---|---|
| -1.0 | -0.61 | +0.53 |
| -0.5/1 | -0.82 | +0.74 |
| -0.5 | +0.96 | +0.96 |
| -0/0.5 | +0.66 | -0.74 |
| 0.0 | +0.37 | -0.45 |
| Goal | Over | Under |
|---|---|---|
| 2.0 | +0.49 | -0.57 |
| 2/2.5 | +0.73 | -0.81 |
| 2.5 | +0.96 | +0.96 |
| 2.5/3 | -0.84 | +0.76 |
| 3.0 | -0.64 | +0.56 |
| Outcome | Odds |
|---|---|
| Home | 1.928 |
| Draw | 3.167 |
| Away | 4.641 |
How these numbers are computed
Each quote implies a probability summing past 1 per book (the margin); Power (two-way) and Shin (1X2, step 4) deflate them to the fair numbers the solver must reproduce.
| Home | Away | |
|---|---|---|
| Malay quote | +0.96 | +0.96 |
| Decimal | 1.9600 | 1.9600 |
| Fair | 0.5000 | 0.5000 |
| Fair decimal | 2.0000 | 2.0000 |
| Over | Under | |
|---|---|---|
| Malay quote | +0.95 | +0.95 |
| Decimal | 1.9500 | 1.9500 |
| Fair | 0.5000 | 0.5000 |
| Fair decimal | 2.0000 | 2.0000 |
| Home | Draw | Away | |
|---|---|---|---|
| Decimal quote | 1.8900 | 3.1300 | 4.7000 |
| Fair (Shin) | 0.5060 | 0.2995 | 0.1945 |
| Fair decimal | 1.9762 | 3.3389 | 5.1420 |
Try the strips standalone — Margin — two-way (Power) · Margin — multi-way (Shin): the same math on any quotes, with the bisection narrated.
Step 1 left two hard fair targets — Handicap and Total — for the scoring rates . The optional 1X2 is a soft shape target for λ₃ and θ in step 4, not a third hard rate constraint. Model each side’s goals as Poisson — — and independent. Independent Poissons add — — so the match total depends only on : the Total quote pins the match size on its own, before caring who scores (step 3’s job). Settling any line sorts that one total’s mass — point masses — into three buckets: win (over hits), mass ; lose, mass ; push (an exact tie, stake refunded), mass — so . A refund is a no-action bet, so the fair price conditions on the decided outcomes alone: . That makes size a one-dimensional root-find, laid out below in the order a solver runs it — target, search, then the evaluation every iteration repeats:
1 - exp(-x)*(1 + x + x^2/2) = 0.50000000A .5 line cannot push (), so this is the plain tail — the Poisson Calculator inverse-solves in one field.
Where the pasted expression comes from
Totals are whole numbers, so total carries mass . Each win tail runs on forever, so flip it to the complement — times the start of cut at the line (keep every term and , the whole distribution). For the 2.50 line:
Substitute (with the denominator is 1) into and write as exp(-x) — that is the pasted line, term for term; the calculator solves it for .
The evaluation the search repeats every iteration is that settlement rule under Poisson(λ). At the converged it reproduces the win mass , push mass , and the fair check back to the target — the figures a re-implementation should match:
(Additivity is exact only for the plain independent-Poisson grid, so this λ is the Poisson stage’s; step 4’s λ₃/θ diagonal inflation perturbs it, so that stage re-solves size and split jointly against the same hard targets — both recovered (l₁, l₂) pairs land in the per-stage table, step 4.)
The Handicap decides who scores them — and settling it needs the full scoreline distribution, the score grid: independence makes each cell a plain product of the two Poisson masses,
— exactly the grid the score-grid panel’s Poisson stage displays. Hold fixed and slide the home share (with ). Home covers ⟺ , an exact is a push — step 2’s one rule again, with the masses now read off the grid: and (½-weighted across a quarter line’s two components), fair cover probability — which rises with , so the same solver shape applies:
P(0, 2.674060-x)*Ptail(1, x) + P(1, 2.674060-x)*Ptail(2, x) + P(2, 2.674060-x)*Ptail(3, x) + P(3, 2.674060-x)*Ptail(4, x) + P(4, 2.674060-x)*Ptail(5, x) + P(5, 2.674060-x)*Ptail(6, x) = 0.50000000A .5 line cannot push (): each line is one away score — its Poisson mass times the home tail that covers it. Its search lands on — within of the grid solve above (why not exact: the away-corner fold, explained below).
Where the pasted expression comes from
Step 2's Total was a sum of the two goal counts (one rate, one Ptail); the Handicap turns on their difference — the goal margin (home goals minus away goals). A margin depends on both rates at once — its distribution is a Skellam, the difference of two Poissons — so no single Ptail in can express it. The trick is to condition on the away score : once is pinned, only the home goals still vary, and the cover collapses to one plain home tail (). Home covers (a half-line cannot push), so each away score contributes its Poisson mass times that tail:
Now substitute the search variable (with ) so the whole cover is one function of :
Truncating the away sum at N = 5 — the grid’s size — gives the pasted equation. At the solved the 6 terms evaluate and add straight up to the target ():
Why the pasted is only almost exactly the from the grid solve (): the grid is mass-complete, so almost all of the old truncation gap is gone — the home tail folds into the row, so for every away score the grid reproduces the closed-form home tail above exactly. The one remaining sliver is the away corner: the grid folds the mass onto the column as a cumulative bucket, while this closed-form paste keeps there as an exact point mass — and the margin mis-scores that folded corner. That corner is , and it shrinks with the away rate. The figure below shows the fold on the home side — its tail lands in the 5+ bucket, so no mass is lost; the away side folds the same way.
At the converged split the grid masses and the fair check are:
The recovered pair is the Poisson stage’s chips in the grid panel — and with it both quotes are reproduced exactly. That closes the fit, but not the model: the two quotes pinned just two numbers, size and split, while step 5 prices whole ladders off the grid’s shape — and that shape rests entirely on the independence assumption. The next step pulls that shape toward the 1X2 quote with the diagonal-inflated bivariate Poisson — θ (direct diagonal mass) and λ₃ (common shock, felt through the Total trade) — then re-solves so the quotes still hold (step 4).
The 1X2 is a three-way book, so Shin stripped it in step 1: with implied and overround , Shin’s insider fraction deflates each side to
(sqrt(x^2 + 4*(1-x)*0.529101^2/1.061355) - x)/(2*(1-x)) + (sqrt(x^2 + 4*(1-x)*0.319489^2/1.061355) - x)/(2*(1-x)) + (sqrt(x^2 + 4*(1-x)*0.212766^2/1.061355) - x)/(2*(1-x)) = 1The sum starts at when and falls monotonically, so the sign flip is unique — scan and the bisection lands back on . At the root each of the three terms is its fair leg — read straight off them.
giving the fair vector . It does not become three more hard equations: at a −0.50 Handicap, home cover is already exactly — the same event the 1X2 home leg prices — and two books rarely quote it identically, so pinning both would make them fight over one number. Instead the whole 1X2 is a soft target, and this page pursues it with a diagonal-inflated bivariate Poisson (Karlis–Ntzoufras 2005): mix the independent-Poisson grid with a common-shock coupling and a diagonal-inflation weight , then re-solve so the Handicap and Total still hold exactly on every trial.
is the common-shock construction with independent ; at it is exactly the independent-Poisson grid of steps 2–3. is a geometric distribution laid along the diagonal (the draw cells 0-0, 1-1, 2-2, …); ω sets how fast its mass decays, and so is a proper distribution and the mixture stays mass-complete.
Where each knob’s authority comes from. θ injects draw mass directly — a slug of diagonal probability, straight onto the equal-score cells. λ₃ has no direct line to the 1X2: , so the shock cancels in the goal margin — inside the BP part every handicap event and the raw win/draw/loss split depend on alone. λ₃ reaches the draw only indirectly, through the Total anchor: the expected total is , so raising λ₃ forces down to hold the Total — a lower-scoring match, which crowds probability toward the low, draw-heavy cells. So both knobs are draw-directional: θ pushes the draw up head-on, λ₃ pushes it up sideways.
This is the sharp contrast with the candidate’s pull (the φ/σ page). There σ is a genuine home:away lever — it tilts the win and loss halves against each other and owns the home direction structurally, dead only at the ±0.50 line, where the Handicap already pins . Here neither knob is a home:away lever — both move the draw — so the home leg is reachable only when the anchored Handicap event differs from . At a ±0.50-class line the two coincide, the home residual is frozen, and the two draw-directional knobs collapse onto one direction — the fit defers (θ only, λ₃ = 0). At a deeper line the home leg frees up and the two knobs regain independent traction (θ touches only the diagonal, λ₃ reshapes the low-score region through the Total trade), so Gauss–Newton fits both legs with λ₃ engaging — but as a byproduct of the differing anchor, not a dedicated tilt like σ. The displayed rankRatio quantifies which regime this quote is in. And where φ rescales the diagonal it inherits (multiplicative, , keeping each draw cell’s share of the diagonal), θ overwrites the diagonal toward ω’s geometric profile (additive) — visible below in the Correct-Score draw cells and the even-total Exact-Total buckets.
What the pull did:
| 1X2 leg | two-input grid | pulled | 1X2 target | Δ |
|---|---|---|---|---|
| Home | 0.5000 | 0.5000 | 0.5060 | -6.0e-3 |
| Draw | 0.2486 | 0.2995 | 0.2995 | +7.1e-10 |
| Away | 0.2514 | 0.2005 | 0.1945 | +6.0e-3 |
landed with at fixed — Δ home and Δ draw are the minimized residuals; Δ away follows from and stays a cross-check.
Where the additive leg-map comes from — and the ω unidentifiability
The mixture layers a diagonal-only distribution onto the BP grid, then renormalizes nothing (both components already sum to 1). Splitting into its three 1X2 blocks, the off-diagonal blocks get only the factor while the diagonal picks up the full (since ):
Contrast the φ/σ candidate, whose weighting is multiplicative and needs a renormalizer — , so φ rescales the diagonal cells it inherits, keeping their internal shape (2-2 : 3-3 fixed). The DIBP map instead replaces the diagonal’s shape: the surviving keeps the BP profile, but the injected imposes ω’s geometric decay — so which draw cells grow is set by ω, not inherited.
ω is unidentifiable from the 1X2. The total injected diagonal mass is whatever ω is — so the achieved draw (and hence home, away) is blind to ω. Move the ω field above and watch: the fitted 1X2 holds to solver tolerance while the Correct-Score draw cells and even-total Exact-Total buckets visibly reshape — a lower ω piles the mass onto 0-0, a higher ω spreads it up the diagonal to 1-1, 2-2, … That is the deliberate pedagogy of this candidate: the 1X2 pins the diagonal’s level, ω is a free hand on its shape.
Unroll the (λ₃, θ) search — rank check, then the draw bisection
The fit first probes both residual directions at λ₃ = θ = 0 and measures the shape Jacobian’s normalized rank, < 10⁻⁸ — the two knobs collapse onto one direction (both raise the draw, and this Handicap already fixes the home leg). λ₃ pins at 0 — the ridge prefers the pure diagonal-inflation explanation — and the one live knob, θ, is bisected onto the draw:
| i | lo | hi | θ | l₁ | l₂ | Δ home | Δ draw |
|---|---|---|---|---|---|---|---|
| 1 | 0.000000 | 0.900000 | 0.45000000 | 3.747603 | 0.613501 | -6.0e-3 | +1.9e-1 |
| 2 | 0.000000 | 0.450000 | 0.22500000 | 2.171726 | 0.980638 | -6.0e-3 | +7.7e-2 |
| 3 | 0.000000 | 0.225000 | 0.11250000 | 1.842218 | 1.032039 | -6.0e-3 | +1.4e-2 |
| 4 | 0.000000 | 0.112500 | 0.05625000 | 1.716638 | 1.050168 | -6.0e-3 | -1.8e-2 |
| 5 | 0.056250 | 0.112500 | 0.08437500 | 1.776899 | 1.041564 | -6.0e-3 | -1.6e-3 |
| 6 | 0.084375 | 0.112500 | 0.09843750 | 1.808883 | 1.036926 | -6.0e-3 | +6.5e-3 |
| 7 | 0.084375 | 0.098438 | 0.09140625 | 1.792728 | 1.039275 | -6.0e-3 | +2.4e-3 |
| 8 | 0.084375 | 0.091406 | 0.08789063 | 1.784773 | 1.040426 | -6.0e-3 | +4.0e-4 |
| 9 | 0.084375 | 0.087891 | 0.08613281 | 1.780826 | 1.040997 | -6.0e-3 | -6.1e-4 |
| 10 | 0.086133 | 0.087891 | 0.08701172 | 1.782797 | 1.040712 | -6.0e-3 | -1.0e-4 |
| 11 | 0.087012 | 0.087891 | 0.08745117 | 1.783784 | 1.040569 | -6.0e-3 | +1.5e-4 |
| 12 | 0.087012 | 0.087451 | 0.08723145 | 1.783291 | 1.040641 | -6.0e-3 | +2.4e-5 |
| 13 | 0.087012 | 0.087231 | 0.08712158 | 1.783044 | 1.040676 | -6.0e-3 | -3.9e-5 |
| 14 | 0.087122 | 0.087231 | 0.08717651 | 1.783167 | 1.040659 | -6.0e-3 | -7.6e-6 |
| 15 | 0.087177 | 0.087231 | 0.08720398 | 1.783229 | 1.040650 | -6.0e-3 | +8.2e-6 |
| 16 | 0.087177 | 0.087204 | 0.08719025 | 1.783198 | 1.040654 | -6.0e-3 | +2.6e-7 |
| 17 | 0.087177 | 0.087190 | 0.08718338 | 1.783183 | 1.040656 | -6.0e-3 | -3.7e-6 |
| 18 | 0.087183 | 0.087190 | 0.08718681 | 1.783190 | 1.040655 | -6.0e-3 | -1.7e-6 |
| 19 | 0.087187 | 0.087190 | 0.08718853 | 1.783194 | 1.040655 | -6.0e-3 | -7.3e-7 |
| 20 | 0.087189 | 0.087190 | 0.08718939 | 1.783196 | 1.040654 | -6.0e-3 | -2.3e-7 |
| 21 | 0.087189 | 0.087190 | 0.08718982 | 1.783197 | 1.040654 | -6.0e-3 | +1.4e-8 |
| 22 | 0.087189 | 0.087190 | 0.08718960 | 1.783197 | 1.040654 | -6.0e-3 | -1.1e-7 |
| 23 | 0.087190 | 0.087190 | 0.08718971 | 1.783197 | 1.040654 | -6.0e-3 | -4.7e-8 |
| 24 | 0.087190 | 0.087190 | 0.08718976 | 1.783197 | 1.040654 | -6.0e-3 | -1.7e-8 |
| 25 | 0.087190 | 0.087190 | 0.08718979 | 1.783197 | 1.040654 | -6.0e-3 | -1.2e-9 |
| 26 | 0.087190 | 0.087190 | 0.08718980 | 1.783197 | 1.040654 | -6.0e-3 | +6.5e-9 |
| 27 | 0.087190 | 0.087190 | 0.08718980 | 1.783197 | 1.040654 | -6.0e-3 | +2.6e-9 |
| 28 | 0.087190 | 0.087190 | 0.08718979 | 1.783197 | 1.040654 | -6.0e-3 | +7.1e-10 |
Bisection moves: Δ draw < 0 keeps the upper half (lo = mid), > 0 the lower; it stops at |Δ draw| < 1e-9. Δ home never moves down the rows — that is the deferral made visible: neither knob can change it once the Handicap pins P(h>a), and λ₃ was ruled out by the rank check.
The per-stage table — the baseline and the pulled solve side by side:
| Stage | l₁ | l₂ | λ₃ | θ | Δ cover | Δ over | Δ home | Δ draw | Δ away |
|---|---|---|---|---|---|---|---|---|---|
| Poisson | 1.6089 | 1.0651 | — | — | 3.8e-9 | 7.1e-9 | — | — | — |
| DIBP | 1.7832 | 1.0407 | 0.0000 | 0.0872 | 2.1e-11 | 7.6e-11 | -6.0e-3 | +7.1e-10 | +6.0e-3 |
Hard-anchor gaps: Handicap 2.1e-11, Total 7.6e-11 — the pull never trades them; is held fixed throughout. This run deferred: with both knobs draw-directional and the ±0.50 line already pinning — the same event the 1X2 home leg prices — the two collapse onto one direction, so λ₃ = 0 and Δ home above is simply the two books’ disagreement over that event, reported not fought. Quote a deeper Handicap (e.g. −1.00 at −0.59 / +0.51) so the anchored event becomes — distinct from — and the home residual frees up: the rank climbs and the fit switches to Gauss–Newton, engaging λ₃ to bring Δ home down too.
Shape caveats: the 1X2 fixes the diagonal’s level (its total mass), but its shape — which draw cells carry it — is imposed by ω, not read from a quote. Pin the correct-score profile with correct-score quotes if you need it. Because only touches the diagonal (even totals), Odd/Even and Exact-Total at even totals move with θ and ω while odd totals do not; and since λ₃ mostly reshapes the low cells through the Total trade, its footprint on the wider ladders is small.
With l₁, l₂, λ₃, and θ fixed, the last stage’s grid (step 4) is fully determined — the score-grid panel above — and every market probability is just a sum of its matching cells. Each outcome is one grid cell J[h][a]; scores beyond the board cap (4-4 full match, 3-3 halves) fold into “AOS”.
| Outcome | Σ from grid | Fair | Priced dec |
|---|---|---|---|
| 0-0 | 0.1110 | 0.1110 | 8.722 |
| 0-1 | 0.0564 | 0.0564 | 17.011 |
| 0-2 | 0.0293 | 0.0293 | 32.172 |
| 0-3 | 0.0102 | 0.0102 | 87.481 |
| 0-4 | 0.0026 | 0.0026 | 276.367 |
| 1-0 | 0.0966 | 0.0966 | 10.001 |
| 1-1 | 0.1205 | 0.1205 | 8.042 |
| 1-2 | 0.0523 | 0.0523 | 18.309 |
| … 18 more | |||
Raw masses are normalized to Σ = 1, then inflated by Shin to overround 1 + 0.05 — the insider model run forward: with and , bisecting until (this run: ).
anchors tH = powerStrip(HCP pair) # hard fair P(home covers L) — step 1
tT = powerStrip(Total pair) # hard fair P(over T) — step 1
target (t1,tX,t2) = shinStrip(1X2) # soft fair 1X2 vector — step 4
fixed ω (geometric-diagonal decay) # user input, never fitted — step 4
w[k] ∝ (1−ω)ω^k on k=0…N (Σ=1) # D(ω) profile
for damped Gauss–Newton trial (λ₃, θ) # skip λ₃ = θ = 0 with no 1X2
bisect λ_total = l₁+l₂ ∈ [0.02, 8] # re-anchor size (mean total = l₁+l₂+2λ₃)
bisect l₁ ∈ (0, λ_total) # re-anchor split; l₂ = λ_total − l₁
B = BP(l₁, l₂, λ₃) on 0…N # common-shock bivariate Poisson
J = (1−θ)·B + θ·D(ω) # additive diagonal inflation — Σ stays 1
until fairHcp(J, L) = tH # Handicap is never softened
until fairTot(J, T) = tT # Total is never softened
r = (P(h>a)−t1, P(h=a)−tX) # away follows from ΣJ = 1
minimize r·r + 1e−10 λ₃² # λ₃ ridge defers a rank collisionThe grid panel’s stages run this same nest with the shape pull off/on — Poisson: λ₃ = θ = 0, DIBP: the fitted (λ₃, θ). The λ bisections remain monotone and retain their usual solver tolerances — the diagonal injection is fully visible to fairHcp/fairTot, which evaluate on the mixed grid, so both anchors stay exact through the mixture. The outer least-squares loop uses finite-difference shape directions, damping, and the small λ₃ ridge. Because both knobs are draw-directional and neither owns the home leg, the measured shape Jacobian is quasi-rank-deficient more often than the φ/σ candidate’s; when it collapses the ridge pins λ₃ = 0 and θ is bisected onto the draw rather than weakening the anchor. This page folds the ≥5 tail into the N = 5 boundary (the H=5/A=5 cells mean “5 or more”), so every stage’s grid is mass-complete (Σ = 1) — the DIBP grid stays mass-complete because both mixture components do — so the discrete grid reproduces the closed-form inversion instead of drifting from it by a truncated tail (steps 2–3). Each market group still renormalizes its own outcome masses to Σ = 1 before its margin. The executable reference is docs/src/lib/odds/core.ts + markets-dibp.ts; the shared strip/solve/settlement math is held to the original simulator by the golden-master test in docs/src/lib/odds/__tests__/ (which exercises the default truncated grid — this page opts into the mass-complete capTail variant).