AB de Villiers' strike rate in IPL run-chases is 137.9. On the third of his balls where the chase was tightest it is 194.5. The model that found that gap has no idea who he is; it only knows the required rate, the wickets in hand and the over. Every number below is in out/clutch.json at https://github.com/Shivang-creator/clutch-index, produced offline by one command in about three seconds.

Problem Statement

Every batting statistic in cricket is situation-blind. Average is runs over dismissals, strike rate is runs over balls, and neither remembers the match state the runs came in. 30 off 30 at 60/0 in the 5th over and 30 off 30 chasing 180 with four down in the 18th are the same innings on paper. Every player knows they aren't. The category assumes context is too hard to measure. It isn't.

Solution Overview

Clutch Index scores all 137,517 IPL run-chase deliveries in the Cricsheet archive from 0 to 1 for pressure, using only what the batter could see at the time: required minus current run rate (50%), wickets lost over wickets in hand (30%), depth into the innings (20%), and a 1.15x death-overs multiplier. One shared cutoff splits the pool into tertiles, so "high pressure" means the same thing for everyone. For each of the 164 batters with enough chase balls it reports conventional strike rate and average, the same figures on high-pressure balls only, and the delta. Thin-sample deltas are Bayesian-shrunk toward zero.

Key Features

  • Leaderboard, Most Underrated and Most Overrated views, sortable and filterable, one HTML file, no build step.
  • Raw and shrunk delta side by side, so the correction is visible: TM Head's raw -71.56 off 27 balls is pulled to -32.20 at 45% confidence instead of topping the list.
  • Results that cut both ways. KS Williamson climbs from 118.2 to 166.0 under pressure. Abhishek Sharma falls from 168.1 to 115.4, his average from 28.5 to 9.8. S Dhawan's strike rate barely moves; his average halves.

Technologies Used

Python 3, standard library only. Cricsheet ball-by-ball JSON committed to the repo. pytest. Vanilla HTML/JS. No framework, no network, no API key. 27 tests pass (python3 -m pytest tests/): formula monotonicity and clamping, the death-overs boundary, zero-balls-remaining edges, tertile cutoffs, shrinkage behaviour, and a synthetic batter whose built-in improvement yields a correctly signed delta end to end. Output is byte-identical on every run.

No AI at runtime, on purpose. "This player is overrated" has to trace back to a formula a reader can check by hand, and pressure.py and clutch.py are short enough to read in one sitting.

Target Users

Analysts and commentators who want a defensible number about finishers, auction teams pricing a big-match reputation, and fans who've argued this point and lost for want of data.

Honest limits

IPL only, batting only, chase innings only. No venue, pitch or opposition-quality adjustment. The four weights are my judgement as a player who has competed at national level, documented so they can be disputed precisely; they were not fitted to match outcomes.

AI tools and prior work

Claude Code (Anthropic) wrote the ingestion and test scaffolding, drafted the README and this description, and reviewed the formula's edge cases. The weights, the shrinkage design and every finding above are mine, verified by running the pipeline. Ingestion and shrinkage helpers are adapted from my earlier IPL Auction Game. Clutch Index was first built for the AQX Sports Analytics Data Bowl 3.0 and is entered here unchanged.

Team

Shivang Shirodkar, solo: model, pipeline, tests, UI, writeup.

Built With

Share this project:

Updates