How Estimated OPR is calculated
Estimated OPR scores a hitter's season by awarding points for productive outcomes and subtracting points for rally-killing outs, weighted by the base/out situation, then divides by plate appearances.
Total points = positive points − negative points
Estimated OPR = total points ÷ plate appearances, rounded to two decimal places
Estimated OPR = total points ÷ plate appearances, rounded to two decimal places
Positive points
| Single | ×3 |
| Double | ×5 |
| Triple | ×6 |
| Home run | ×5 |
| RBI | ×3 |
| Walk / hit by pitch | ×3 |
| Net stolen bases (SB − CS) | ×2 |
| Sacrifice hit | ×2 |
| Reached on error | ×1 |
| Productive out | ×1 |
| Runner advanced from 2nd, 0 outs | ×1 |
| Runner scored from 3rd, < 2 outs | ×1 |
Negative points
| Strikeout, bases empty or runner on 1st | ×1 |
| Strikeout, runner on 2nd (or 3rd with 2 outs) | ×3 |
| Strikeout, runner on 3rd with < 2 outs | ×4 |
| GIDP, runner on 1st | ×3 |
| GIDP, runner on 2nd | ×4 |
| GIDP, runner on 3rd | ×5 |
| Other out, runner on 2nd (or 3rd with 2 outs) | ×2 |
| Other out, runner on 3rd with < 2 outs | ×3 |
Where the data comes from
Each calculation reads two Baseball Reference pages: the player's batting page (situational batting table) and the season's batting splits page (season totals and bases-occupied splits). Play-by-play splits are not available for every season, especially before the 1910s.
Being a good citizen
- Requests are spaced at least a few seconds apart. Sports Reference blocks clients that make more than 20 requests a minute.
- If the site says we're going too fast (HTTP 429), new lookups pause automatically for the cool-down period instead of retrying and extending the block.
- Temporary network problems and server errors are retried with back-off.
- Every result is saved, so viewing it again never hits Baseball Reference. Use Refresh on a result to pull fresh numbers, for example during an in-progress season.