Subscribe to Access ELO Data

Get full access to daily performance, leaderboards, talent rankings, matchup predictions, and more for $25/year.

Sign Up

Hot Form Tape

High Gainers
Mean-reverting form Δ today. Sell-high context — not ROS #1.

Cold Form Tape

Buy-low context
Mean-reverting form Δ today. Buy-low when process metrics still strong.

Weekly Hot Form Tape

Cumulative form-tape Δ (mean-reverting — not ROS rank). Sell-high context.
Loading...

Weekly Cold Form Tape

Last 7 Days
Loading...

Production (default): batters ranked by run-value ELO. Pitchers default to SP — production is 55% form + 35% SwStr/CSW + 10% muted matchup residual. Form reverts; do not treat #1 Form as ROS rank.

Fantasy Edge — Disagreement

Buy: production > form. Fade: form > production.

Buy / Start
Fade / Caution
# Player Team Production iActive rank: Production = matchup/run-value ELO (batters). Form = mean-reverting tape. Confidence-adjusted. 1500 ≈ average on form scale. Tier iLabel on active ELO. Form scale is compressed near 1500; use percentiles and process metrics for fantasy. EV iAverage exit velocity in mph. MLB average ~88 mph. Higher = harder contact. Bat Spd iAverage bat speed in mph from Savant bat tracking. Higher bat speed is a leading power and contact-quality signal. HH% iHard-hit rate (95+ mph exit velo). MLB average ~35%. Higher = more dangerous hitter. Barrel% iBarrel rate (optimal EV + launch angle). MLB average ~7%. Higher = elite power. Chase% iSwing rate on pitches outside the zone. MLB average ~30%. Lower = better plate discipline. SwStr% iSwinging Strike Rate. MLB average ~11%. Higher = more strikeouts. O-Swing% iChase Rate (swings outside zone). MLB average ~31-32%. Higher = better deception. Z-Contact% iZone Contact Rate. MLB average ~85%. Lower = more in-zone whiffs. O-Contact% iOut of Zone Contact Rate. MLB average ~65%. Lower = better putaway pitches. CSW% iCalled Strikes + Whiffs%. MLB average ~26%. 30%+ = elite command+stuff. FPS% iFirst Pitch Strike%. MLB average ~60%. 62%+ = elite at getting ahead. Pred Score iPredictive breakout score. Higher = better underlying skills. ABS iAdjusted Breakout Score based on skill metrics. 70+ = strong candidate. Last Game
Loading...
Batting
Pitching

Contact

In-zone contact and chase control vs season medians
Inputs Z-Contact% (34), Chase% (22), EV (14)
Floor 100+ PA · 20% form ELO blend
Season-median z-scores, not PA outcomes. Chase lower is better.
# Player Team Talent ELO Tier Base ELO
Loading...

⚾ Select Batter

⚽ Select Pitcher


⚽ Select Pitcher

⚾ Select Team

CBS Fantasy Points

What the ratings are

Every plate appearance updates two independent ELO systems. The leaderboard then displays a fantasy production rank that is not the same number for batters and pitchers.

  • Form (Leaderboard) ELO — wOBA-spaced discrete outcomes vs expected score, plus role-aware mean reversion. Hot/cold tape. Floor 1,200. Not rest-of-season value.
  • Batter production — matchup-path run-value ELO. Continuous, park- and state-adjusted, strict zero-sum. Default batter rank.
  • Pitcher production0.55×form + 0.35×SwStr/CSW process + 0.10×volume-normalized matchup residual. Raw matchup pitching ELO is volume-poisoned and is never a public rank by itself.

Leaderboard defaults to Production, pitchers default to SP. Use Form only as short-term tape. Outcome spacing is HR » XBH » 1B » BB; a contact heater cannot outrank true damage on Form the way the old 0.80/0.75/1.0 weights allowed.

How to use the board

  • Production — who is producing fantasy-relevant damage (batters) or process-backed skill (pitchers).
  • Form — who is hot or cold this week. Mean-reverts; do not treat #1 Form as ROS rank.
  • Disagreement — batters: Buy = production z > form z, Fade = form z > production z. Pitchers (SP, 80+ PA): Process Lead = high SwStr/CSW vs middling form; Results Lead = high form vs soft process.
  • Presets — batters: Overall / Power (Barrel%) / AVG-Contact / Discipline (Chase% low). Pitchers: Overall / K Stream (SwStr%) / CSW% / FPS%.
  • Daily Hot/Cold — form-tape daily Δ only. Not ROS value.
Do not compare a 2,400 batter production ELO to a 1,610 pitcher production score. Different scales. Rank within role, then use percentiles.

Tiers (role percentile)

Tiers are the player's percentile in the active rank distribution (production or form). Absolute 1,700+/1,800 “Elite” cutoffs are obsolete under mean reversion — Form compresses near 1,500.

TierPercentile
EliteTop 2% (≥98th)
HighTop 10% (≥90th)
Above AvgTop 25% (≥75th)
Average40th–75th
Below Avg20th–40th
Low8th–20th
ColdBottom 8%

Sample floors and confidence

Displayed rank is elo_raw − 100 × √(1 − PA / threshold). Threshold is the lesser of the role full-season target and the 90th-percentile PA in the current pool, never below 30.

RuleValue
Production min PA, batters100
Production min PA, pitchers80
Full-season confidence, batters400 PA
Full-season confidence, SP / combined200 PA
Full-season confidence, RP80 PA
Max confidence penalty100 ELO
Two-way inclusion30+ PA in each role

Form can show thinner samples; they just get the uncertainty haircut. Production hides them.

Data

  • Statcast pitch-level data rolled to plate appearances via the MLB Stats API
  • Per-PA run-expectancy change from Statcast; 24-state RE24 baseline for normalization
  • xwOBA for matchup-path quality-of-contact only (not Form)
  • Park factors from data/fangraphs/mlb_park_factors.csv

Starting point

Every player starts at 1,500 on both paths. Form is floored at 1,200. Matchup/production is not floored — a floor would break zero-sum.

Form path (leaderboard ELO)

Each PA with a run-value is scored as a discrete outcome V, compared to expected E_bat, then mean-reverted:

E_bat = 1 / (1 + exp(−(bat_form − pit_form) / 400 + 0.693))
Δbat = 12 × (V − E_bat) − λ × (bat_form − 1500)
Δpit = 12 × ((1 − V) − (1 − E_bat)) − λ × (pit_form − 1500)

The 0.693 offset makes E_bat = 0.333 at equal ratings. That is expected outcome value V, not OBP. Pitchers still have the advantage. Mean-reversion λ is 0.005 for batters, 0.003 for SP, 0.007 for RP.

Outcome VValueNotes
HR1.00Maximum batter win
Triple0.88
Double0.72
Single0.52≥ 0.10 above BB so contact cannot fake power
BB / HBP0.40IBB 0.35
Error0.45Near-neutral; not the pitcher’s fault
FC / SAC0.28 / 0.18
Out / K0.00K is not extra-rewarded on Form
GIDP−0.15Worse than an out

Matchup path (batter production)

Continuous run value, strict zero-sum. Quality of contact lives only on this path.

adjusted_rv = actual_rv − (park_factor − 1) × 0.1
rv_diff = adjusted_rv − mean_rv[base_out_state]
k_eff = EVENT_K[result] × physics_mod
Δbat = k_eff × rv_diff    Δpit = −Δbat

physics_mod = 1 + 0.3 × (xwOBA − 0.315) / 0.315, clamped to [0.70, 1.30]. Non-BIP events (K, BB, IBB, HBP, SAC, E) use 1.00. A barreled out still gets partial credit; a bloop single is discounted.

Event KKEvent KK
HR12StrikeOut10
GIDP11Triple9
Double / Out8Single / FC7
BB6IBB / HBP / SAC3
Error0

Fielding errors: if the batter would gain matchup ELO, that gain is zeroed; if the pitcher would lose, that loss is zeroed. Form still applies V = 0.45. Errors are not a free win for the batter.

Park examples

StadiumPark FactorRV Adjustment
Coors Field (COL)1.13−0.013 (run-friendly, RV discounted)
T-Mobile Park (SEA)0.91+0.009 (run-suppressing, RV boosted)
Yankee Stadium (NYY)1.000.000 (neutral)

Pitcher production and skill ELO

Raw matchup pitching ELO is volume-poisoned (workhorse SPs get dragged by PA count). Public ranks never use it alone.

Production score (leaderboard Production track):
process = 1500 + (SwStr − 11) × 8 + (CSW − 28) × 1.5 clamped [1350, 1750]
mu_norm = 1500 + ((matchup − 1500) / PA) × 200 × 0.25 clamped [1300, 1700]
production = 0.55 × form + 0.35 × process + 0.10 × mu_norm

Skill ELO (matchup predictor, two-start, start/sit): form ELO plus clamp((SwStr − 11) × 3, −25, +40). No matchup residual.

Clutch (RISP) track

Parallel Form-path ratings updated only when state % 8 ≥ 2 (runner on 2nd and/or 3rd). Same α = 12 and same role λ. Shown on the Talent → Clutch board. Requires 10+ RISP PAs.

Two-way players and OHLC

Batting and pitching ratings are independent. A two-way player (30+ PA each role) appears on both boards with a TWP badge. Daily candles are Form-path Open/High/Low/Close. Green = close > open. MA5 / MA15 smooth noise.

Talent is not a third ELO path

Contact / Power / Discipline / Stuff / BIP Suppression / Command are season-median z-score blends, not plate-appearance outcome models. They replaced the retired plate-appearance outcome weights that used to drive this tab.

skill = 1500 + Σ clip(z, −2, 2) × weight + 0.20 × (form_elo − 1500), floored at 1,200. Missing metrics drop out and remaining weights are renormalized. Sample floors: 100 PA batters, 60 PA pitchers. Medians are computed from the current season pool, not hardcoded league averages.

Batter dimensions

BoardInputs (weight)Direction
ContactZ-Contact% (34), Chase% (22), EV (14)Chase lower is better
PowerBarrel% (30), Hard-Hit% (24), EV (16)All higher
DisciplineChase% (32), O-Swing% (18), Z-Contact% (10)Chase / O-Swing lower
ClutchRISP Form ELO only10+ RISP PA required

Pitcher dimensions

BoardInputs (weight)Direction
StuffSwStr% (34), CSW% (26)Higher
BIP SuppressionZ-Contact% (28), O-Contact% (22), CSW% (10)Contact rates lower
CommandFPS% (30), O-Swing% (18), CSW% (12)All higher (chase induced)
ClutchRISP Form ELO only10+ RISP BF required

What the predictor actually uses

Not raw leaderboard ELO. Not talent z-scores. The PA model was calibrated on Form-scale diffs (~±150). Raw batter production (often 2,000–2,700) would saturate the logistic, so production is compressed first.

scaled_prod = 1500 + (batter_production − 1500) × 0.15
batter_model = 0.55 × scaled_prod + 0.45 × batter_form
pitcher_model = pitcher_skill_elo (form + SwStr blend; see Engine)
diff = batter_model − pitcher_model

Output: P(K), P(BB), P(1B), P(2B), P(3B), P(HR), P(Out). Directional, not betting-calibrated.

Logistic mapping

elo_feature = diff / 100
P_raw(event) = sigmoid(intercept + scale × elo_feature + park + platoon + rest + weather)

If the non-out mass exceeds 0.98 it is scaled back to 0.98. P(Out) = 1 − Σ P_raw, then the seven events are renormalized. At diff = 0 the intercepts recover league-average rates: ~23% K, ~8.5% BB, ~3.4% HR.

EventInterceptScalewOBA weight
Strikeout−1.22−0.950.00
Walk−2.38+0.620.69
Single−1.92+0.480.88
Double−3.06+0.341.24
Triple−5.26+0.121.56
Home run−3.35+0.722.00

Expected PA wOBA is the probability-weighted sum of those weights. Matchup Lift vs Neutral is percentage points vs diff = 0.

Context adjustments

Added to every event’s linear term. They do not change stored ELO.

  • Park: (park_factor − 1) × 0.5 (Coors 1.13 → +0.065)
  • Weather: (launchpad_index − park_factor) × 0.3 from the weather cache; miss is ignored
  • Platoon: opposite-hand +0.10, same-hand −0.06, switch-hitter +0.06
  • Rest: reserved, currently 0

Favor labels

  • Single matchup: composite = elo_feature + Σ context. Batter if > 0.10, pitcher if < −0.10, else neutral. Confidence = min(|composite| / 0.5, 1).
  • Pitcher vs Team: favor is relative to that batch. A batter is favored only if Pred PA wOBA is more than 0.020 above the team average in the run. Minimum 50 batting PA. Home park defaults to the opponent unless you override it.

⚠ Disclaimer

This project is for demonstration and analytical purposes. ELO ratings represent one approach to player evaluation and do not capture defense, baserunning, or game context beyond run expectancy. Data sourced from MLB Statcast via Baseball Savant. Should not be considered definitive skill assessments.

ELO methodology inspired by FanGraphs PlayerELO