How Estimated OPR is calculated

OPR = Offensive Production Rating

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

About the stat

I have always wanted to create a baseball stat that is simple yet legitimate, and fun for fans to track every day. I wanted it to capture baseball at its core. So I came up with point values for every possible outcome in every possible situation. That way, my stat leaves nothing out: every play result is accounted for, with a value based on how much it helped or hurt the team offensively.

As fans, we all share similar feelings when we watch our favorite teams play. There are certain situations where a batter doesn't come through, the run column doesn't grow, and it makes us all upset. When you look at baseball at its core, you realize the importance of certain plate appearances, and how simply putting the ball in play gives you a better chance of scoring. My stat shows who is truly producing the most for their team from an offensive point of view.

I call my stat OPR, which stands for Offensive Production Rating. It breaks down into two separate results: OPR and OPP (Offensive Production Points).

  • OPP is the total points a player accumulates.
  • OPR is total points divided by plate appearances.

I believe OPR is the more telling of the two, because it shows how players who had fewer plate appearances, or who missed time, were still very productive when they did play. OPP will generally be led by the best players with the most plate appearances, and it adds a fun challenge: trying to reach the 1,000-point club each season.

I have tracked every MLB player with my stat since 2023. However, I always wanted to be able to compare today's players to players of the past. Because my stat can't be programmed into a computer (parsing play-by-play results is too difficult), I created an estimate of my OPR and OPP stats instead. Using data that baseball stats sites already make available, I came up with an equation that comes within .04 of the real OPR for almost every player I tested it on. Many players had the exact same totals, or were within 10–20 total points. That's why I decided to put every player I could find together on one site, ranked season by season, so you can see which players of today compare to those of the past.

What makes a good season?

Where a season's OPR and OPP (total points) fall, from the very best (Tier I) down.

TierOPROPP (points)
Tier I2.00+1,400+
Tier II1.80 – 1.991,300 – 1,399
Tier III1.70 – 1.791,200 – 1,299
Tier IV1.60 – 1.691,100 – 1,199
Tier V1.50 – 1.591,000 – 1,099
Tier VI1.35 – 1.49900 – 999
Tier VII1.20 – 1.34800 – 899
Tier VIII1.05 – 1.19700 – 799
Tier IX League average0.95 – 1.05600 – 699
Tier X0.75 – 0.94500 – 599
Tier XI0.60 – 0.74400 – 499
Tier XIIBelow 0.60Below 400

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.