Harbor Player Rating (HPR)
One number per player for the 2026 season, rated and ranked within his own division (D1, D2 or D3) and adjusted for the strength of every opponent he faced, with a measured share of credit for the team he plays on. It's Harbor's own number: fantasy points, fantasy ranks, trade values, projections and pick'em don't use it, and it doesn't use them.
The scale
- 50 is an average regular (5+ games) at his position in his division. Higher is better, and the scale is open-ended: the best players are well above 100, nothing is capped at 100.
- In D1, every 12 points is one goal per game of schedule-adjusted value above or below that average.
- In D2 and D3 the spread at each position is matched to D1's, so a number means about the same standing within its own division: a D3 attackman at 68 stands where a D1 attackman at 68 does among D1 attackmen.
- Numbers aren't comparable across divisions. A D2 115 and a D1 115 are not the same player; there is no overall or cross-division ranking anywhere on Harbor.
- Every rating comes with a band: plus or minus one standard deviation of what the data can tell us within his division. A player with few touches has a wide band.
What goes in
- Every 2026 final and box score: D1 from Harbor's box scores (face-offs included), D2 and D3 from NCAA's box scores, the same feed as Scores.
- Per game: a goal counts 1, an assist 0.5. Ground balls, caused turnovers and turnovers count what they were worth in goals across every 2026 game (about +0.40, +0.45 and −0.46): their weights come from regressing real game margins on them, not from a guess.
- D1 face-off men earn face-off wins above what an average man would win against that opponent. Goalies earn saves above the league's save rate.
- Defenders also get a small share (10%) of how many fewer goals their team allowed than expected.
What “schedule-adjusted” means
First, a team model fits every final in D1, D2 and D3 at once: how many goals each team scores and allows, given who it played and where. Then each game's production is scaled by that opponent. A goal against a strong defense counts for more than one against a weak defense; a caused turnover against a strong offense counts for more.
The adjustment has two parts: how hard the opponent was within the player's own division, and one conversion per team onto a common scale. So a goal by an average D3 team against an average D3 defense counts about a quarter to a third of a goal against an average D1 defense, while a top D3 team's goals convert at a better rate. That's how a schedule full of weak teams is discounted, even within a division.
Small samples and the team
- A rating blends what the player did with what players in his role on his team usually do (his team's strength and his share of the touches). The more he touches the ball, the more the rating is his own; a bench player with a few touches stays close to his team and role. How much to blend is measured separately for each position in each division.
- On top of that, a player gets a documented share of credit for his team's strength within his division: 0.45 of a position spread for a full season on a team one standard deviation above his division's average (less if he played fewer of its games), and the same debit on a weak team. That's why a depth middie on a top team usually rates above a weak team's leading scorer, while a genuine star on a weak team can still rate higher.
Data gaps, handled honestly
- No face-offs in D2/D3 box scores. D2/D3 face-off men are rated on ground balls, caused turnovers and turnovers, with a wider band and the flag No face-off data. A listed midfielder who wins most loose balls (4+ a game, most of his touches) is rated as one (Rated as a FOGO from his ground balls).
- Missing goalie lines. Many D2/D3 box scores have no goalie line; those games add nothing to a goalie's rating and he is flagged Partial goalie data. D2/D3 goalie numbers are capped so one long-record goalie can't run away with a division.
- No minutes. Box scores don't record skaters' minutes, so playing time is measured by touches.
- Thin samples are flagged Low sample; players found in box scores but not on a roster are flagged Box score only, and 2026 players who left the roster Not on the current roster. Nothing missing is filled in with a guess.
Leaderboard rules
- Ranks exist only within a division: a rank in his division, and a rank in his division at his position. No overall rank, no combined list.
- 5 games played to be ranked. Everyone else still has a rating and band, marked Unranked: fewer than 5 games.
- D2/D3 face-off men without face-off data are listed by the low end of their band, not their middle, with the flag shown.
An example: depth on a top team vs. a star on a weak team
- Tufts' Bowman Rhinesmith, a depth midfielder (13th of Tufts' middies by touches, 6 games), rates 42.1: Tufts is the strongest team in D3 and he dressed for most of its games.
- Juniata's Brayden Yeager (12 goals, 34 assists) rates 26.2: his production came against weak defenses, so it's discounted heavily, and Juniata is well below the D3 average.
- Warren Wilson's Jayshawn Bruce (24 goals, 15 assists in 11 games) rates 49.8, still above every depth midfielder of the top D3 teams: a real star on a weak team can win.
For the curious: how D1, D2 and D3 connect
Opponent strength across divisions needs one more number per division: how many goals an average team of the division is from an average D1 team. These “levels” sit underneath the ratings; they never mix the divisions' rankings.
- 2026: D2 −13.62 goals (± 1.33) and D3 −16.33 goals (± 1.38) vs an average D1 team, from the prior below plus this season's 5 D2–D3 games.
- The prior comes from 2022–2025 NCAA results, with an extra 1.5 goals of uncertainty for season-to-season drift.
Two kinds of evidence. Program bridges: a program that moved from D2 to D1 links the two scales, because a program's strength carries over from one season to the next. Cross-division games: each D2–D3 game measures the gap directly. Teams are placed in a division by their schedule (most of their opponents), so programs in a transition year count where they actually played.
| Season | Finals | D1–D2 by schedule | D2–D3 games | Bridges |
|---|---|---|---|---|
| 2022 | 1,092 | 0 (67 by board: transition programs) | — | — |
| 2023 | 1,152 | 0 (35 by board: transition programs) | — | Queens (14.3 goals), Lindenwood (12.4 goals) |
| 2024 | 3,182 | 0 (18 by board: transition programs) | 22 | Le Moyne (11.1 goals) |
| 2025 | 3,135 | 0 | 6 | Mercyhurst (13.5 goals) |
| 2026 | this season | 0 | 5 | — |
- Bridges: Queens (D2 in 2022, D1 in 2023); Lindenwood (D2 in 2022, D1 in 2023); Le Moyne (D2 in 2023, D1 in 2024); Mercyhurst (D2 in 2024, D1 in 2025). Each gives one D1–D2 step of about 11–14 goals.
- No D1–D3 game exists in any season, so D3 is tied to D1 only through D2. That two-step link is the weakest part of the model, and its uncertainty is kept with every D2/D3 player inside the model (it moves a whole division alike, so it doesn't change anyone's rank).
- The levels are refreshed once a season, with the finished season's bridges and cross-division games added.
Model hpr-2026.5. Recomputed after new finals and nightly; one run rates every D1, D2 and D3 player.