How it works
FantasyFire does three things with public game logs: it projects every prop, turns that projection into the probability the line clears, and prices it against the market to show where the number is soft. No black box — this page documents exactly what we do, down to the constants the code uses, and every number is shown with how much to trust it, because a projection without its uncertainty is just a guess in a nicer font.
The data
The projections are computed from publicly available box-score game logs for every league we cover, ingested nightly. On top of that we read three public feeds through the day: book lines and odds (PrizePicks, Underdog, and major sportsbooks), Vegas game odds (the total and spread), and injury status. The app only reads this data — it never invents it. Each player page shows a “Stats updated through” date: the box scores are completed-game data refreshed once a day, not a live feed, and late official stat corrections are re-pulled for recent games.
Hit rate
For a chosen stat, line, and window (last 5, 10, 20 games, or the full season), we count how often the player went over versus under the line:
hit rate (over) = overs / (overs + unders)
Games that land exactly on the line (pushes) are excluded from the denominator, because a push is neither a win nor a loss. So a 60% over rate means 6 overs in 10 decided games, and a player can have fewer decided games than games played. We also show the raw game-by-game bars so you can see the distribution, not just the summary.
Sample-size confidence (the part most tools hide)
A hit rate from 5 games and a hit rate from 50 games are not equally trustworthy, so we never show a percentage on its own. For x overs in n decided games we compute the 95% Wilson score interval (z = 1.96) — the range the true rate plausibly sits in given the sample size — and display it alongside every hit rate. A small sample produces a wide interval, which we surface rather than bury.
We map the interval’s width to a three-level badge:
- High — width below 0.25 (about 25 percentage points)
- Medium — width below 0.45
- Low — anything wider
A “4 of 5” hot streak therefore reads as Low confidence, not as an edge. That honesty is the whole point.
The projection
The base is a recency-weighted average (EWMA, α = 0.28) of the player’s recent games, regressed toward their season average by 5 pseudo-games so a short hot or cold streak doesn’t masquerade as the true level. That base is then adjusted for the specific game it faces, each factor a gentle, clamped multiplier:
- Opponent. How soft the matchup is for the role — defense-vs-position in the NBA and NFL, and in MLB the specific probable starter’s strikeout and hits-allowed rates for a hitter, falling back to the staff when no starter is posted.
- Pace (NBA). More possessions means more shots, rebounds, and assists to go around, so a fast projected game nudges counting stats up. Pace is estimated straight from box-score totals (FGA + 0.44·FTA − OREB + TOV).
- Game environment.The player’s implied team total — half the Vegas game total, shifted by the spread — versus the league average. A high-total spot is a richer scoring environment.
- Usage trend. Recent opportunity (minutes in the NBA, carries and targets in the NFL, plate appearances in MLB) versus the season baseline, so a player whose role just expanded is projected up before the box score fully catches up.
Each factor is capped, and their product is capped again (about −18% to +22% overall), so context nudgesthe projection — it can never swing it wildly off the player’s established level. Any factor whose data is missing simply drops to neutral. We still show the raw L5, L10, and median next to the headline number, so you can always see the recent form the projection is built from.
From projection to probability
A projection of 27.3 against a 26.5 line means very different things for a steady player and a boom-or-bust one, so we don’t stop at the point estimate — we turn it into P(the line clears) using the right distribution for the stat: a negative binomial(or Poisson) for counts like points, strikeouts, and home runs, which handles a streaky player’s fatter tails, and a normal for continuous stats like passing and receiving yards. That model probability is what feeds the projection component of FireFactor and what we compare to the market.
Matchup context
NBA & NFL — Defense vs. Position. For each opponent and position bucket — guards / forwards / centers in the NBA, QB / RB / WR / TE in the NFL — we average the stat that opponent allows, then rank every team: rank 1 = allows the most (the softest matchup). The buckets are coarse on purpose — fewer groups give denser samples — and any cell built on fewer than 10 player-games is flagged as low sample. Don’t read precision into a noisy cell.
MLB — opposing pitching.For a hitter we show how much of the stat the opponent’s staff has allowed per game, and when the probable starter is known we use that pitcher’s own rates in the projection. Pitcher props do not yet get a matchup number. The matchup always describes the player’s next game (or the current one if it has already started).
MLB — park factors. Each MLB player page shows their home park’s run and home-run factor (1.00 = league-neutral) as context for their home games — Coors Field plays hitter-friendly, Oracle Park pitcher-friendly. These are a small static yearly table and are shown as context only: we do notfold them into the hit rates, because a player’s game log already reflects the parks they’ve played in, and silently re-weighting it would shift the numbers under you.
Availability
A great-looking number is moot if the player isn’t taking the field, so we read the public injury feed — status, the actual injury, an estimated return, and the latest note (see the per-sport injury report). An Out (or IL) player is forced to No readand dropped from the board entirely, so a lean is never shown for someone who isn’t playing. The game-time tiers (doubtful / questionable / GTD) discount FireFactortoward a coin flip and add a caution. The same gate runs on the board and the player page, so the read stays consistent. We surface status; we don’t pretend to know a coach’s final call.
We also tie the feed to the box scores: when an impactful teammate is out, each player page shows how that player’s line has historically shifted with that teammate out vs. in — usage often rises when a starter sits. Descriptive splits, not a forecast.
Market edge & +EV
When the books we track post two-sided odds for a prop, we remove the vig from each and take the median to get a no-vig consensusprobability — a sharper “fair” price than any single book’s number, since the margin is stripped out. From that we surface the best available price on each side and its expected value, and we compare our model’s probability to the market’s. A book paying better than the consensus, or a model that disagrees with it, is where an edge lives.
You can also enter a price yourself: we convert American odds to an implied probability, remove the vig when you enter both sides, and show the edge versus the player’s history. Whether the price is scraped or typed, the edge is a comparison of numbers, not a promise that the over or under hits.
Default line
When you open a player without a real book line, we pre-fill a book-style half-point line(x.5) so the default can never push. We center it on the player’s season median game and pick whichever half-point just below or above the median splits their games closest to 50/50 over–under, so the default isn’t tilted toward either side. You can type any line you like — the point of the tool is to check the exact number on your card.
Which games count (opportunity filter)
A garbage-time cameo or an early injury exit isn’t a representative game, so we drop games where a player was barely involved. The bar is per player, not a fixed floor: we blend each player’s season-long workload with their last 10 games, so part-time and platoon players aren’t zeroed out. Workload means minutes in the NBA, plate appearances for MLB hitters, and role involvement (pass attempts, carries, targets) in the NFL; MLB pitchers are not opportunity-filtered. The matchup numbers use a team’s full game logs, so they aren’t affected by this per-player filter.
Consistency & splits
Consistencyreads a player’s floor and ceiling (the 20th and 80th percentiles of recent games) and labels the spread Steady, Variable, or Boom-Bust from the coefficient of variation (Steady below 0.3, Boom-Bust at or above 0.6). The matchup grade (A–F) turns the Defense-vs-Position rank into a letter — A = one of the softest matchups for the role, F = one of the toughest — and shows NR (not rated) on low-sample cells. Situational splitsbreak any stat down by home/away and by days since the player’s last game, each with its own95% Wilson confidence — so a small-sample “crushes at home” reads as Low, not as an edge.
FireFactor
FireFactor blends these signals into one transparent heat read. An over read runs warm — a Warm, Hot, or Blazing flame as the edge grows; an under read runs cool — Cool, Cold, or Frozen snowflake — and a balanced line is No read. The 0–100 number tracks the model’s estimated chance the side hits, on a deliberately steep curve: a coin-flip line sits near 0 (a Pass), a clear edge reads as a Slight or Normal lean, and only a near-certain (~90%+) read approaches 100— rare by design, because there’s no such thing as a sure bet. A thin sample pulls the number back toward a coin flip until the games back it up. It is a research signal, not a prediction or guarantee. Three things keep it honest:
- It ranks by the 95% Wilson lower-bound trust factor, so thin samples and hot streaks are discounted, not rewarded — confidence is counted, not assumed.
- The number is always shown with its component breakdown— hit rate, the projection’s probability vs the line, consistency, and matchup, weighted 34/24/16/14, fused in log-odds so a neutral component abstains rather than dragging a strong read to the middle. Any missing input is dropped, not guessed, and a thin sample isn’t thrown out — the trust factor just makes a read much harder to reach, so only a line with no decided games at all is an automatic No read.
- FireFactor is the directional signal only— the same number on the board and on a player’s page for an identical line, stat, and matchup, never shifted by whether odds happen to be posted. Price questions are kept separate: the +EV versus the no-vig market, the best book, and the cross-book line value each live in their own panel.
What we still don’t model
Being honest about the limits is part of the method:
- No trained/fitted forecast. The projection and FireFactor are transparent heuristics with published weights and clamps, shown with their uncertainty — not a machine-learned model of a specific game.
- No same-game correlation.Each prop is read on its own; we don’t model how a player’s props move together or build parlays.
- No weather, and coarse matchups.Positions use three NBA buckets, MLB pitcher props get no matchup adjustment yet, and we don’t model wind or temperature.
In short: these are transparent projections priced against the market, every number shown with its uncertainty — research, not advice or a guarantee. New here? Start by browsing players, read more about FantasyFire, or look up a term in the FAQ & glossary. And see responsible gaming before you wager.