Diego Garcia

live · 14 leagues · 26-27

Libero

Roles are a blend, not a box.

A scout that finds the role a player actually plays, and prices the output without the name.

Loading wingers…

  • Inside forward
  • Two-way wide midfielder
  • Playmaking winger
21
roles in 8 positions, found unsupervised
34%
median fair value error, unseen season
78%
of price moves called right, a year out

Kick-off

What it is.

Libero reads every player-season in 14 European leagues on one scale and asks a scout's two questions: what does this player actually do, and what is that usually worth.

A Gaussian mixture per position finds roles nobody named in advance. A gradient-boosted model prices the output without ever seeing last year's price. A third projects where the price goes next.

Inside a position, roles are a continuum. The libero was the player no position could hold.

Architecture

Follow one player through it.

Pick a player. The diagram redraws from the exported models, stage by stage: the profile, the projection, the mixture, all 1,060 trees and the verdict.

Player

Only derived data ships: league-adjusted per-90s and rates, model outputs, rounded values, minutes to the half hour. In-browser inference matches Python to within 3e-6 on the same inputs.

Before any model

Every league on one scale.

Raw per-90s are not comparable across leagues, possession styles or sample sizes. Four steps fix that first.

  1. 01

    Per 90, adjusted

    Match stats summed per season and put per 90. Defensive actions are scaled by the opponent's possession, so a side that never has the ball does not inflate its defenders.

  2. 02

    One scale

    Players who move between leagues show how each stat changes with the league. A ridge regression on those moves gives every league a factor per stat, and every number is translated to Premier League level.

  3. 03

    Shrunk rates

    Success rates are pulled toward the position's average with a beta prior, so three dribbles out of three cannot outrank 80 out of 120.

  4. 04

    Three models

    A style profile feeds the role mixtures. Output, age, playing time, league and team feed the fair value. Add the current price and its momentum, and you get the trajectory.

Under review

Does it hold up?

Every number here is out of time: a season the model never trained on, or refits that never saw the players they are scored on.

Roles

They touch. They are still real.

same role next season if role sizes alone decided it
PositionSeparation
  • Goalkeeper71%0.21
  • Centre-back63%0.09
  • Full-back80%0.18
  • Defensive midfielder79%0.14
  • Central midfielder74%0.14
  • Attacking midfielder70%0.10
  • Winger73%0.13
  • Striker85%0.24
Separation (silhouette) never passes 0.24: inside a position, roles touch. Yet in every position players keep their role from one season to the next more often than role sizes alone would produce, by 13 to 40 points.

Fair value

Price the output, not the name.

Median error on 25-26, a season none of them saw. Shorter is better.

  • Median by league, position, agethe baseline60%

  • Ridge on the same inputs41%

  • LightGBMused34%

  • LightGBM + last year's valueleft out on purpose23%

Adding last year's price cuts the error from 34% to 23%. That difference is inertia: what a player was worth, not what the output is worth. Keeping it out is what makes the gap between fair and market value mean something.

Season in progress

Eight games in, lean on last season.

+0%+11%+22%+35%+49%+65%15 Sep · 5 games13 Oct · 8 games15 Dec · 16 games15 Feb · 24 gamesthis season onlyblended with last season
How far above market the model puts regulars (80 to 100% of their team's minutes) on four dates of a replayed season. Eight games in, a full share of minutes is common and team goal difference is spread wide, so regulars read rich. Weighting this season by games / (games + 10) cuts the September error by more than 40%, and the two lines meet by February.

Trajectory

Next year's price, decile by decile.

−50%−50%0%0%+100%+100%predicted changerealised change

Players binned into ten groups by predicted one-year change, on 24-25. Every decile lands on the diagonal: when the model says +40%, the group gained about 40%.

Its top tenth gained +143% on average, its bottom tenth −57%. Direction is right 78% of the time, against 56% for an age curve alone.

Laws of the game

Why it is built this way.

  1. 1

    Soft membership, not boxes

    Within a position the roles touch. A player is reported as 70% one role and 30% another, and a role is defined by its centre, never by a border.

  2. 2

    Reputation stays out of the price

    Fair value never sees last year's price. The model answers what this output usually costs, so a gap with the market is a disagreement worth reading.

  3. 3

    Read the market's level from the market

    Trees cannot extrapolate inflation or the rising price of youth. The model predicts relative to the season's league level and age premium, both read from that season's other valuations.

  4. 4

    Out of time, or it does not count

    Every headline number comes from a season the model never trained on. Role stability is checked on refits of 80% of players and on a season the mixture never saw.

  5. 5

    Model roles and quality stay separate

    The mixture says what a player is. A weighted percentile score says how good the player is at it. Hand-made templates agree with the model at ARI 0.00 to 0.20, because templates rank quality and the mixture groups style.

Still open

What the data does not settle yet.

  • Fair value still pulls toward the middle of the price range. A quantile model would give a range instead of a point, which is more honest at the extremes.
  • Mid-season fair values sit slightly high on every replayed date. Part of it is likely the market itself: valuations move after a season more than during it.
  • The trajectory horizon spans 245 to 485 days and the target is not scaled to it, which adds noise.

Go scouting.

Pick a role on the pitch, read the map, find where the market and the numbers disagree.

Open the scout