How close is our RPI to the NCAA's?
Rankings on every page use the NCAA's published RPI (current snapshot Through Games May. 24 2026). Our own RPI computation runs alongside as a parity check.
Parity summary
Solid
Across 308teams sampled against the NCAA's published rank. A 0-rank delta would fill the bar; larger deltas shrink it proportionally.
Where the ranking comes from
Rankings on every page use the NCAA's published RPI. The committee folds quality-win and bad-loss adjustments on top of base RPI, so the bracket, bubble, host designations, and the conference table all read the NCAA's rank.
The NCAA refreshes its RPI weekly during the season; the as-of date appears at the top of the rankings table. Base RPI is also computed locally from the same game results and shown in the RPIcolumn. The gap between the two is roughly the committee's quality-win / bad-loss adjustment.
The base RPI formula (post-2013)
RPI = 0.25·WP1 + 0.50·WP2 + 0.25·WP3
- WP1: adjusted team WP
- Each game contributes a weighted W or L based on venue: road wins and home losses count
1.3×; home wins and road losses count0.7×; neutral games count1.0×. WP1 = weighted wins / (weighted wins + weighted losses). - WP2: opponents' adjusted WP
- For each game on the schedule, take the opponent's adjusted WP with games against the target team removed, then average. An opponent faced three times contributes three samples.
- WP3: opponents' opponents' WP
- For each opponent, average their opponents' unadjusted WP; then average those across the schedule. No venue weighting at this layer.
Only D1-vs-D1 games count toward base RPI. Games against non-D1 opponents are dropped entirely.
Components inspector
Pick a team to see the three RPI components broken out. Useful for sanity-checking why a team with a strong record sits below one with a worse record but a much tougher schedule.
What this covers (and what it doesn't)
- Covered: RPI for every D1 team, the NCAA's published rank, the top 64 bracketed into 16 regionals by national seed, per-conference roll-ups, and a scenario simulator that re-ranks the field on hypothetical results.
- Not covered: conference tournament auto-bids that haven't been decided yet, and quality-win / bad-loss bonus adjustments on top of base RPI (those reach us through the NCAA's published rank, not through our own number).
Bracket projection accuracy
Once Selection Monday lands, /bracket shows the committee's official 64-team bracket. Before then it shows our projection, composed in five passes on top of the field:
- Field of 64. Conference auto-bid winners locked in first, remaining slots filled top-down by canonical RPI rank among teams above .500 vs D1.
- Committee-style national-seed reordering.The top-16 host pool is re-sorted by a blend of absolute RPI rank (weight 0.5) + road-win-percentage rank (weight 0.15), with a 1.5-position bonus for conference-tournament champions and a 1.5-position SEC bonus. Road W% uses NCAA's authoritative split from the RPI page (we persist it via
team_split_metrics). The SEC bonus captures committee's observed power-conference bias (7/16 hosts in 2026 were SEC). Weights chosen by 14,400-config grid search against 2026 Selection Monday; re-fit when additional historical brackets are seeded. - S-curve placement. Top 16 host the 16 regionals; seeds 17–64 paired in via the standard [N, 33−N, 32+N, 65−N] S-curve.
- Opening-round conflict rules. No regular-season rematches and no intra-conference matchups in the 1v4 or 2v3 openers, resolved by swap-within-band so the S-curve fairness ordering survives.
- Optimal-geography assignment.Per seed band, solve the assignment problem (bitmask DP, optimal) to minimize total travel distance from each non-host team to their regional's host. Backed by hand-curated stadium coordinates in
team_venues.
The /bracket page surfaces live accuracy when both views exist ("X/64 placements, Y/16 hosts"). Weights are jointly tuned against the 2024 + 2025 + 2026 official brackets via 500k+ configuration grid searches — single-year fitting overfits badly (2026-only weights scored 6/16 on 2025, but the multi-year fit holds 7/16). The full pipeline scores:
- 2026 hosts: 14/16 (87.5%) · placements 20/64
- 2025 hosts: 7/16 (43.75%)
- 2024 hosts: 7/16 (43.75%)
- Per-year ceilingwith year-specific fit + trend + conf-strength features: 14 / 10 / 12 — but the weights that hit these don't generalize.
Residual analysis across all three years shows the committee makes big judgment calls that aren't derivable from public features. Examples we can't formulaically capture:
- 2024:Arizona RPI #31 → NS13 (+18). The committee bumped a Pac-12 team to host in the conference's final season — historical/political consideration.
- 2025:Georgia RPI #2 → NS7 (-5) and Coastal Carolina RPI #8 → NS13 (-5). Two big demotions in the same year that we can't explain from W-L, road record, conference, or RPI trend.
- 2026: Mississippi State (SEC, RPI #13) was put at NS14 while Oregon (Big Ten, RPI #15) got NS11 — same W-L, same road W%, different committee judgment.
Field membership is more accurate than slot placement: 62/64 on 2026. The 2 missed field teams (NC State, Arizona State over our Pittsburgh, Mercer) are bubble at-large judgment calls. To meaningfully push past these numbers requires modeling committee behavior we genuinely can't see from outside the room.
The forward-prediction accuracy ceiling — based on three years of data — is roughly 50–60% hosts on a typical yearand 80%+ on an "easy" year where committee judgment aligns with the model. Each additional year of ground-truth data tightens these weights further.
Scenarios and Path
Scenarios lets you pick winners for games left on the schedule and see how the field shifts. Path inverts that: pick a team and a goal (hosting, the field of 64, the top 25) and the simulator finds the games it takes to get there.
Predicted ranks are anchored to the NCAA's current release. For each team we record the gap between our base-RPI rank and the NCAA's. When you pick a winner for an upcoming game, we recompute base RPI with that result, then add the team's gap back in to project where the NCAA's next release would put them. Quality-win / bad-loss adjustments are held constant per team, which is a close approximation for any single pick but drifts if you pick enough games to move a team between bonus tiers.
Data sources
Published RPI rank: NCAA's own table at ncaa.com/rankings/baseball/d1/rpi, updated weekly during the season.
Game-by-game results feeding the RPI calculation and the scenario simulator come from NCAA's contests API. A Supabase Edge Function fetches one calendar day at a time (~106 calls per scrape, ~8-15 seconds wall time). pg_cron pings the function every minute; it self-skips unless the last successful run is at least 10 minutes old. Team logos via the ESPN media CDN.
For the 2026 season this covers 308 D1 teams and 8,301 games.
Open source
MIT licensed at github.com/kyleseneker/cbb-hub. The Python engine is the spec; the TypeScript port that runs in your browser is parity-tested against it on every commit.