Daily Performance
Player ELO fluctuations for the selected date. Daily + Weekly Movers. 2026 Season
Hot Form Tape
High GainersCold Form Tape
Buy-low contextWeekly Hot Form Tape
Weekly Cold Form Tape
Last 7 DaysLeaderboard
Fantasy production ranks (default). Form tape is a separate hot/cold view. 2026 Season
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.
Talent Leaderboard
Players ranked by skill dimension ELO. 2026 Season
Contact
| # | Player | Team | Talent ELO | Tier | Base ELO |
|---|---|---|---|---|---|
| Loading... | |||||
Matchup Predictor
Predict plate appearance outcomes from scaled batter production + pitcher skill ELO. 2026 Season
⚾ Select Batter
⚽ Select Pitcher
Pitcher vs Team
Analyze how a pitcher matches up against every batter on a team. Favor labels are relative to the team average Pred PA wOBA in this batch.
⚽ Select Pitcher
⚾ Select Team
Guide
Current V6.1 formulas behind Daily, Leaderboard, Talent, and Matchup
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 production —
0.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.
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.
| Tier | Percentile |
|---|---|
| Elite | Top 2% (≥98th) |
| High | Top 10% (≥90th) |
| Above Avg | Top 25% (≥75th) |
| Average | 40th–75th |
| Below Avg | 20th–40th |
| Low | 8th–20th |
| Cold | Bottom 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.
| Rule | Value |
|---|---|
| Production min PA, batters | 100 |
| Production min PA, pitchers | 80 |
| Full-season confidence, batters | 400 PA |
| Full-season confidence, SP / combined | 200 PA |
| Full-season confidence, RP | 80 PA |
| Max confidence penalty | 100 ELO |
| Two-way inclusion | 30+ 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 V | Value | Notes |
|---|---|---|
| HR | 1.00 | Maximum batter win |
| Triple | 0.88 | |
| Double | 0.72 | |
| Single | 0.52 | ≥ 0.10 above BB so contact cannot fake power |
| BB / HBP | 0.40 | IBB 0.35 |
| Error | 0.45 | Near-neutral; not the pitcher’s fault |
| FC / SAC | 0.28 / 0.18 | |
| Out / K | 0.00 | K is not extra-rewarded on Form |
| GIDP | −0.15 | Worse 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 K | K | Event K | K |
|---|---|---|---|
| HR | 12 | StrikeOut | 10 |
| GIDP | 11 | Triple | 9 |
| Double / Out | 8 | Single / FC | 7 |
| BB | 6 | IBB / HBP / SAC | 3 |
| Error | 0 |
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
| Stadium | Park Factor | RV 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.00 | 0.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
| Board | Inputs (weight) | Direction |
|---|---|---|
| Contact | Z-Contact% (34), Chase% (22), EV (14) | Chase lower is better |
| Power | Barrel% (30), Hard-Hit% (24), EV (16) | All higher |
| Discipline | Chase% (32), O-Swing% (18), Z-Contact% (10) | Chase / O-Swing lower |
| Clutch | RISP Form ELO only | 10+ RISP PA required |
Pitcher dimensions
| Board | Inputs (weight) | Direction |
|---|---|---|
| Stuff | SwStr% (34), CSW% (26) | Higher |
| BIP Suppression | Z-Contact% (28), O-Contact% (22), CSW% (10) | Contact rates lower |
| Command | FPS% (30), O-Swing% (18), CSW% (12) | All higher (chase induced) |
| Clutch | RISP Form ELO only | 10+ 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.
| Event | Intercept | Scale | wOBA weight |
|---|---|---|---|
| Strikeout | −1.22 | −0.95 | 0.00 |
| Walk | −2.38 | +0.62 | 0.69 |
| Single | −1.92 | +0.48 | 0.88 |
| Double | −3.06 | +0.34 | 1.24 |
| Triple | −5.26 | +0.12 | 1.56 |
| Home run | −3.35 | +0.72 | 2.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.3from 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