Skip to main content

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.

Primary Quotes
Handicap (Malay)
Total (Malay)
1X2 quote (Decimal) optional ·

/ 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).

l₁ 1.7832l₂ 1.0407λ₃ 0.0000θ 0.0872ω 0.35μtotal 2.8239anchors Δp 2.1e-11 / 7.6e-111X2 Δ -6.0e-3 / +7.1e-10 / +6.0e-3draw 0.24860.2995grid N=5 · Poisson → DIBP
Score grid — P(home = h, away = a) ×100
Poisson
l₁ 1.6089l₂ 1.0651draw 0.2486
A=0A=1A=2A=3A=4A=5+
H=06.907.353.911.390.370.10
H=111.1011.826.292.230.600.15
H=28.939.515.061.800.480.12
H=34.795.102.720.960.260.07
H=41.932.051.090.390.100.03
H=5+0.830.890.470.170.040.01
home Σ 0.5000 draw Σ 0.2486 away Σ 0.2514
DIBP
l₁ 1.7832l₂ 1.0407λ₃ 0.0000θ 0.0872draw 0.2995
A=0A=1A=2A=3A=4A=5+
H=011.105.642.931.020.260.07
H=19.6612.055.231.820.470.12
H=28.628.975.361.620.420.11
H=35.125.332.771.210.250.06
H=42.282.381.240.430.200.03
H=5+1.141.180.610.210.060.04
home Σ 0.5000 draw Σ 0.2995 away Σ 0.2005
shade ∝ probability · each stage re-solves (λₕ, λₐ) against the same fair targets
Handicap
HDPHA
-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
Over/Under
GoalOverUnder
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
1X2
OutcomeOdds
Home1.928
Draw3.167
Away4.641
Correct Score
1-01017
2-01132
2-11118
3-01987
3-11851
3-23457
4-041276
4-139172
4-273190
4-3187289
0-0
8.7
1-1
8.0
2-2
18
3-3
75
4-4
347
AOS
26
17 more in scope
The four primary markets above always show; pick any other in-scope market here to price it off the same final grid.
How these numbers are computed
1 · Strip the bookmaker margins — Power (two-way) · Shin (three-way)

Each quote implies a probability q=1/dq = 1/d 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.

Handicap -0.50 → P(home covers -0.50)
HomeAway
Malay quote+0.96+0.96
Decimal dd1.96001.9600
Fair p=q1/xp = q^{1/x}0.50000.5000
Fair decimal 1/p1/p2.00002.0000
Total 2.50 → P(over 2.50)
OverUnder
Malay quote+0.95+0.95
Decimal dd1.95001.9500
Fair p=q1/xp = q^{1/x}0.50000.5000
Fair decimal 1/p1/p2.00002.0000
1X2 (Decimal) → P(home win), P(draw), P(away win) — Shin
HomeDrawAway
Decimal quote dd1.89003.13004.7000
Fair pp (Shin)0.50600.29950.1945
Fair decimal 1/p1/p1.97623.33895.1420

Try the strips standalone — Margin — two-way (Power) · Margin — multi-way (Shin): the same math on any quotes, with the bisection narrated.

2 · Size — recover λ_total from the Total

Step 1 left two hard fair targets — Handicap and Total — for the scoring rates λh,λa\lambda_h, \lambda_a. 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 — P(k;λ)=eλλk/k!P(k;\lambda) = e^{-\lambda}\lambda^{k}/k! — and independent. Independent Poissons add — X+YPoisson(λh+λa)X + Y \sim \mathrm{Poisson}(\lambda_h + \lambda_a) — so the match total depends only on λtotal=λh+λa\lambda_{\text{total}} = \lambda_h + \lambda_a: 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 P(total=t)=eλλt/t!P(\text{total} = t) = e^{-\lambda}\lambda^{t}/t! — into three buckets: win (over hits), mass WW; lose, mass LL; push (an exact tie, stake refunded), mass RR — so W+L+R=1W + L + R = 1. A refund is a no-action bet, so the fair price conditions on the decided outcomes alone: P(overdecided)=WW+L=W1RP(\text{over} \mid \text{decided}) = \frac{W}{W + L} = \frac{W}{1 - R}. 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:

target (step 1): pover  =  fair P(over 2.50)  =  0.50000000p^{\ast}_{\text{over}} \;=\; \text{fair } P(\text{over } 2.50) \;=\; 0.50000000
search: bisect λtotal[0.02,8]   until   W/(1R)=pover    λtotal=2.674060\text{bisect } \lambda_{\text{total}} \in [0.02,\, 8] \;\text{ until }\; W/(1-R) = p^{\ast}_{\text{over}} \;\Rightarrow\; \lambda_{\text{total}} = 2.674060
Cross-check it — the fair over is the win mass over the non-push mass, W/(1R)W/(1-R), written as raw Poisson terms. Paste into the Bisection Calculator and solve for λ\lambda:
1 - exp(-x)*(1 + x + x^2/2) = 0.50000000
A .5 line cannot push (R=0R = 0), so this is the plain tail P(X3)P(X \ge 3) — the Poisson Calculator inverse-solves P(X3)=0.50000000P(X \ge 3) = 0.50000000 in one field.
Where the pasted expression comes from

Totals are whole numbers, so total ii carries mass P(total=i)=exxi/i!P(\text{total} = i) = e^{-x}x^{i}/i!. Each win tail runs on forever, so flip it to the complement — exe^{-x} times the start of ex=1+x+x22+e^{x} = 1 + x + \tfrac{x^2}{2} + \cdots cut at the line (keep every term and exex=1e^{-x}e^{x} = 1, the whole distribution). For the 2.50 line:

W  =  P(total>2.5)  =  1P(total2)  =  1ex(1+x+x22)W \;=\; P(\text{total} > 2.5) \;=\; 1 - P(\text{total} \le 2) \;=\; 1 - e^{-x}\left(1 + x + \tfrac{x^{2}}{2}\right)
R  =  0(no whole-goal total equals 2.5)R \;=\; 0 \quad \text{(no whole-goal total equals 2.5)}

Substitute WW (with R=0R = 0 the denominator is 1) into W/(1R)=poverW/(1-R) = p^{\ast}_{\text{over}} and write exe^{-x} as exp(-x) — that is the pasted line, term for term; the calculator solves it for x=λtotalx = \lambda_{\text{total}}.

The evaluation the search repeats every iteration is that settlement rule under Poisson(λ). At the converged λtotal=2.674060\lambda_{\text{total}} = 2.674060 it reproduces the win mass WW, push mass RR, and the fair check back to the target — the figures a re-implementation should match:

W  =  P(total>2.50)  =  1t=02eλλtt!  =  0.5000W \;=\; P(\text{total} > 2.50) \;=\; 1 - \textstyle\sum_{t=0}^{2} \tfrac{e^{-\lambda}\lambda^{t}}{t!} \;=\; 0.5000
R  =  P(total=2.50)  =  0    (no push: totals are integers)R \;=\; P(\text{total} = 2.50) \;=\; 0 \;\; \text{(no push: totals are integers)}
fair P(over 2.50)  =  W1R  =  0.500010.0000  =  0.5000  =  pover    \text{fair } P(\text{over } 2.50) \;=\; \frac{W}{1-R} \;=\; \frac{0.5000}{1 - 0.0000} \;=\; 0.5000 \;=\; p^{\ast}_{\text{over}} \;\; \checkmark
recovered size:λtotal  =  2.674060\text{recovered size:}\quad \lambda_{\text{total}} \;=\; 2.674060

(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.)

3 · Split — recover λₕ and λₐ from the Handicap

The Handicap decides who scores them — and settling it needs the full scoreline distribution, the score grid: independence makes each cell (h,a)(h, a) a plain product of the two Poisson masses,

J[h][a]  =  P(home=h;λh)P(away=a;λa)h,a=05J[h][a] \;=\; P(\text{home} = h;\, \lambda_h) \cdot P(\text{away} = a;\, \lambda_a) \qquad h, a = 0 \ldots 5

— exactly the grid the score-grid panel’s Poisson stage displays. Hold λtotal\lambda_{\text{total}} fixed and slide the home share λh\lambda_h (with λa=λtotalλh\lambda_a = \lambda_{\text{total}} - \lambda_h). Home covers ⟺ h+L>ah + L > a, an exact h+L=ah + L = a is a push — step 2’s one rule again, with the masses now read off the grid: W=h+L>aJ[h][a]W = \textstyle\sum_{h + L > a} J[h][a] and R=h+L=aJ[h][a]R = \textstyle\sum_{h + L = a} J[h][a] (½-weighted across a quarter line’s two components), fair cover probability W/(1R)W/(1-R) — which rises with λh\lambda_h, so the same solver shape applies:

target (step 1): pcover  =  fair P(home covers 0.50)  =  0.50000000p^{\ast}_{\text{cover}} \;=\; \text{fair } P(\text{home covers } -0.50) \;=\; 0.50000000
search: bisect λh(0,λtotal)   until   W/(1R)=pcover    λh=1.608939,    λa=λtotalλh=1.065121\text{bisect } \lambda_h \in (0,\, \lambda_{\text{total}}) \;\text{ until }\; W/(1-R) = p^{\ast}_{\text{cover}} \;\Rightarrow\; \lambda_h = 1.608939,\;\; \lambda_a = \lambda_{\text{total}} - \lambda_h = 1.065121
Cross-check it — the fair cover is the same win-over-non-push mass W/(1R)W/(1-R) as step 2, with the away score conditioned out so the whole cover is one function of x=λhx = \lambda_h (λa=λtotalx\lambda_a = \lambda_{\text{total}} - x, and λtotal=2.674060\lambda_{\text{total}} = 2.674060 held fixed from step 2). One line per away score aa up to N=5N = 5 — paste into the Bisection Calculator, interval [0,λtotal][0,\, \lambda_{\text{total}}], tolerance 1e-8, and solve for xx:
  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.50000000
A .5 line cannot push (R=0R = 0): each line is one away score — its Poisson mass times the home tail Ptail(a+1;x)\mathrm{Ptail}(a + 1;\, x) that covers it. Its search lands on λh=1.608889\lambda_h = 1.608889 — within Δ=5.0×105\Delta = 5.0 \times 10^{-5} 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 XYX - Y (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 λtotal\lambda_{\text{total}} can express it. The trick is to condition on the away score aa: once aa is pinned, only the home goals still vary, and the cover collapses to one plain home tail (Ptail(k;λ)=P(Xk)\mathrm{Ptail}(k;\, \lambda) = P(X \ge k)). Home covers     ha+1\iff h \ge a + 1 (a half-line cannot push), so each away score contributes its Poisson mass times that tail:

W  =  P(home covers 0.50)  =  a0P(away=a;λa)Ptail(a+1;λh)W \;=\; P(\text{home covers } -0.50) \;=\; \sum_{a \ge 0} P(\text{away} = a;\, \lambda_a)\,\mathrm{Ptail}(a + 1;\, \lambda_h)
-5-4-3-2-10+1+2+3+4+5+6goal margin m = home − away
The goal margin m=ham = h - a — a Skellam, the difference of two Poissons. Shaded by how the 0.50-0.50 line settles: home covers (m+1m \ge +1), away.

Now substitute the search variable x=λhx = \lambda_h (with λa=λtotalx\lambda_a = \lambda_{\text{total}} - x) so the whole cover is one function of xx:

W  =  a0P(a;λtotalx)Ptail(a+1;x)W \;=\; \sum_{a \ge 0} P(a;\, \lambda_{\text{total}} - x)\,\mathrm{Ptail}(a + 1;\, x)
fair cover  =  W(no push, so R=0)\text{fair cover} \;=\; W \quad (\text{no push, so } R = 0)

Truncating the away sum at N = 5 — the grid’s size — gives the pasted equation. At the solved x=λh=1.608889x = \lambda_h = 1.608889 the 6 terms evaluate and add straight up to the target (λa=λtotalλh=1.065171\lambda_a = \lambda_{\text{total}} - \lambda_h = 1.065171):

0.2757+0.1755+0.0428+0.0056+0.0004+0.0000  =  0.5000  =  pcover    0.2757 + 0.1755 + 0.0428 + 0.0056 + 0.0004 + 0.0000 \;=\; 0.5000 \;=\; p^{\ast}_{\text{cover}} \;\; \checkmark

Why the pasted λh\lambda_h is only almost exactly the 1.6089391.608939 from the grid solve (Δ=5.0×105\Delta = 5.0 \times 10^{-5}): the grid is mass-complete, so almost all of the old truncation gap is gone — the home tail folds into the h=5h = 5 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 a5a \ge 5 mass onto the a=5a = 5 column as a cumulative bucket, while this closed-form paste keeps aa there as an exact point mass — and the margin hah - a mis-scores that folded corner. That corner is Δ\Delta, and it shrinks with the away rate. The figure below shows the fold on the home side — its 5\ge 5 tail lands in the 5+ bucket, so no mass is lost; the away side folds the same way.

012345+6789goals, one side
One side's goal count (Poisson). The 5+ bucket folds in the faded tail past 5 (0.62% of the mass), so the grid keeps 100% — nothing is dropped. That mass-completeness is what lets the discrete grid land on the closed-form λ\lambda.

At the converged split the grid masses and the fair check are:

W=P(h0.50>a)=0.5000W = P(h - 0.50 > a) = 0.5000
R=P(h0.50=a)=0.0000R = P(h - 0.50 = a) = 0.0000
fair P(home covers 0.50)  =  W1R  =  0.500010.0000  =  0.5000  =  pcover    \text{fair } P(\text{home covers } -0.50) \;=\; \frac{W}{1-R} \;=\; \frac{0.5000}{1 - 0.0000} \;=\; 0.5000 \;=\; p^{\ast}_{\text{cover}} \;\; \checkmark
    λh=1.608939λa=1.065121\Longrightarrow\;\; \lambda_h = 1.608939 \qquad \lambda_a = 1.065121

The recovered pair (λh,λa)(\lambda_h,\, \lambda_a) 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).

4 · Pull the shape toward the 1X2 (λ₃ + θ diagonal inflation) — optional

The 1X2 is a three-way book, so Shin stripped it in step 1: with implied qi=1/diq_i = 1/d_i and overround Q=qiQ = \textstyle\sum q_i, Shin’s insider fraction zz deflates each side to

pi(z)  =  z2+4(1z)qi2/Qz2(1z)bisect z[0,1) until pi=1    z=0.0308p_i(z) \;=\; \frac{\sqrt{z^{2} + 4(1-z)\,q_i^{2}/Q\,} - z}{2(1-z)} \qquad \text{bisect } z \in [0,1) \text{ until } \textstyle\sum p_i = 1 \;\Rightarrow\; z = 0.0308
Cross-check it — this book’s implied numbers are q=(11.8900, 13.1300, 14.7000)=(0.529101, 0.319489, 0.212766)q = \left(\tfrac{1}{1.8900},\ \tfrac{1}{3.1300},\ \tfrac{1}{4.7000}\right) = (0.529101,\ 0.319489,\ 0.212766) with overround Q=1.061355Q = 1.061355. Substituting them into ipi(z)=1\textstyle\sum_i p_i(z) = 1 — one term per leg — writes the bisection out in full. Paste into the Bisection Calculator and solve for x=zx = z:
(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))
= 1
The sum starts at Q=1.0302\sqrt{Q} = 1.0302 when z=0z = 0 and falls monotonically, so the sign flip is unique — scan [0,0.9][0,\, 0.9] and the bisection lands back on z=0.0308z = 0.0308. At the root each of the three terms is its fair leg — read (pH,pD,pA)(p_H^{\ast},\,p_D^{\ast},\,p_A^{\ast}) straight off them.

giving the fair vector (pH,pD,pA)=(0.5060,0.2995,0.1945)(p_H^{\ast},p_D^{\ast},p_A^{\ast}) = (0.5060,\,0.2995,\,0.1945). It does not become three more hard equations: at a −0.50 Handicap, home cover is already exactly P(h>a)P(h>a) — 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 λ3\lambda_3 and a diagonal-inflation weight θ\theta, then re-solve (λh,λa)(\lambda_h, \lambda_a) so the Handicap and Total still hold exactly on every trial.

J[h,a]  =  (1θ)BP(l1,l2,λ3)[h,a]  +  θD(ω)[h,a]J[h,a] \;=\; (1-\theta)\,\mathrm{BP}(l_1,l_2,\lambda_3)[h,a] \;+\; \theta\,D(\omega)[h,a]
D(ω)[h,a]={wh,h=a0,ha,wk  =  (1ω)ωkj=0N(1ω)ωj,k=0ND(\omega)[h,a] = \begin{cases} w_h, & h=a \\ 0, & h\neq a \end{cases}, \qquad w_k \;=\; \frac{(1-\omega)\,\omega^{k}}{\sum_{j=0}^{N}(1-\omega)\,\omega^{j}}, \quad k = 0\ldots N
(λ3,θ)  =  argminλ3[0,3],  θ[0,0.9]  (PHpH)2+(PDpD)2+1010λ32(\lambda_3,\theta) \;=\; \arg\min\limits_{\lambda_3\in[0,3],\;\theta\in[0,0.9]}\; \left(P_H-p_H^{\ast}\right)^2 + \left(P_D-p_D^{\ast}\right)^2 + 10^{-10}\lambda_3^2

BP\mathrm{BP} is the common-shock construction X=W1+W3,  Y=W2+W3X = W_1 + W_3,\; Y = W_2 + W_3 with independent W1Poisson(l1),  W2Poisson(l2),  W3Poisson(λ3)W_1 \sim \mathrm{Poisson}(l_1),\; W_2 \sim \mathrm{Poisson}(l_2),\; W_3 \sim \mathrm{Poisson}(\lambda_3); at λ3=0\lambda_3 = 0 it is exactly the independent-Poisson grid of steps 2–3. D(ω)D(\omega) is a geometric distribution laid along the diagonal (the draw cells 0-0, 1-1, 2-2, …); ω sets how fast its mass decays, and kwk=1\textstyle\sum_k w_k = 1 so D(ω)D(\omega) 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: XY=W1W2X - Y = W_1 - W_2, so the shock W3W_3 cancels in the goal margin — inside the BP part every handicap event and the raw win/draw/loss split depend on (l1,l2)(l_1, l_2) alone. λ₃ reaches the draw only indirectly, through the Total anchor: the expected total is E[X+Y]=l1+l2+2λ3\mathbb{E}[X+Y] = l_1 + l_2 + 2\lambda_3, so raising λ₃ forces l1+l2l_1 + l_2 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 φ/σ\varphi/\sigma 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 P(h>a)P(h>a). 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 P(h>a)P(h>a). 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, ×(1+φ)\times(1+\varphi), 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 legtwo-input gridpulled1X2 targetΔ
Home0.50000.50000.5060-6.0e-3
Draw0.24860.29950.2995+7.1e-10
Away0.25140.20050.1945+6.0e-3

landed with λ3=0.000000,  θ=0.087190\lambda_3 = 0.000000,\;\theta = 0.087190 at fixed ω=0.3500\omega = 0.3500 — Δ home and Δ draw are the minimized residuals; Δ away follows from Σ=1\Sigma = 1 and stays a cross-check.

Cross-check θ — the mixture is additive, so the 1X2 legs come out in closed form with no bisection at all. Freeze the BP part at this stage’s re-solved (l1,l2,λ3)(l_1, l_2, \lambda_3): its three masses are H0=0.547759H_0 = 0.547759 (h > a), D0=0.232594D_0 = 0.232594 (diagonal), A0=0.219647A_0 = 0.219647 (h < a), Σ = 1. Because D(ω)D(\omega) sits entirely on the diagonal (its home/away mass is 0, its draw mass is 1), the achieved legs are a straight-line map in θ:
PH=(1θ)H0PD=(1θ)D0+θPA=(1θ)A0P_H = (1-\theta)H_0 \qquad P_D = (1-\theta)D_0 + \theta \qquad P_A = (1-\theta)A_0
so θ is recoverable from any leg — θ=1PH/H0=0.087190\theta = 1 - P_H/H_0 = 0.087190,   1PA/A0=0.087190\;1 - P_A/A_0 = 0.087190,   (PDD0)/(1D0)=0.087190\;(P_D - D_0)/(1 - D_0) = 0.087190 — all landing on the fit’s θ=0.087190\theta = 0.087190. ω never appears: the whole diagonal is one 1X2 outcome, so it is unidentifiable from the 1X2 (see below). What a one-variable calculator can’t reproduce is the (l1,l2)(l_1, l_2) re-solve and λ₃ — those enter H0/D0/A0H_0/D_0/A_0 as constants, the same division of labour as steps 2–3.
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 J=(1θ)BP+θD(ω)J = (1-\theta)\mathrm{BP} + \theta D(\omega) into its three 1X2 blocks, the off-diagonal blocks get only the (1θ)(1-\theta) factor while the diagonal picks up the full θ\theta (since kwk=1\textstyle\sum_k w_k = 1):

PH=(1θ)H0PD=(1θ)D0+θ ⁣ ⁣kwk=(1θ)D0+θPA=(1θ)A0P_H = (1-\theta)H_0 \qquad P_D = (1-\theta)D_0 + \theta\!\!\sum_{k}w_k = (1-\theta)D_0 + \theta \qquad P_A = (1-\theta)A_0

Contrast the φ/σ candidate, whose φ/σ\varphi/\sigma weighting is multiplicative and needs a renormalizer ZZ PD=(1+φ)D0/ZP_D = (1+\varphi)D_0/Z, 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 (1θ)D0(1-\theta)D_0 keeps the BP profile, but the injected θwk\theta w_k 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 θkwk=θ\theta\sum_k w_k = \theta whatever ω is — so the achieved draw PD=(1θ)D0+θP_D = (1-\theta)D_0 + \theta (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, det(J ⁣J)/tr(J ⁣J)2=2.3×1014\det(J^{\top}\!J)/\operatorname{tr}(J^{\top}\!J)^{2} = 2.3 \times 10^{-14} < 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:

ilohiθl₁l₂Δ homeΔ draw
10.0000000.9000000.450000003.7476030.613501-6.0e-3+1.9e-1
20.0000000.4500000.225000002.1717260.980638-6.0e-3+7.7e-2
30.0000000.2250000.112500001.8422181.032039-6.0e-3+1.4e-2
40.0000000.1125000.056250001.7166381.050168-6.0e-3-1.8e-2
50.0562500.1125000.084375001.7768991.041564-6.0e-3-1.6e-3
60.0843750.1125000.098437501.8088831.036926-6.0e-3+6.5e-3
70.0843750.0984380.091406251.7927281.039275-6.0e-3+2.4e-3
80.0843750.0914060.087890631.7847731.040426-6.0e-3+4.0e-4
90.0843750.0878910.086132811.7808261.040997-6.0e-3-6.1e-4
100.0861330.0878910.087011721.7827971.040712-6.0e-3-1.0e-4
110.0870120.0878910.087451171.7837841.040569-6.0e-3+1.5e-4
120.0870120.0874510.087231451.7832911.040641-6.0e-3+2.4e-5
130.0870120.0872310.087121581.7830441.040676-6.0e-3-3.9e-5
140.0871220.0872310.087176511.7831671.040659-6.0e-3-7.6e-6
150.0871770.0872310.087203981.7832291.040650-6.0e-3+8.2e-6
160.0871770.0872040.087190251.7831981.040654-6.0e-3+2.6e-7
170.0871770.0871900.087183381.7831831.040656-6.0e-3-3.7e-6
180.0871830.0871900.087186811.7831901.040655-6.0e-3-1.7e-6
190.0871870.0871900.087188531.7831941.040655-6.0e-3-7.3e-7
200.0871890.0871900.087189391.7831961.040654-6.0e-3-2.3e-7
210.0871890.0871900.087189821.7831971.040654-6.0e-3+1.4e-8
220.0871890.0871900.087189601.7831971.040654-6.0e-3-1.1e-7
230.0871900.0871900.087189711.7831971.040654-6.0e-3-4.7e-8
240.0871900.0871900.087189761.7831971.040654-6.0e-3-1.7e-8
250.0871900.0871900.087189791.7831971.040654-6.0e-3-1.2e-9
260.0871900.0871900.087189801.7831971.040654-6.0e-3+6.5e-9
270.0871900.0871900.087189801.7831971.040654-6.0e-3+2.6e-9
280.0871900.0871900.087189791.7831971.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:

Stagel₁l₂λ₃θΔ coverΔ overΔ homeΔ drawΔ away
Poisson1.60891.06513.8e-97.1e-9
DIBP1.78321.04070.00000.08722.1e-117.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; ω=0.3500\omega = 0.3500 is held fixed throughout. This run deferred: with both knobs draw-directional and the ±0.50 line already pinning P(h>a)P(h>a) — 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 P(win by 2+)P(\text{win by }2{+}) — distinct from P(h>a)P(h>a) — 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 D(ω)D(\omega) 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.

5 · Read “Correct Score” off the score grid

With l₁, l₂, λ₃, and θ fixed, the last stage’s grid J[h][a]J[h][a] (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 gridFairPriced dec
0-00.11100.11108.722
0-10.05640.056417.011
0-20.02930.029332.172
0-30.01020.010287.481
0-40.00260.0026276.367
1-00.09660.096610.001
1-10.12050.12058.042
1-20.05230.052318.309
18 more

Raw masses are normalized to Σ = 1, then inflated by Shin to overround 1 + 0.05 — the insider model run forward: qi=Stiq_i = S \cdot t_i with ti=pi((1z)pi+z)t_i = \sqrt{p_i((1-z)p_i + z)} and S=tiS = \textstyle\sum t_i, bisecting zz until qi=1.05\textstyle\sum q_i = 1.05 (this run: z=0.0021z = 0.0021).

6 · Implementation notes — nesting, brackets, normalization
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 collision

The 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).