λ Run Expectancy Construction
Base lambda — form-blended, park-adjusted
λ_base = (0.65 × RS₃ᵧᵣ + 0.35 × RS_L15) / G
× park_factor
// RS₃ᵧᵣ: 3yr rolling RS/G · RS_L15: last 15G avg
Log-odds stacking — 32 factors, logit space
logit(p) = log(p / (1 − p))
logit(p_adj) = logit(p_base) + Σᵢ αᵢ
// 32 αᵢ ∈ ℝ · logit prevents p ∉ (0,1)
p_adj = sigmoid(logit(p_adj))
65/35 blend weights recent L15 performance to capture hot/cold streaks without overreacting to small samples. Park adjustment applied symmetrically to both offensive and defensive λ.
📊 Poisson Distribution & Win Probability
Run distributions — modeled independently
R_home ~ Poisson(λ_home)
R_away ~ Poisson(λ_away)
P(X=k ; λ) = exp(−λ) · λ^k / k!
Win probability — exact CDF (no simulation)
P(home wins) =
Σ_{k=1}^∞ P(R_home=k) · CDFPois(λ_away, k−1)
// Tie → extra innings as 50/50
No Monte Carlo needed — win prob is computed exactly from Poisson CDFs. Teams are modeled as independent (no run correlation). Pitcher, park, and lineup signals enter via λ; 32 log-odds factors adjust the derived win probability directly.
σ Platt Scaling Calibration
Sigmoid recalibration — fitted OOS 2022–2024
p_cal = σ(A · logit(p_raw) + B)
= 1 / (1 + exp(−(0.585 · logit(p_raw)
+ 0.014)))
Parameter interpretation
A = 0.585 // < 1: model over-expresses
// confidence; compress toward 50%
B = +0.014 // home-team bias correction
Fitted via MLE on 3yr OOS outcomes. Brier Score: 0.234 model vs. 0.250 market — 6.4% improvement. A < 1 confirms the raw Poisson systematically over-prices favorites; calibration compresses the logit toward the empirical base rate.
⚖️ No-Vig Market Probability Strip
American odds → raw implied probability
p_raw(ml) = {
|ml| / (|ml| + 100) if ml < 0 (favorite)
100 / (ml + 100) if ml > 0 (underdog)
}
Simultaneous both-side margin removal
hold = p_raw(h_ml) + p_raw(a_ml) − 1
p_nv_home = p_raw(h_ml) /
(p_raw(h_ml) + p_raw(a_ml))
// Pinnacle benchmark: hold ≈ 2.5%
Simultaneous stripping avoids asymmetric vig attribution — equivalent to the multiplicative method. Pinnacle's ~2.5% hold makes its no-vig the tightest available reflection of sharp market consensus.
⚡ Edge Detection & Half-Kelly Sizing
Model edge vs. no-vig Pinnacle
edge = p_cal − p_nv_Pinnacle
// Bet flagged if edge ≥ 0.02
Half-Kelly criterion — 50% of full Kelly
b = decimal_odds − 1
p = p_cal ; q = 1 − p
f* = 0.5 × (b · p − q) / b
// units = f* × bankroll ; cap: 3u
Half-Kelly reduces variance by ~50% with only ~25% EV reduction. The 3u cap prevents over-sizing on high-edge outliers that may reflect data anomalies rather than genuine model confidence.
📈 Closing Line Value — Process Validation
Definition — Pinnacle no-vig both sides
CLV = p_close_nv − p_open_nv
// Snapshot: 3:30 PM PT pre-game lock
Interpretation
CLV > 0 → market moved toward pick
CLV < 0 → market moved against pick
// +1% avg CLV ≈ long-run positive EV
// Separates skill from short-run variance
CLV is the gold standard for betting process validation — a model can run cold for 50 games but still show positive CLV, confirming the signal is real. Tracked per-bet in picks_log.csv, surfaced via --poster-stats.