Keeping Bad Trades Out of Your Values
Market-based values are only as good as the market data behind them, and anyone who's played fantasy football knows the raw data is messy. Managers dump their rosters and quit. Friends collude. Someone trades their whole team for a kicker as a joke. If those trades flowed straight into the math, they'd poison the values for everyone. Filtering them out is where a large share of our engineering effort goes, and it happens in layers.
Layer 1: Only the right leagues
Before we look at a single trade, we decide whether the league itself belongs in the pool. Formats whose economics don't match ours are excluded entirely. Best ball leagues, for example, have no start/sit decisions, which systematically inflates the price of depth players. Leagues with unusual sizes are excluded too, because a 4-team league's market has almost nothing in common with a 12-team league's.
Layer 2: Only clean trades
Within eligible leagues, individual trades get screened. Trades where waiver budget (FAAB) carries meaningful weight are skipped. FAAB dollars are an asset our model doesn't price, so those trades would look lopsided when they weren't. Absurdly large packages get skipped as well; past a certain size a “trade” is usually two managers rebuilding each other's rosters, not a statement about any individual player's value.
Layer 3: Spam resistance
A player only earns a published value through trades across many distinct leagues; raw trade counts don't qualify anyone. Twenty trades in twenty leagues is a market signal. Twenty trades in one hyperactive league is two friends playing hot potato, and it gets treated accordingly.
Layer 4: Outlier rejection
After we solve for values the first time, we can measure how badly each trade disagrees with the market consensus of millions of others. The worst-fitting slice, the trades no reasonable set of values could explain, gets dropped, and we solve again without them. This is the layer that catches what the earlier screens can't: collusion and giveaway trades that look structurally normal but make no market sense. One manager trading a stud for scraps doesn't need to be explained; it needs to be excluded.
Layer 5: League reputation
Finally, we score every league by how consistently its trades agree with the broader market over time. A league whose trades are persistently out of step (hobby leagues where nobody's trying, arrangements between friends, leagues with their own strange economies) gets removed from the pool entirely, past and future. We're statistically careful here: a league isn't penalized for one weird trade, only for a sustained pattern of them.
Related reading: How We Turn Real Trades Into Player Values.
