DFS DegenSports

How to Backtest DFS Lineups: Turning Slate History Into Model Validation

By DFS Degen TeamPublished August 18, 202610 min read

Backtesting is the discipline that separates DFS players who improve from DFS players who plateau. Without backtesting, every projection tweak and every construction rule change feels like an improvement — you notice the wins and forget the losses. With backtesting, you can measure whether a change actually increases ROI over a meaningful sample. This piece walks through how to structure a backtest, what metrics to compute, and the common mistakes that make backtest results misleading.

DFS improvement is invisible without measurement. A casual player who bumps their weekly ROI from 2% to 4% may not notice for months because week-to-week variance is 40% or more — the underlying skill improvement is drowned by contest noise. Backtesting compresses years of noise into a diagnostic you can run in an afternoon.

Two backtest types

Two distinct backtests measure two distinct things:

  • Projection backtest. How accurate is your per-player projection? Measured by Mean Absolute Error (MAE) between projection and actual score. Tests the "predict points" half of DFS.
  • Lineup / ROI backtest. How profitable would your CONSTRUCTION RULES have been over historical slates? Tests the "convert projections into lineups" half of DFS.

A player can have great projections but bad construction (over-stacking, poor exposure caps) and post losing ROI. A player can have mediocre projections but disciplined construction and post positive ROI. Backtest both to isolate where your edge lives.

Structuring a projection backtest

  1. Collect 100+ historical slates for the sport you're testing. Each slate includes: player list, projections (generated using ONLY info available at slate lock), actual fantasy scores.
  2. Compute per-player error: |projection − actual| for each rostered-eligible player.
  3. Aggregate by position. Report MAE per position (QB, RB, WR, TE for NFL, etc.).
  4. Compare against a benchmark. Baseline projection systems have MAE roughly 5-6 for NFL WR, 7-8 for NFL RB, 4-5 for MLB hitters, 8-10 for NBA. Below the benchmark means you have a real edge.
  5. Break out by projection bucket — is your model accurate on chalk plays but bad on punts? Or vice versa? Position-level MAE hides sub-population failures.
A projection model with 4.5 MAE for NFL WRs vs. an industry baseline of 5.5 is a real edge. That's a genuine, quantifiable competitive advantage — worth thousands per season at scale.

Structuring a lineup/ROI backtest

  1. Same historical slate set. For each slate, generate the lineup(s) your current construction rules would have produced using the projections available at that time.
  2. Determine what contests you would have entered — cash, 20-max GPP, 150-max GPP. Apply real contest rake + payout structure.
  3. Compute per-slate profit/loss based on actual final lineup scores and historical contest cash lines.
  4. Aggregate ROI. Compute per-contest-type ROI separately — cash may be positive while GPP is negative or vice versa.
  5. Test rule variations. Would changing your exposure cap from 25% to 35% have improved ROI? Would stricter stacking rules have helped? Run each variant separately.

The out-of-sample split

The critical discipline: don't train your model on the same slates you backtest against. Data snooping — tuning your model to look good on the past — is the single fastest way to build a model that fails prospectively.

Standard split: use the first 70% of historical slates to develop and tune your model, hold out the last 30% as the OUT-OF-SAMPLE test. Report backtest metrics on the held-out set only. If your model looks great on the training set and mediocre on the held-out set, you've overfit — the model memorized the training slates rather than learning generalizable patterns.

Metrics that matter

  • MAE (Mean Absolute Error) — average absolute delta between projection and actual. Bounded by sport; use position benchmarks.
  • Bias — mean of (projection − actual). A bias of +2 means the model consistently over-projects by 2 points; that's a systematic error to fix before further tuning.
  • Sharpness — how tight are the confidence intervals around each projection? Sharp intervals with good coverage means the model knows its own uncertainty.
  • Per-lineup ROI — the final money-in, money-out ratio. The number that pays.
  • Per-tier win rate — cash rate, top-20% GPP rate, top-1% GPP rate. Different contests reward different construction rules.

Common backtest mistakes

Using future information

A backtest that includes information not available at slate lock (injury news that broke 2 hours before game-time when the backtest slate was actually locked at slate lock) is not a backtest — it's a fantasy. Use strictly point-in-time data.

Cherry-picking sample

"The backtest works great on the last 3 months but looks bad on the 3 months before that." Report the FULL sample. Cherry-picking the recent-good period is data snooping in disguise.

Confusing a small sample for a signal

20 slates of positive backtest ROI is not evidence. 200 slates is credible. Sport matters — NFL takes 4 seasons to accumulate 200 slates; MLB accumulates 200 in a single season. Don't confuse "I ran 20 slates and it worked" with "the strategy is validated."

Not accounting for rake

Backtests that compute raw score without applying real contest rake are optimistic by 8-15%. A "profitable" backtest without rake often becomes a break-even backtest with realistic rake. Always compute after-rake ROI.

How the simulator helps

DFS Degen's history table stores past slates with your projections, generated lineups, and actual results. Any past sport/site/date range can be sliced into a backtest sample. Standard queries:

  • MAE per position per sport per date range
  • ROI per contest tier per date range
  • Per-stack-shape performance (which stacks hit, which busted)
  • Per-player exposure vs. ROI (are your high-exposure players actually profitable?)

The tool doesn't replace judgment — you still decide what to test and how to interpret. But it eliminates the weeks of spreadsheet work that would otherwise be the biggest barrier to actually running the backtest.

Related

Frequently asked questions

What is DFS backtesting?

Backtesting is running your projection model or lineup construction rules against past slates to see how they would have performed with actual results. If your current process would have generated a 6% ROI over the last 6 months of NBA slates, you have real evidence your model works. If it would have generated -3%, the model needs work regardless of how confident it feels going forward.

How do you backtest a DFS projection model?

For each historical slate, generate your projections using only data that would have been available at slate lock. Compare projections to actual fantasy scores. Compute Mean Absolute Error (MAE) per position. A projection model with MAE below 5 DK points for NFL WRs is competitive; MAE above 7 is below industry baseline. Backtest across 100+ slates to smooth out noise.

What is the difference between backtesting projections and backtesting lineups?

Projection backtesting measures how accurate your per-player number is. Lineup backtesting measures how well your CONSTRUCTION rules perform — did the lineup shape you'd have built actually make money in the past contests? A model can have great projections but bad construction rules (or vice versa). Backtest both separately.

How much historical data do you need for a valid backtest?

For projection MAE: 100 slates is a solid minimum, 300+ is confident. For lineup ROI: 200 slates minimum because contest-outcome variance is much wider than per-player variance. Sports differ — MLB accumulates a slate almost every day so 200 slates arrive in a season; NFL takes years to accumulate that many because slates are weekly.

How does the simulator help with backtesting?

DFS Degen's history table stores past slates + your generated lineups + actual results. You can filter to any past sport/site/date range and compute per-position MAE, per-lineup ROI, per-stack-shape performance. What would normally require months of spreadsheet work happens in a query. See our simulation output piece for what the history table exposes.

Keep reading

Put the theory into practice

DFS Degen runs correlated Monte Carlo sims across 22 sports — up to 50,000 iterations per slate, from $19.99/month.