How ValuCast Works
← Back to rankingsAs of June 2026 · ValuCast H+P v1
| Component | Provenance |
|---|---|
| Hitting model | Built & validated by ValuCast |
| Hitting inputs | Baseball Savant xBA/xSLG |
| Pitching model | Built & validated by ValuCast — no third-party projections |
| Pitching inputs | Public MLB statistics |
| Steamer board | External comparison board; fair historical benchmark pending |
What ValuCast is
ValuCast turns player projections into values tuned to your league's categories, weights, and roster rules. You can value players from two sources: Steamer (an external comparison board, and the default) or ValuCast H+P, our own in-house projection.
The two boards
The default board values current-season actuals + Steamer rest-of-season. The ValuCast board values our own full-season projection. Flipping the toggle is useful for eyeballing differences, but it is not an apples-to-apples backtest; our real check is the held-out validation below.
Prospect Rank v1
The Prospects board is ValuCast's own prospect ordering. Top prospects are generated from a universal baseball profile first, then translated into a public rank and value. The score is built from factual current performance, age/level context, draft/signing investment, historical outcome patterns, and availability/sample risk.
How top prospects are generated
- Start with the current eligible prospect universe and MLBAM identity.
- Build each player's factual baseball profile: role, age, level, current MiLB stat line, sample size, draft/signing facts, ETA, and availability context.
- Score the profile through ValuCast's prospect model and universal outcome index.
- Apply sample, availability, and bucket calibration rules by group, not by name.
- Rank the final scores into one universal prospect board.
Category Fit is a separate league-settings view. It can help a user understand roster fit, but it does not generate the public prospect rank.
What can and cannot affect a prospect score
- Can affect score: Prospect Model v0.6, universal outcome context, MiLB performance rates and sample reliability, draft/signing facts, age/level context, and factual availability status.
- Cannot affect score: DD ranks, DD values, DD value history, public prospect rankings, market signals, and DD adapter ranks or scores. Those are display/comparison context only.
- Bucket calibration: applied by rule, not by name. Current rules cover lower-minors pedigree compression, thin upper-level pitcher samples, and upper-level hitters with full samples but limited game impact.
How the model works
For each player we weight recent seasons and regress toward the league average (more for small samples). Hitters are then age-adjusted and de-noised toward Statcast expected stats (Savant xBA/xSLG) before projecting. Pitchers are projected per batter faced with a continuous starting-vs-relieving usage blend (no hard starter/reliever cliff). Age adjustment applies to hitters only — the v1 pitching model has no aging curve, a planned future improvement.
Under the hood
A Marcel-style method: recent seasons weighted 5.0,4.0,3.0 (most recent first), regressed to the league mean, with per-component rate (events ÷ opportunities) reconstructed into counts. Hitters are age-adjusted and add Statcast input de-noising (blend actual contact/power toward Savant xBA/xSLG, redistributing into 1B/2B/3B/HR by the player's own extra-base mix). Pitchers use a continuous starter-probability blend so swingmen and converted arms aren't miscategorized; the v1 pitching model has no age curve (a planned improvement) and consumes no third-party projection.
Model equations
Season weighting is done per component as weighted
events ÷ weighted opportunities (not a weighted rate). For a component with
event count E and opportunities PA, weights 5.0,4.0,3.0:
rate = (5·E₋₁ + 4·E₋₂ + 3·E₋₃) / (5·PA₋₁ + 4·PA₋₂ + 3·PA₋₃).
Regression to the mean over N opportunities with a regression
constant n_reg (hitters 1200, pitchers 300):
projected_rate = (rate·N + league_rate·n_reg) / (N + n_reg), then the
projected count is rebuilt as projected_rate × projected_PA.
Age adjustment (hitters only) nudges hitter projections along an empirical aging curve. The v1 pitching model applies no aging curve.
Hitter de-noising (knobs α): blend the actual rate toward the
Savant expected rate, rate* = (1−α)·rate + α·x (x = xBA/xSLG), then
redistribute the extra hits/bases preserving the player's hit-type mix.
Pitcher role blend: with psp the starter
probability, each component is shifted continuously by
f[c]^(h_sp − p_sp) — no hard SP/RP split.
Worked example (HR rate). An age-29 hitter (near peak, age factor
≈ 1.0) with no Statcast movement: 30 HR / 600 PA,
26 / 580, 20 / 520
over the last three seasons (weights 5/4/3). Weighted
events ÷ weighted opportunities =
(5·30 + 4·26 + 3·20) / (5·600 + 4·580 + 3·520) = 314 / 6880 ≈ 0.046
HR per PA. Regressing toward a 0.033 league HR rate with
n_reg = 1200 gives
(314 + 0.033·1200) / (6880 + 1200) ≈ 0.0438.
Projected PA = 0.5·600 + 0.1·580 + 200 = 558,
so projected HR ≈ 0.0438 × 558 ≈
24.4 HR.
Validation details
We hold out future seasons (2020–2025), project forward from prior seasons only (no peeking), and score against simple baselines. Reported as a mean-absolute-error (MAE) ratio — below 1.0 means lower error than the baseline.
- Hitting vs classic Marcel, n = 1770 qualified hitter-seasons, correlation-win rate 0.519. qualified hitters (>= 200 actual PA, projectable, has prior season).
- Pitching vs persistence (last-year carry-forward), n = 2234 qualified pitcher-seasons, skill correlation-win rate 0.639. qualified pitchers (role-specific IP floor, projectable, has prior season).
Per-stat MAE ratios:
Hitting (vs classic): AVG 0.942 · OBP 0.959 · SLG 0.96 · OPS 0.951 — counting stats ≈ 1.0 (de-noising doesn't touch them).
Pitching (vs persistence): ERA 0.713 · WHIP 0.751 · K_9 0.834 · BB_9 0.715 · IP 0.981 · K 0.932.
W, SV and QS are reported separately and treated as lower-confidence — they depend heavily on team decisions and opportunity, not pitcher skill.
Track record — held-out scorecard
On seasons the model never saw:
| Step | Held-out result |
|---|---|
| Pitching vs persistence (skill) | 0.821 MAE ratio (~17.9% lower error) — IP and K roughly neutral; the win is driven by ERA / WHIP / K-9 / BB-9. |
| Hitting vs classic Marcel | 0.979 aggregate MAE ratio (~2.1% lower error) — gains concentrated in AVG/OBP/SLG/OPS. |
| reliability-weighted regression | tie — not shipped |
| in-house expected-stat model (own xBA) | shortfall — not shipped |
What we have and haven't proven
Our validation is against internal baselines (persistence and classic Marcel), which it beats on held-out data. ValuCast has not yet proven it beats Steamer or ZiPS: we lack matching archived preseason projections for a fair, apples-to-apples historical backtest. So Steamer is an external comparison board, with a fair historical benchmark pending — not a benchmark we've beaten.