Last updated: March 17, 2026 • Estimated reading time: 12–15 minutes
This guide shows you how to build practical MLB betting models—from the core metrics (xwOBA, SIERA, park factors) to a compact Google Sheets case study that outputs fair odds for a game. It’s written for bettors who want an educational, numbers‑first approach without hype.
Use this with the hub: Sports Betting Models: A Clear, Practical Guide. If you’re brand‑new, start there.
Why baseball is ideal for modeling
Baseball is structured and event‑driven: plate appearances are independent-ish, scoring is low/medium, and many outcomes (runs, HRs) behave like count processes that simple distributions can approximate. Compared to fluid sports, MLB offers:
- Stable inputs: Starting pitchers, platoon splits, park effects, weather.
- Granularity: Rich per‑pitch/per‑PA data to isolate skill.
- Predictable variance: Runs can be approximated with Poisson/Negative Binomial models; win probability can be derived from team run distributions.
You can begin with a team‑based model and later graduate to player‑based projections without throwing away your early work.
Key statistics that actually matter
Focus on skill‑relevant, regressed metrics that predict the future better than surface stats.
Hitting (team or player aggregation)
- xwOBA (expected weighted on‑base average): contact quality + K/BB; strong all‑around signal for run creation.
- wOBA / wRC+: descriptive performance and context‑adjusted productivity.
- ISO: raw power; helps estimate extra‑base hits/HR rate.
- K% / BB%: plate discipline; drives OBP and run expectancy.
- Platoon splits (L/R): stabilize slower than overall rates—regress small‑sample splits toward overall mean.
Pitching
- SIERA (skill‑interactive ERA): better isolates pitcher skill than ERA; less defense/park noise.
- xFIP / FIP: home‑run luck adjustment (xFIP) and fielding‑independent core (FIP).
- K‑BB%: quick strength signal.
- GB% / FB% / Barrel%: batted‑ball profile and damage risk.
Context
- Park factors: run and HR multipliers by stadium.
- Weather: temperature, wind, air density; adjust HR/run rates.
- Umpire tendencies (advanced): zone size, strike propensity.
- Bullpens: leverage relievers, rest days; add a bullpen penalty/boost to the SP projection.
Philosophy: prefer SIERA over ERA for pitcher skill and xwOBA over AVG for hitters. Raw traditional stats lag and overreact to luck.
Model architectures: team‑based vs player‑based
Team‑based (simpler, good first step)
- Estimate each team’s expected runs vs. the opposing starting pitcher using team‑aggregated xwOBA/BB%/K% and a pitcher adjustment (SIERA, K‑BB%, GB%, L/R).
- Apply park & weather factors to both offenses.
- Add a bullpen adjustment (e.g., +0.2 to opponent expected runs if your bullpen is tired/weak).
- Convert expected runs to a run distribution (Poisson or overdispersed alternative).
- Derive win probability by comparing team distributions; convert to fair moneylines and totals.
Player‑based (advanced)
- Project each batter’s per‑PA quality vs. today’s pitcher handedness (regressed L/R splits).
- Project the starter’s per‑PA outcomes (K/BB/GB/HR) vs. this lineup; add times through the order decay.
- Build plate appearance → base/out state transitions (Markov / run expectancy).
- Simulate innings, then games (Monte Carlo) to get win/totals distributions.
- Layer bullpen usage logic and defensive/positional effects.
Start team‑based. It’s fast, auditable, and plenty strong for learning and small edges.
Inputs → transformations → outputs (the pipeline)
Inputs
- Aggregated team batting metrics (xwOBA, wRC+, ISO, K%, BB%) split by pitcher handedness.
- Pitcher skill (SIERA, xFIP, K‑BB%, GB%, Barrel%).
- Park factor (Runs, HR); weather scalar for HR/run rate.
- Bullpen rating / rest (last 3 days usage).
Transformations
- Opponent adjustments: vs. LHP/RHP; regress small samples back toward team means.
- Environment: multiply base run rate by park × weather factors.
- Run rate mapping: translate batting & pitching skill to expected runs (λ) for each team.
- Distribution: model runs with Poisson(λ) (or Gamma‑Poisson/NegBin for overdispersion).
Outputs
- Win probability: P(Home Runs > Away Runs).
- Fair moneyline: decimal
1 / p_win(convert to American as needed). - Totals probabilities: P(Over/Under N.5).
- Stake sizing suggestions (fractional Kelly or fixed %).
Park effects and weather, quickly
- Park Factor (PF): If PF_runs = 1.05, multiply expected runs by 1.05; if PF_HR = 1.20, boost HR‑driven components appropriately.
- Weather: Temp ↑ often increases HR/run rate; wind out/in changes flight. Apply a simple scalar (e.g., 0.95–1.10) to the offensive side.
- Home field: Add a small HFA to λ_home (e.g., +0.10 runs) or shift win probability post‑distribution.
Keep these adjustments modest and data‑driven; avoid doubling effects (e.g., park already embeds some weather realities).
Lineup uncertainty (and how to handle it)
- Use projected lineups day‑of; set a rule for missing stars (e.g., downgrade λ by −0.10 to −0.25 runs if a top‑3 bat sits).
- Pinch‑hitter / platoon risk: vs. LHP/RHP, adjust late‑game matchups; this usually matters more in advanced models.
- Recompute λ when lineups lock ~90 minutes pre‑first pitch.
Log every lineup change and its impact. This transparency is crucial for post‑mortems.
Compact case study (Google Sheets): from inputs to fair odds
We’ll build a team‑based Poisson model for a single game. The point is to show flow—not to claim this is the only or best method.
Assume today: Home starter is solid; Away lineup has power; weather favors hitters.
Parameters (put these in a small input block):
B1: lambda_home_base = 4.2 (home team baseline runs vs today’s SP)
B2: lambda_away_base = 3.8 (away team baseline runs vs today’s SP)
B3: park_runs_factor = 1.05
B4: weather_runs_factor = 1.03
B5: bullpen_adj_home = +0.00 (negative if strong pen)
B6: bullpen_adj_away = +0.15 (weak/tired pen)
B7: home_field_runs = +0.10
Adjusted expected runs (λ):
B9: lambda_home = B1 * B3 * B4 + B5 + B7
B10: lambda_away = B2 * B3 * B4 + B6
Build run distributions for each team (0–12)
A14: Runs B14: P_home(R) C14: P_away(R)
A15: 0 B15: =POISSON(A15,$B$9,FALSE) C15: =POISSON(A15,$B$10,FALSE)
A16: 1 B16: =POISSON(A16,$B$9,FALSE) C16: =POISSON(A16,$B$10,FALSE)
… fill down to Runs=12 (A27)
Joint grid and win probability
E14: Home\Away F14:0 G14:1 … R14:12
E15:0 F15: =$B15*$C15 G15: =$B15*$C16 …
… fill the matrix E15:R27 = outer product P_home * P_away
Win prob P(Home>Away):
B30: =SUMPRODUCT( (ROW($E$15:$R$27)-ROW($E$15)) > (COLUMN($E$15:$R$27)-COLUMN($E$15)), $E$15:$R$27 )
(That SUMPRODUCT counts all cells where home runs index > away runs index.)
Fair moneyline & totals
B31: Fair Home Decimal Odds = 1 / B30
B32: P(Over 8.5) = 1 – POISSON(8,$B$9+$B$10,TRUE)
B33: Fair Total 8.5 Decimal = 1 / B32
Market inputs:
B35: Market Home Odds = 1.95
B36: Market Over 8.5 = 1.90
EV checks:
B38: EV Home per $1 = B30*(B35-1) – (1-B30)
B39: EV Over per $1 = B32*(B36-1) – (1-B32)
Decisions:
B41: Home Bet? =IF(AND(B38>0, B35>(1/B30)),”YES”,”NO”)
B42: Over Bet? =IF(AND(B39>0, B36>(1/B32)),”YES”,”NO”)
Notes
- Poisson underestimates tail outcomes sometimes; if you observe persistent misfit, consider Negative Binomial for overdispersion or simulate.
- Don’t let market odds leak into λ estimation—use markets only to compare and for CLV tracking.
Add a small chart for P(Runs) to make it visual, and screenshot the input block + decision cells for the article.

From metrics to λ: mapping ideas
How do we get the baselines (B1 and B2)? Use skill to run‑rate mapping:
- Start from league average runs vs. the relevant pitcher handedness.
- Adjust by team batting xwOBA vs that hand relative to league baseline.
- Adjust pitcher by SIERA/xFIP vs that hand, mapped to runs allowed (regressed).
- Add park & weather scalars and bullpen penalty/boost.
- Cap extremes to avoid wild λ.
This mapping is where experimentation lives. Track out‑of‑sample performance and calibrate.

Validation: don’t skip this
- Backtest: rolling window; evaluate log loss/Brier for win prob, calibration for totals.
- CLV tracking: price you bet vs. close; sustained CLV outperformance beats short‑term ROI as a signal of real edge.
- Error audits: keep a checklist (lineups, odds conversion, wrong range fills, duplicated rows).
Document every change to your mapping and note its effect. Treat the model like a product.
Tooling and workflow
- Build in Sheets for transparency and speed; push repetitive transforms to Python/R later.
- Data hygiene: cache raw inputs, timestamp refreshes, and keep a “version” tab in your sheet.
- Automation: when ready, fetch daily stats via scripts/APIs and write to your sheet or database.
See also: Google Sheets for Betting Tutorial and How to Build Your First Sports Betting Model.
FAQs
Is Poisson good enough for MLB?
It’s a reasonable first approximation for team runs, especially with sensible λ. If your tails look off, test Negative Binomial or simulate.
Which single pitcher metric is best?
No silver bullet, but SIERA + K‑BB% + batted‑ball quality (Barrel%, GB%) is a strong trio for forward‑looking performance.
How much do park and weather matter?
Enough to move edges from −EV to +EV on the margins. Park/HR factors and hot‑weather days can shift totals and HR props meaningfully.
What about batter‑vs‑pitcher (BvP) history?
Usually too small‑sample to matter; treat as noise unless the sample is large and supported by skill metrics.
Can I model bullpens simply?
Yes—start with a pen rating and add/subtract ~0.1–0.3 runs depending on rest/quality.
A soft next step
If you want a structured path with templates and step‑by‑step videos, the Ultimate Modern Bettor’s Blueprint walks you from a clean Sheets build to disciplined execution and validation. The concepts here are free; the course compresses the timeline and mistakes. Or you can download my ready-to-use baseball betting model here.

