xFP asks what a league-average player would have scored with the same work. Every target and carry falls into one cell, and the cell's value is the average result of every play like it: catches, yards and touchdowns, so one model scores PPR, half-PPR and standard.
- A target's cell: where the snap was (7 bands of yards to the goal line: 1–2, 3–5, 6–10, 11–20, 21–35, 36–50, 51–99), how far the ball was thrown (7 depth bands: behind the line, 0–4, 5–9, 10–14, 15–19, 20–29 and 30+ air yards) and whether it was thrown into the end zone.
- A carry's cell: where the snap was (10 bands of yards to the goal line: 1, 2, 3, 4–5, 6–10, 11–20, 21–40, 41–60, 61–80, 81–99) and whether it was a designed run or a scramble.
- Fitted on 2006–2022: 293,430 targets and 229,739 carries. An average target is worth 1.63 PPR points and an average carry 0.63.
- Thin cells borrow: a cell with few plays leans on the cell above it (depth and end zone for a target, field zone for a carry), weighted as if it had 30 more plays at the broader average.
- Each season is its own league: catch rates and yards per target have risen about 5% since 2006, so each season's expected catches, yards and touchdowns are scaled to match what the whole league did that season. Points over expected for the whole league comes to about zero. Early in a season the scale leans toward the model (4,000 plays' worth), so a few weeks of touchdowns can't swing everyone's xFP.
- Tested on seasons it never saw (2023–2025, 769 players with four or more games in each half): first-half xFP a game predicts second-half points a game with r = 0.73, against 0.75 for first-half points a game. On its own, opportunity predicts nearly as well as production, without the touchdown luck.
Model ledger-xfp-v1 (2006-2022, k=30). It is ours, fitted on nflverse play-by-play by a script anyone can rerun, so its numbers won't match another site's xFP. It uses nothing from Fantasy Points or any paid model.