The Draft Society / Pickup Timing Study

How this was built

Method,
and its limits

The data

Every transaction from two Fantrax EPL draft leagues in 25/26, pulled from Fantrax's own transaction history. Both run 12-team divisions on broadly the same settings, which is what makes them comparable.

LeagueTeamsDivisionsTransactions
International Genie League1441241,300
DraftPL Community League72627,633

Player scoring comes from Togga's per-gameweek Fantrax data, joined on Fantrax player id — a 100% match, no name matching anywhere. Kickoff times come from the FPL fixture list, joined on the ordered club pair rather than the gameweek, because a postponed match can sit in a different gameweek for each source. All 380 fixtures matched.

The buckets

Every bucket is measured against the kickoff of the player's next real fixture after the add. Lineups are announced at KO−75.

BucketDefinition
WaiversAdded more than 75 minutes before kickoff — before the team sheet
SnipeAdded between KO−75 and KO−70, the five minutes after the announcement
Late addAdded between KO−70 and kickoff

Only executed claims count as pickups. A failed claim moved no player; 15,108 of them are excluded from every value figure and used separately as a record of demand.

Things that would have gone wrong quietly

Each of these was found by checking, and each would have produced plausible-looking numbers if it had not been:

Timestamps are not EST

Fantrax labels the transaction clock "Date (EST)", but the same league's scoring periods come back at −0400 in September and −0500 in January. It is US Eastern wall time, daylight saving and all. Reading the label literally would have shifted every add by an hour for most of the season, which would have destroyed a five-minute bucket. Timestamps carry minutes, never seconds.

Drafts come one division at a time

Asking Fantrax for a league's draft returns a single division's picks and does not say so. Taken at face value, 3,264 drafted players across the other divisions would have looked like free agents all season.

Free agency is per division

A player rostered in one division is still free in every other. Ownership is therefore reconstructed separately for each of the 18 divisions, and "contested auctions" are grouped by division too — pooling them across divisions invents competition that never happened.

Scoring rows are per match, not per gameweek

In rescheduled weeks a player has two rows under one gameweek number. Timing is matched to a single fixture; value is summed across the whole gameweek.

Two comparisons that are easy to get wrong

The never-picked-up pool is conditioned on starting. It is built from players who were free at kickoff and started, so it compares to a bucket's "points once he started", never to its overall mean. Comparing it to the unconditional figure stacks the deck against the pickup, because a manager choosing a free agent does not yet know who will start.
Points while held grows with how long he was held. It measures the length of the spell, not the player. Hold length is also partly a sunk cost — a manager who paid a lot is committed by the price. Only points per gameweek held says anything about quality.

What this cannot tell you

Reproducing it

Everything runs on a laptop with no credentials: Fantrax answers these leagues' transaction history without a login.

python scraper/pull.py            # transactions, drafts, metadata
python analysis/events.py         # buckets and the comparison pools
python analysis/metrics.py        # headline tables
python analysis/build_site_data.py # the rest of this site's data