State of Dynasty Trades, research edition — part 1: what the corpus is and isn't

Before we publish findings from 8.5 million dynasty trades, here is exactly where they come from, what gets excluded, how recency is weighted, and where the sample is thin.

This is the first post in a research series on how dynasty managers actually trade. It contains no findings. That is on purpose.

A trade statistic without its sample is a slogan. Before we publish what the market does, you should know what we counted, what we threw out, and where the data is thinner than the headline number suggests. Every later part of the series will point back to this one.

What the corpus is

As of September 7, the SharperSunday trade corpus holds 8,544,114 trades from 1,513,193 Sleeper leagues. It spans the 2018 through 2026 seasons and grows continuously; at the current rate it adds roughly 1,100 trades a day, and the count is rebaked every four hours.

Each record is a completed, accepted trade: the two sides (players and draft picks), the league’s format, the season and week, and when it happened. That is all. The public trade database and the landing-page ticker are baked without usernames or league identifiers; neither is ever written into those files.

A league qualifies for the trade corpus if it is a dynasty league with 8 to 16 teams. Redraft leagues contribute draft data only. Keeper leagues are skipped. Larger novelty formats are used to discover more leagues but never feed the corpus. Since late June, collection has run as a tiered poll rather than a crawl: the 2,000 most active dynasty leagues, ranked by recent trades, are polled fast, and every other eligible league that traded in the last 45 days is polled slower.

Format is recorded on every trade along five dimensions: team count, superflex, points per reception, tight end premium and points per passing touchdown. Anything outside those five is not modeled, by decision.

What the corpus is not

It is not all of Sleeper. Leagues were discovered by walking outward from public users across the leagues they share. That reaches connected, active leagues first. A private league of twelve strangers who play with nobody else is less likely to be in it.

It is not other platforms. Everything here is Sleeper.

It is not a fairness filter. These are trades managers accepted, fleecings included. When we report what the market tolerates, we are describing behavior, not endorsing it.

It is not evenly weighted in time. For pricing, a trade from yesterday counts more than one from March; the weight halves every 60 days, and the Edge post has the table.

It is not a balanced sample of formats. Four of every five trades come from 12-team leagues. About two thirds use 6-point passing touchdowns and a quarter use 4. Tight end premium splits roughly 38% at half a point, 22% at a full point and 22% at none. Any finding split by format will carry its sample size, and small-format cells will be reported as insufficient rather than guessed.

It is not verified against later reversals. We record the accepted transaction. If a commissioner reversed it afterward, we do not claim to know.

Two counts, two definitions

Two different trade numbers appear on SharperSunday, and they are not supposed to match.

NumberWhat it countsAs of
8,544,114Every parseable trade record in the corpus, lifetime, no filteringSeptember 7, 23:21 UTC
7,853,765The subset the Edge model trained on that nightSeptember 8, 04:52 UTC

The trainer’s subset drops a trade if it is a duplicate transaction id, if its league’s format is unknown, if the passing-touchdown scoring is not a value the model handles, if it does not have exactly two teams, or if one side is empty. That last rule matters more than it sounds: a one-sided “trade” is a gift or a dump, and gifts are not prices.

Picks are trimmed too: anything more than three years out is dropped, and so is a current-year pick in round 5 or later, because in the corpus those are mostly startup-draft slots rather than rookie picks, and they trade very differently.

One honest gap: the ~690,000 difference between the two counts is part ingestion timing, part duplicates, part filtering. The trainer logs its duplicate and drop counters during the run but does not yet write them into the published training report, so we cannot tell you the exact split. It is on the list.

From a trade to a price

The Edge post covers the model; the short version for this series is what it refuses to do. A player needs at least 10 trade observations in a format before he is priced at all, and one whose observations have decayed to fewer than three effective ones is marked stale and held off the board. Players who are off an NFL roster and recorded no regular-season game in either of the last two seasons are dropped, which is what keeps long-retired names that still get traded as novelties off the board; an unsigned veteran who played last season is kept, because in dynasty he is still genuinely tradeable. That rule replaced a narrower one on September 10, and the narrower one had been wrong. It keyed on a single Sleeper status flag that most retired players do not actually carry, so it caught Tim Tebow and missed Tom Brady — who was priced 106th of 1,043 players on the September 10 board, with Cam Newton, A.J. Green, Adrian Peterson and Drew Brees also inside the top 200. The corrected rule removes 65 names from that board, and the trainer now refuses to publish at all if a player it considers retired is priced in the top 200. And if any player valued 4,000 or more moves more than 20% in a single night’s retrain, the trainer refuses to publish and the previous table stays live. In the six days before this season’s kickoff, none did.

How a study narrows further

A research question narrows the corpus again, and each step is a choice a reader should be able to see. Here is the funnel behind our fairness bands, taken from the September 8 table, on the superflex full-PPR pool:

StepTrades remaining
Two-team superflex PPR trades in the corpus3,574,588
Drop trades older than 12 months931,160
Drop trades with four or more assets on a side (studied separately)808,501
Drop trades where any player has no current Edge value807,527
Drop trades where either side is below a minimum value floor346,865
Drop trades with a gap over 60% (a fleecing, not price discovery)334,841
Of those, one-player-for-two-or-three consolidation shape143,181

Three of those rules deserve a sentence each. The 12-month window exists because historical trades are scored against today’s values, and we do not keep a table for every past day; two-year-old trades priced with this morning’s table would measure drift, not behavior. A trade with any unpriced player is dropped whole, never zero-filled, because a zero deflates one side and flips the verdict; we learned that the expensive way. And four-plus-asset trades are set aside rather than pooled, because dump-and-rebuild packages are a different market from a two-for-one.

Why the window is the finding

Method changes the answer, and the clearest example we have is the fairness band itself.

Take the gap between the two sides of a clean trade as a share of the larger side, and ask how wide a gap 70% of accepted trades fall under. On the 12-month window, the answer is about 30%. Fit the same statistic over the entire history of the corpus and it reads 52%. Same corpus, same formula, a 22-point swing from the window alone.

So every number in this series will carry its window, its sample size and its date. Where a result moves across reasonable windows, we report the range and lean on the conservative end, as the Week 1 trade-market post already does for the consolidation premium.

The noise floor

There is a limit on how precise any per-trade verdict can be, and the corpus tells us where it is. Take one-for-one trades only, the swaps two managers agreed were even, with no package premium to confound them. Priced against our own table, the median gap between the two sides is still 17%. That is model imprecision plus honest disagreement between managers, and it is why our trade evaluator’s bands sit wider than it. A tool that calls a 12% gap a loss is grading its own noise.

What we do not claim

We do not claim Edge is the most accurate dynasty price available. The claim we can support is that it is independent, built from a broad and continuously refreshed sample, and priced for your format rather than a generic one. We do not claim the corpus makes any manager’s trades better; it describes what managers did. And nothing in this series will be causal. A pattern in accepted trades is a pattern in accepted trades; why it is there is a question the data can inform and not settle.

What is coming

The planned parts, each over a dated, completed period with its funnel printed alongside: how often draft picks appear in real trades; how package shape differs between superflex and 1QB and between league sizes; and when in the season trading actually happens.

Until then, the Dynasty Trade Database is the corpus at its most unfiltered: every dynasty trade from the past seven days, newest first, up to 500 at a time, with Edge values on each asset and a verdict on each deal, even when the sides are within 15% and otherwise which side won and by how much. The lopsided ones are in there too.

Then connect your league. Once your Sleeper league is linked, the co-manager prices every offer you get against this corpus, for your format, and tells you where it lands among real trades rather than where the group chat puts it.

Start free and price your next offer against 8.5 million real trades


Data note: the 8,544,114-trade and 1,513,193-league counts, the 4-hourly bake, the ~1,100 trades-per-day rate (0.0127 per second), the 2026-09-07T23:21Z timestamp, the two-counts explanation and the unsurfaced drop-counter gap are from docs/audit/DATA_INTEGRITY_2026-09-08.md. The 7,853,765 trainer subset, the 2018–2026 season span, the coverage shares (80.6% 12-team; 67.7% and 26.1% passing-touchdown splits; 38/22/22 tight end premium) and the fairness-band funnel (3,574,588 down to 334,841 and 143,181) are the corpus, bandCalibration.corpusSeasons, coverageCaveats and bandCalibration.dropCounts blocks of values/value_tables.json on sharpersunday-data@val-160 (schema 160-continuous-v1, generated 2026-09-08T04:52Z); intermediate funnel rows are subtractions of those counts. League eligibility (dynasty, 8–16 teams; redraft drafts-only; keeper skipped) is scripts/crawlTradeCorpus.mjs; the tiered poll (core 2,000, 45-day activity window, the rest of the eligible set as the slower ring) is scripts/hotListSelect.mjs, cut over 2026-06-27 per issues/528-tiered-hotlist-fast-poller.md; the trainer’s drop rules, pick trimming, 10-observation floor, stale threshold, retired-player exclusion, 60-day half-life and drift guard are scripts/trainValueModel.mjs. The retired-player rule and its top-200 publish guard were corrected on 2026-09-10 (scripts/trainValueModel.mjs, scripts/__tests__/retiredPlayerFilter.test.mjs); the 106th-of-1,043 ranking, the named top-200 cases and the 65 removed names are the corrected rule run against the live values/value_tables.json on sharpersunday-data@val-160 (generated 2026-09-10T05:10Z) with the Sleeper players and regular-season stats endpoints for 2026 and 2025, read the same day. The no-usernames, no-league-ids rule is scripts/bakeRecentTrades.mjs and api/tradeExplorer.js. The 30% versus 52% window comparison (12-month curated fit versus the all-history nightly fit, n=3.45M) and the 17% one-for-one noise floor (n=18,819) are from docs/FAIR_BAND_DECISION_MEMO_2026-07.md (2026-07-11); the curation rules and the never-zero-fill lesson are from docs/BAND_CALIBRATION_STUDY_2026-07.md. The zero top-200 movers over six days are from the data-integrity audit. The trade database’s 7-day window, 500-trade cap and 15% verdict tolerance are blog-astro/src/pages/tools/trade-database.astro and blog-astro/src/lib/tradeDbFilters.ts. The accuracy and non-causal positions restate .claude/skills/prior-decisions/SKILL.md. All figures describe the corpus and model at the dates given, not a guarantee about any trade.