The problem with every batting stat you've ever seen

A batter scoring 30 off 30 chasing 180 with four down in the 18th over played a completely different innings from one scoring 30 off 30 at 60/0 in the 5th. Every player and every fan knows this instantly.

The stat sheet doesn't. Average and strike rate are runs divided by dismissals and runs divided by balls — they have no idea what the game situation was when those runs came.

I've played cricket at national level, and this gap between what the scorecard says and what the players on the field know is the thing I've always wanted to put a number on.

Clutch Index scores every ball of every IPL run-chase for how much pressure the batter was actually under, splits each batter's own career chase balls into low- and high-pressure buckets, and reports the gap between their normal numbers and their numbers when it mattered. That gap — not the raw average — is the output: a direct read on who the stat sheet is over- and under-selling.

The pressure model

Every ball in a chase gets a 0–1 score from four things a batter is actually feeling:

  • Required run rate gap (50%) — how far ahead of you the ask has got
  • Wickets in hand (30%) — two down is a different game from six down
  • Lateness (20%) — the same equation is heavier in the 17th over than the 7th
  • Death-over multiplier (1.15×) — pressure compounds at the end

Every batter's chase balls are then split into tertiles. Top third = high pressure, bottom third = low.

What it found

  • AB de Villiers is the most underrated batter in IPL chases. Strike rate 137.9 → 194.5 under pressure (+56.60), average 32.8 → 43.9. Off 451 high-pressure balls — full confidence, not a small-sample artefact.
  • Kane Williamson, thought of as an accumulator: SR 118.2 → 166.0 (+47.80) across 256 high-pressure balls.
  • Abhishek Sharma's numbers are largely a low-pressure phenomenon. SR 168.1 → 115.4 (−52.70), average 28.5 → 9.8.
  • Yashasvi Jaiswal: SR 154.7 → 110.6 (−44.07), average 36.8 → 14.9.
  • Shikhar Dhawan doesn't slow down under pressure — he gets out. Strike rate barely moves; his average collapses.

Small samples don't get to shout

A batter with 27 high-pressure balls shouldn't outrank one with 451. Every delta is Bayesian-shrunk toward zero in proportion to sample size, and the shrunk and raw numbers are both published alongside a confidence figure.

Travis Head's raw −71.56 comes off just 27 balls (45% confidence) and gets pulled to a defensible −32.20. The leaderboard shows both, so you can see the model correcting itself.

No AI anywhere, deliberately

There is no LLM, no API call, and no network access in this codebase. An analytical claim like "this player is underrated" has to be auditable back to a formula and a number, not to a model's weights. Every score in out/clutch.json can be traced by hand through pressure.py and clutch.py.

python3 pipeline/build.py — one command, runs offline in under 3 seconds from the committed Cricsheet archive, and reproduces the published numbers byte-for-byte.

27 tests

pytest tests/ — 27 tests covering the pressure formula (monotonicity, clamping, death-over boundaries, division-by-zero edges) and the clutch computation (tertile cutoffs, shrinkage pulling low-volume deltas toward zero, a synthetic batter with a built-in improvement producing a positive delta).

Honest limits

  • IPL only. No internationals, no other T20 leagues.
  • Batting only. No bowling-pressure model.
  • Chases only. Batting first has real pressure this model says nothing about.
  • No venue or pitch adjustment. A 200 chase in Bengaluru isn't a 200 chase in Chennai.
  • Pressure is modelled, not measured. The weights are my judgement as a player, documented in the README so you can disagree with them precisely.

Built With

Share this project:

Updates