All methodology
Live · 2020–20262026 is in progress; entries are flagged Live

IBB Decision Grader — Methodology

Grading intentional walk decisions by comparing the matchup gain against the run-expectancy cost of putting an additional runner on base.

Key findings (2020–2026)

3,124
IBBs graded
2.5%
Good IBB rate
−0.140
Mean runs / IBB
0.168
Avg RE cost

97.5% of intentional walks in this dataset were value-negative: the run-expectancy cost of adding a runner almost always exceeded the matchup gain from bypassing the walked batter. The average IBB costs the issuing team approximately 0.14 expected runs. The good news: teams issued ~14.9 IBBs per season on average (down substantially from pre-2017 levels), so the total annual cost is roughly 2–3 runs per team per season.

What we are grading

An intentional walk (IBB) is a deliberate, manager-called decision. The pitching team chooses to put the current batter on base — raising the batting team's run expectancy — in exchange for the right to face a (presumably) weaker on-deck hitter.

We are grading the decision, not the players. The question is: at the moment the IBB was signaled, did the expected matchup improvement justify the run-expectancy cost?

Note: this module grades from the fielding team's perspective— it is the pitching team (and their manager) whose decision we evaluate.

Data source

All inputs come from Statcast event-level data (2020–2026) via pybaseball. Intentional walks are identified by events == 'intent_walk'. No external player-stats API is required — batter wOBA is computed directly from the woba_value and woba_denom Statcast fields present in the same parquets used by the rest of the pipeline.

Run-expectancy cost of the IBB

An IBB always increases the batting team's run expectancy (RE24). The cost is the difference in expected future runs between the post-IBB base-out state and the pre-IBB state, plus any run immediately forced in (bases-loaded IBB):

re_cost = RE(post-IBB state, outs) - RE(pre-IBB state, outs) + runs_forced_in

Post-IBB base state is deterministic: the batter goes to 1B; runners advance only if forced (runner on 1B is forced to 2B; runner on 2B is forced to 3B if 1B is also occupied; etc.). We use the same RE24 table (computed from Statcast 2020–2026) as the rest of the pipeline. re_cost is always non-negative.

Batter and next-batter wOBA

For each IBB, we compute the season wOBA for two players:

  • Batter wOBA: the player being intentionally walked. Computed from sum(woba_value) / sum(woba_denom) for that player in the same season, excluding IBBs (they have woba_denom = 0in Statcast — IBBs do not count toward the wOBA denominator).
  • Next-batter wOBA: the player who came to bat immediately after the IBB in the same half-inning, identified from the Statcast at-bat sequence (at_bat_number). Their season wOBA is computed the same way.

If either player has fewer than 50 PA in the season (small sample / early season), their wOBA is replaced with the league-average wOBA for that year. If there is no next batter in the half-inning (rare), league average is used.

Grade formula

The run value of the IBB decision (from the pitching team's perspective) is:

matchup_adv = (batter_wOBA - next_batter_wOBA) / wOBA_scale
run_value = matchup_adv - re_cost

where wOBA_scale = 1.157 (standard FanGraphs scaling factor that converts a wOBA difference to an expected run-per-PA difference).

  • GOOD_IBB (run_value > 0): The matchup advantage exceeded the RE cost — the IBB saved expected runs on net.
  • BAD_IBB (run_value ≤ 0): The RE cost exceeded the matchup gain — the IBB cost expected runs on net.

Worked example

Runner on 2B, 1 out. Elite batter (wOBA .390) at the plate. Weak hitter (.270 wOBA) on deck.

  • RE before IBB (runner on 2B, 1 out): ≈ 0.685 runs
  • RE after IBB (runners on 1B + 2B, 1 out): ≈ 0.879 runs
  • re_cost = 0.879 - 0.685 = 0.194
  • matchup_adv = (.390 - .270) / 1.157 = 0.104
  • run_value = 0.104 - 0.194 = -0.090 → BAD_IBB

Even walking a star to face a below-average hitter often fails to recover the RE cost of the IBB — a result consistent with the sabermetric consensus that IBBs are generally value-negative.

Aggregation

We aggregate by fielding team × season (the team that issued the IBBs):

  • n_ibb: total intentional walks issued
  • good_ibb_rate: fraction with run_value > 0
  • avg_re_cost: mean RE cost per IBB
  • run_value_per100: total run_value / n_ibb × 100
  • total_run_value: sum of all run_value for the team-season

Positive run_value_per100 means the team's IBBs added expected value on net. Negative means they subtracted expected value. Teams with fewer than 20 IBBs in a season are flagged Low.

Base-state and outs distribution

The overwhelming majority of IBBs occur with 2B occupied — confirming the standard baseball rationale (avoid putting the go-ahead run on base when 2B is empty, but accepting the IBB risk when 2B is already occupied and a stronger matchup is available).

Pre-IBB base state:

Base staten%
2B only1,45946.7%
2B + 3B91929.4%
3B only56818.2%
1B + 3B1294.1%
Other491.6%

Outs at time of IBB:

Outsn%
0 outs2788.9%
1 out1,07734.5%
2 outs1,76956.6%

56.6% of IBBs occur with 2 outs — the classic end-of-inning setup play. The 2-out IBB carries the highest RE cost per event (the walked batter has the highest chance of seeing further plate appearances before the inning ends), making the matchup hurdle especially hard to clear. The average batter wOBA at IBB was .355; the average next batter was .323 — a .032 gap, far below the ~.230 break-even gap required in most situations. 74.2% of IBBs were issued against batters who were genuinely stronger than the on-deck hitter; the remaining 25.8% were issued despite the on-deck hitter being at least as dangerous.

Limitations

  • Season-average wOBA: We use the full-season wOBA for both batters, not game-to-game splits, hot/cold streaks, or platoon matchups. A manager deciding on an IBB has access to much richer context — pitch type, recent performance, field positioning — that this model does not capture.
  • No pitcher quality signal:We do not model the current pitcher's ability to handle either batter. An ace might be trusted to pitch around an elite batter; this model treats all pitchers as equivalent.
  • Next-batter assumption: We assume the on-deck hitter actually bats next. Pinch-hit substitutions that follow an IBB would change the effective matchup; this model uses the player who appears next in the Statcast record.
  • Small per-team sample: Post-2017 automatic IBB rule, teams issue 15–25 IBBs per season. Team-level estimates carry meaningful uncertainty. Career / multi-season trends are more reliable.
  • Bases-loaded IBBs: When the bases are loaded, an IBB forces in a run. We add that run to re_cost. These situations are rare but occur; they are nearly always BAD_IBBs under any model.
  • No manager attribution: We aggregate at the team-year level. Manager names require a separate managers lookup CSV not yet included in the automated pipeline.
  • 2020 short season: The 60-game 2020 season produces very small per-team IBB counts (often 5–15). These entries are flagged 60g.

Why most IBBs look suboptimal

The sabermetric consensus — and our model — finds that most IBBs are value-negative. This is not a modeling artifact. The RE cost of adding a runner (typically 0.15–0.30 runs depending on situation) requires the walked batter to be dramatically better than the on-deck hitter to break even. For an IBB with re_cost = 0.20:

break-even wOBA gap = re_cost × wOBA_scale = 0.20 × 1.157 ≈ 0.23 wOBA points

A gap of .230 wOBA points between the walked batter and the next hitter is enormous — roughly the difference between an average hitter (.320 wOBA) and a historically bad bat (.090). In practice, most IBBs involve a gap of .050–.120, far below the break-even threshold.

This finding should be interpreted as context — our model quantifies how much teams historically paid for IBBs, not a directive to never use them. Late-game, bases-loaded, two-out situations introduce strategic considerations (forcing a double play, choosing reliever matchups) that are outside this model's scope.