The SCOUTSWING Grade: Model Card
What goes into a grade, what we don't disclose, and where the honest limits are.
Model details
Name: The SCOUTSWING Grade
Current version served: v4.0-rebalanced
Type: A composite scoring model, not a classifier, not a prediction. We rank a player's recorded output against real peers and compress that rank into a letter tier.
Maintained by: Inganci / bb-intel. We recompute it on a fixed schedule (see Freshness, below); we don't manually re-run it per grade.
What this grades
Our SCOUTSWING grade is a single letter-and-modifier, SW-1 at the top down to SW-6, built from a 0–100 composite score. We assemble the composite from four sub-scores, each measuring a different kind of evidence about a player:
- Statistical percentile: per-90 production, EPL-normalized, ranked against every peer at the same position who cleared a minimum-minutes bar that season. Source: match statistics and expected-goals data.
- Market percentile: percentile rank of the player's most recent estimated market value against the position-group pool. Source: market valuation records.
- Pattern score: our modeled read of detected recurring play patterns; see the companion post, How SCOUTSWING reads a pattern, for how we find these. Source: event and lineup data, via our pattern detectors.
- Proprietary score: a modeled read from our own Inganci signals: aerial ability, set-piece value, buildup involvement, carrying, among others. Source: data-derived sub-dimensions where available, a manually-graded fallback where not.
This composition is the one part of the model we disclose in full, matching the existing grade methodology page. What we don't disclose: the exact weights that blend the four into the composite, or the tier-boundary cutoffs. That withholding is deliberate, already public-facing policy; this card doesn't change it.
Peer pools
We compute percentiles within position group (CB, FB, CDM, CM, AM, WA, CF, outfield players only; no goalkeeper grade exists today), not against the whole player population. Two disclosed floors keep a percentile from being computed on too few data points:
- A metric needs enough qualifying peers that season to count at all. A stat with too small a pool for a given position/season is dropped from the statistical blend entirely; we never compare it against a handful of players.
- A market percentile needs enough valued peers in the same position group. Below that floor, the sub-score defaults to a flat, neutral 50 rather than a percentile computed on too few data points, and we disclose that default on every grade that hits it rather than silently absorbing it into the number.
Peer pools are cross-league: a striker's peers include strikers across every competition we cover, not just their own league. That's exactly why we run the EPL-normalization step: a per-90 number earned in a weaker league is adjusted down, one earned in a tougher league is adjusted up, before any comparison happens.
We resolve a player's position for a given grade for that season specifically (from match-lineup data where available, falling back to broader positional data, falling back to their current listed position), not from their current role. A winger graded for a season they played as a wingback is compared against wingback peers for that season, not winger peers.
From composite to tier
The composite lands in one of six tiers, SW-1 through SW-6, against boundary thresholds we don't publish, consistent with our stance that the blend formula is the one part of this that's ours. Within a tier, a player's exact position in that tier's range decides a +/− modifier: two players can share a letter grade and sit meaningfully apart within it.
What we can say without disclosing the cutoffs themselves: we set tier boundaries per position group, not on the raw composite globally. A CB and a CM aren't squeezed through the same cutoff line; each position's own score distribution sets its own boundaries, so a position with a structurally lower or higher ceiling isn't systematically over- or under-represented at the top tier.
Freshness: how current a grade is
Grades recompute on a daily schedule. The underlying inputs we draw from, market valuations and most season statistics, refresh weekly, so most daily runs reproduce the same composite score. The point of the daily cadence is to guarantee that no grade goes stale for longer than a day, not to imply the underlying signal itself moves daily.
We don't have a verified per-run timing figure to publish yet.
Stability discipline: we check every recompute against the prior grade before committing it. If too many players would change tier in one pass, the recompute halts rather than silently pushing out a possibly-broken batch, a routine cap and a tighter "structural change" cap, both requiring deliberate override to bypass. This is what keeps a bad coefficient change, a data outage, or a pipeline bug from mass-reshuffling grades overnight.
Data sources and vintage
A grade draws on match statistics, expected-goals models, market valuations, and a human-graded proprietary layer. It's statistical inference over recorded data, not physical measurement. There's no biomechanical capture, no GPS load data, no injury-risk model behind any of the four dimensions.
We always pin a grade to a specific season, and its underlying data can occasionally run on a different clock than the season stats displayed next to it, since grades and season-stat ingestion recompute on independent schedules. When a grade's underlying season predates the stats sitting beside it (for example, a grade still running on an older season's data while newer stats have already landed), we disclose that directly on the page, not as a buried footnote.
Our coverage is real but not complete. Not every player has a grade. A grade needs enough underlying data to be worth showing; where it doesn't exist, the record shows pending, never a fabricated number. Coverage grows as our underlying record grows; it's not a fixed ceiling.
Confidence, not the grade itself
Separate from the grade tier, every player carries a confidence read on how much the underlying data actually supports the number, built from minutes played, season depth, how many independent data providers corroborate the record, whether expected-goals data exists for that league, and how much pattern data we've detected. We cap leagues outside the top five European competitions at a mid-confidence tier even when their raw data would otherwise score higher, a deliberate calibration decision, because we haven't cross-validated those leagues' data to the same depth as the top five. Confidence isn't the grade: a high-tier grade can sit on data still being tightened, and a fully corroborated read can belong to a mid-tier player. Neither implies the other. This is the same distinction we draw on the grade methodology page between the grade tier and the separate source/method/confidence system elsewhere on the site.
Versioning
Every grade carries a model version (currently v4.0-rebalanced) so you can tell when the underlying model itself changes, even without seeing the formula behind it. A version bump means the weights, thresholds, or composite structure changed in a way meaningful enough to call for a new label, not a cosmetic tweak. We never silently rewrite historical grades under a new version; a version change is itself part of the record.
Known limitations
- We deliberately don't disclose the weighting. We publish the full composition of a grade, every input that goes into it, and withhold only the blend coefficients and tier cutoffs, the same way a scouting department doesn't publish its own internal model. That means you can audit what went into a number but not reproduce the exact number yourself.
- Calendar-year vs. season-year leagues. Competitions that run on a calendar-year season (rather than the conventional August–May European season) can complicate season-matching and age-relative comparisons; this is a known seam in cross-league normalization, not fully eliminated.
- The pattern score depends on detection, not absence-of-evidence. No detected pattern scores at the floor, an honest zero, not a guess at what might be there. A player whose real tendencies simply haven't been caught by our current detector set reads the same as a player with no notable tendencies at all. See the companion post on pattern detectors for more on this limitation.
- Position pools vary in depth. Some position groups have deeper peer pools than others across the competitions we cover; a percentile computed against a shallower pool carries more inherent noise than one computed against a deep one, even when both clear the minimum-peer floor.
Intended use
A SCOUTSWING grade tells you where a player's recorded output sits against real peers, computed consistently and disclosed dimension by dimension. We built it for scouting, comparison, and squad review: a fast, consistent read across a large population of players, not a substitute for watching football.
What this is not:
- Not gambling advice. A grade is a retrospective and current read on recorded output, not a forecast of match outcomes; using it as one misapplies what it measures.
- Not a physical or medical assessment. No injury-risk signal, no fitness/load data, no biomechanical read sits behind any of the four sub-scores.
- Not a replacement for scouting judgment. A grade compresses evidence into a comparable number; it doesn't replace the context a human scout brings to a specific player, role, or tactical fit.
- Not a claim of certainty. The confidence read exists precisely because not every grade rests on equally deep data; treat a low-confidence grade as a starting point for further look, not a settled verdict.
Change management
We drive coefficient and threshold changes by research and version them; we never apply a change silently to a live grade without a version bump and a stability check. A version's own internal composition (which sub-dimensions feed the proprietary score, how we draw peer pools) can be extended over time as new data becomes available, always disclosed at the same level of detail as this card, never less.