Skip to main content

Odds Generation — soccer · goal · regular · φ/σ tilt

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 — but step 4 swaps the default's common-shock λ₃ for a soft multiplicative 1X2 tilt: draw cells scale by (1 + φ), home-win cells by e^σ, away-win cells by e^(−σ), then one renormalization. A damped Gauss–Newton fits (φ, σ), re-solving (λₕ, λₐ) after every trial so the Handicap and Total still hold exactly.

Where the default's single λ₃ compromises, the tilt has two independently-identified knobs — φ a direct draw lever, σ a genuine home:away lever — so it generically hits both 1X2 legs exactly, in either direction. The tilt is also the minimum-KL reshape of the score grid matching the quoted 1X2 masses: within each block (home / draw / away) the conditional score distribution is preserved, so Correct Score and Exact Total inherit their shape from the Poisson baseline rather than from an imposed profile. On ±0.5-class handicap lines the home leg is already pinned by the anchor; a rank check detects the collapse and defers to a φ-only draw solve at σ = 0.

Stage 1 — Poisson marginals form the joint score grid
Stage 1 — (λₕ, λₐ) outer-product into the joint score grid

Compare Poisson / soft 1X2 on the grid to see what φ and σ move.

See also the sibling diagonal-inflated BP candidate, which extends the default's common shock with a diagonal-inflation lever instead.

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

λₕ 1.7485λₐ 1.0161λtotal 2.7646φ 0.3866σ 0.0000anchors Δp 3.2e-11 / 3.9e-111X2 Δ -6.0e-3 / -1.9e-10 / +6.0e-3draw 0.24860.2995grid N=5 · Poisson → 1X2 soft pull
Score grid — P(home = h, away = a) ×100
Poisson
λₕ 1.6089λₐ 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
1X2 soft pull
λₕ 1.7485λₐ 1.0161φ 0.3866σ 0.0000draw 0.2995
A=0A=1A=2A=3A=4A=5+
H=08.015.872.981.010.260.06
H=110.1014.225.211.770.450.11
H=28.838.976.321.540.390.10
H=35.145.232.661.250.230.06
H=42.252.281.160.390.140.02
H=5+1.091.110.560.190.050.02
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.60+0.52
-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.45-0.53
2/2.5+0.70-0.78
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-09.616
2-01132
2-11118
3-01988
3-11852
3-23559
4-042283
4-141180
4-278201
4-3201309
0-0
12
1-1
6.8
2-2
15
3-3
73
4-4
446
AOS
28
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 φ/σ pull perturbs it, so that stage re-solves size and split jointly against the same hard targets — both recovered λ 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 softly pulls that shape toward the 1X2 quote with φ (draw) and σ (home/away), then re-solves so the quotes still hold (step 4).

4 · Pull the shape toward the 1X2 (φ draw + σ home/away) — 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 becomes a soft target: two shape knobs pull the grid toward it, and the nested λ re-solve restores the Handicap and Total exactly on every trial — the hard anchors are never sacrificed.

J~[h,a]=J0[h,a] ⁣× ⁣{1+φ,h=aeσ,h>aeσ,h<aJ[h,a]=J~[h,a]/ ⁣u,vJ~[u,v]\widetilde J[h,a] = J_0[h,a]\!\times\!\begin{cases}1+\varphi,&h=a\\ e^{\sigma},&h>a\\ e^{-\sigma},&h
(φ,σ)=argminφ>1,  σ4  (PHpH)2+(PDpD)2+1010σ2(\varphi,\sigma) = \arg\min\limits_{\varphi>-1,\;|\sigma|\le4}\; \left(P_H-p_H^{\ast}\right)^2 + \left(P_D-p_D^{\ast}\right)^2 + 10^{-10}\sigma^2

φ moves the diagonal level (the draw); σ tilts only the win/loss halves, leaving the diagonal — and every ratio within one side — untouched. Both weights apply before one renormalization. A damped Gauss–Newton search minimizes the residual, re-solving (λh,λa)(\lambda_h,\lambda_a) inside every evaluation; the tiny σ ridge picks σ = 0 whenever the Handicap leaves no independent home/away direction. What the pull did:

1X2 legtwo-input gridpulled1X2 targetΔ
Home0.50000.50000.5060-6.0e-3
Draw0.24860.29950.2995-1.9e-10
Away0.25140.20050.1945+6.0e-3

landed with φ=0.386602,  σ=0.000000\varphi = 0.386602,\;\sigma = 0.000000 — Δ home and Δ draw are the minimized residuals; Δ away follows from Σ=1\Sigma = 1 and stays a cross-check.

Cross-check both knobs — the weighting itself is exact closed-form algebra, just like the draw-only φ paste it generalizes. Freeze the base grid at this stage’s re-solved (λh,λa)(\lambda_h, \lambda_a): its three masses are D0=0.235679D_0 = 0.235679 (diagonal), H0=0.545557H_0 = 0.545557 (h > a), A0=0.218764A_0 = 0.218764 (h < a), Σ = 1. Ratios cancel the renormalizer, so each knob inverts alone in the Bisection Calculator — σ from the achieved home:away ratio, interval [4,4][-4,\, 4]:
exp(2*x)*0.54555696/0.21876438 = 2.49381075
then φ from the draw at that σ (off-diagonal constant K=eσH0+eσA0=0.764321K = e^{\sigma}H_0 + e^{-\sigma}A_0 = 0.764321), interval [0.999,2][-0.999,\, 2]:
(1 + x)*0.23567866 / ((1 + x)*0.23567866 + 0.76432134) = 0.29950363
They land on σ=0.000000\sigma = -0.000000 and φ=0.386602\varphi = 0.386602 — the fit’s 0.0000000.000000 and 0.3866020.386602 to calculator tolerance. Away from ±0.50 the achieved legs are the 1X2 targets, so the step-1 numbers work directly; at ±0.50 use the achieved legs above — home:away sits at the Handicap-implied split, and the σ paste returns 0.
Where the pasted expressions come from

The weighting multiplies three disjoint mass blocks by three constants, then renormalizes. On a base grid with D0+H0+A0=1D_0 + H_0 + A_0 = 1 the pulled legs are

PD=(1+φ)D0ZPH=eσH0ZPA=eσA0ZZ=(1+φ)D0+eσH0+eσA0P_D = \frac{(1+\varphi)D_0}{Z} \qquad P_H = \frac{e^{\sigma}H_0}{Z} \qquad P_A = \frac{e^{-\sigma}A_0}{Z} \qquad Z = (1+\varphi)D_0 + e^{\sigma}H_0 + e^{-\sigma}A_0

Divide any two legs and ZZ cancels: PH/PA=e2σH0/A0P_H/P_A = e^{2\sigma}H_0/A_0 pins σ on its own (the σ paste), and with σ known the draw share PD=(1+φ)D0/((1+φ)D0+K)P_D = (1+\varphi)D_0/\big((1+\varphi)D_0 + K\big) rises monotonically in φ from 0 toward 1 — one root, the φ paste. Both even invert in closed form, no bisection strictly needed:

σ=12ln ⁣PHA0PAH0=0.000000φ=PDPHeσH0D01=0.386602\sigma = \tfrac{1}{2}\ln\!\frac{P_H\,A_0}{P_A\,H_0} = -0.000000 \qquad\quad \varphi = \frac{P_D}{P_H}\,e^{\sigma}\,\frac{H_0}{D_0} - 1 = 0.386602

At σ = 0 the constant is K=H0+A0=1D0K = H_0 + A_0 = 1 - D_0 and the φ paste collapses to the old draw-only one-constant form (1+φ)D0/(1+φD0)(1+\varphi)D_0/(1+\varphi D_0) — the soft pull strictly generalizes the old draw calibration. As in steps 2–3, the λ re-solve is the piece a one-variable calculator can’t reproduce, so the frozen masses enter as constants.

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=3.1×1013\det(J^{\top}\!J)/\operatorname{tr}(J^{\top}\!J)^{2} = 3.1 \times 10^{-13} < 10⁻⁸ — the σ direction is dead: this Handicap line already fixes the home leg once the draw is set, so σ pins at 0 and the one live knob, φ, is bisected onto the draw — exactly the pre-σ engine:

ilohiφλₕλₐΔ homeΔ draw
10.0000001.0000000.500000001.7868251.001787-6.0e-3+1.2e-2
20.0000000.5000000.250000001.7008451.033459-6.0e-3-1.6e-2
30.2500000.5000000.375000001.7445371.017575-6.0e-3-1.3e-3
40.3750000.5000000.437500001.7658521.009664-6.0e-3+5.6e-3
50.3750000.4375000.406250001.7552381.013616-6.0e-3+2.2e-3
60.3750000.4062500.390625001.7498991.015595-6.0e-3+4.5e-4
70.3750000.3906250.382812501.7472211.016585-6.0e-3-4.3e-4
80.3828130.3906250.386718751.7485601.016089-6.0e-3+1.3e-5
90.3828130.3867190.384765631.7478911.016337-6.0e-3-2.1e-4
100.3847660.3867190.385742191.7482261.016213-6.0e-3-9.7e-5
110.3857420.3867190.386230471.7483931.016151-6.0e-3-4.2e-5
120.3862300.3867190.386474611.7484771.016120-6.0e-3-1.4e-5
130.3864750.3867190.386596681.7485191.016105-6.0e-3-6.4e-7
140.3865970.3867190.386657711.7485391.016097-6.0e-3+6.2e-6
150.3865970.3866580.386627201.7485291.016101-6.0e-3+2.8e-6
160.3865970.3866270.386611941.7485241.016103-6.0e-3+1.1e-6
170.3865970.3866120.386604311.7485211.016104-6.0e-3+2.2e-7
180.3865970.3866040.386600491.7485201.016104-6.0e-3-2.1e-7
190.3866000.3866040.386602401.7485201.016104-6.0e-3+8.2e-9
200.3866000.3866020.386601451.7485201.016104-6.0e-3-9.9e-8
210.3866010.3866020.386601921.7485201.016104-6.0e-3-4.5e-8
220.3866020.3866020.386602161.7485201.016104-6.0e-3-1.9e-8
230.3866020.3866020.386602281.7485201.016104-6.0e-3-5.2e-9
240.3866020.3866020.386602341.7485201.016104-6.0e-3+1.5e-9
250.3866020.3866020.386602311.7485201.016104-6.0e-3-1.8e-9
260.3866020.3866020.386602331.7485201.016104-6.0e-3-1.9e-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: no φ can change it, and σ was ruled out by the rank check.

The per-stage table — the baseline and the pulled solve side by side:

Stageλₕλₐλₕ+λₐφσΔ coverΔ overΔ homeΔ drawΔ away
Poisson1.60891.06512.67413.8e-97.1e-9
1X2 soft pull1.74851.01612.76460.38660.00003.2e-113.9e-11-6.0e-3-1.9e-10+6.0e-3

Hard-anchor gaps: Handicap 3.2e-11, Total 3.9e-11 — the pull never trades them. This run deferred: at a ±0.50-class line the rank check found no independent home/away direction, so σ = 0 and Δ home above is simply the two books’ disagreement over the same event — reported, not fought. To watch σ engage, quote the same match at a deeper line: set the Handicap to −1.00 at −0.59 / +0.51 and Δ home collapses to solver tolerance with σ ≈ 0.18.

Shape caveats carry over from the draw-only fit: one draw number fixes the diagonal’s level, while the 2-2/3-3/4-4 shape rides on the flat wk=1w_k = 1 — pin it with correct-score quotes; the flat scaling acts only on even totals, nudging Odd/Even and Exact-Total. σ is likewise flat across each win/loss half, so ratios within a side (2-1 : 3-1) never change.

5 · Read “Correct Score” off the score grid

With λₕ, λₐ, φ, 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.08010.080112.047
0-10.05870.058716.364
0-20.02980.029831.690
0-30.01010.010188.126
0-40.00260.0026283.163
1-00.10100.10109.578
1-10.14220.14226.818
1-20.05210.052118.382
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

for damped Gauss–Newton trial (φ, σ)      # skip φ = σ = 0 with no 1X2
  bisect λ_total ∈ [0.02, 8]              # re-anchor size
    bisect λₕ ∈ (0, λ_total)              # re-anchor split; λₐ = λ_total − λₕ
      J₀ = Poisson(λₕ, λₐ) on 0…N
      J  = normalize(J₀ × (1+φ) on h=a × e^σ on h>a × e^−σ on h<a)
    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, soft 1X2: the fitted φ/σ. The λ bisections remain monotone and retain their usual solver tolerances; the outer least-squares loop uses finite-difference shape directions, damping, and the small σ ridge. If the 1X2 home direction duplicates a ±0.50 Handicap, the measured shape Jacobian loses rank and the ridge chooses σ = 0 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), 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 for all of the above is docs/src/lib/odds/core.ts + markets.ts; the underlying 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).