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
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.
Fetching stats from Baseball Reference…
Requests are spaced out to stay within their rate limits, so this can take 5–15 seconds.