How the Betting Model Works
For every NFL game we build our own fair point spread and total, compare it to what the sportsbook offers, and bet only when the gap is big enough to beat the house's cut. Here's how it works — in plain English — and the receipts.
How we make our number
1. Rate every team, recursively. Each team gets ratings for how well it runs, passes, stops the run, and stops the pass — earned against the quality of who they played (a good day against a great defense counts more). Quarterback quality, injuries, rest, travel, and weather all feed in.
2. Predict the game. Those ratings produce our own fair margin (the spread) and fair total (the points). Two separate models, each tuned only to be accurate on games it has never seen.
3. Blend with the market, a fixed amount. The market is sharp, so we don't back our own number outright. We turn it into a probability that the bet wins, take the market's own probability straight from the two posted prices, and mix them at a fixed, backtest-fit weight that keeps most of our model's voice. We tested letting that weight bend with the situation — how far the line sits from team-strength math, which direction we lean — and none of it beat the flat weight honestly, so none of it ships. The fair number you see on a card is read back out of that blended probability; the bet itself is priced from the probability directly.
4. Grade the value honestly. The blended probability is priced against the consensus opening line at the real posted juice on each side, and any edge that looks too good to be true is capped at 12%. On spreads the chance we win is read off a plain normal curve rather than football's key-number curve. That was a deliberate change: the key-number curve made the same half-point disagreement worth far more edge near a 3 than near a 10, which meant the line we happened to be looking at — not the model — decided how often we found a bet. The key-number curve is still what we use to re-price a line that has moved, because there a 3 really does matter more than a 10. Severe-weather games get their own rule: model unders proceed, model overs wait for the real forecast.
5. Size the bet. Every bet is the same size: 1 unit, or nothing. A spread play must clear a floor of about 3.1% expected value — derived from where bets stop beating the juice, not picked by feel — and below that it is a pass. There is no ladder, because we checked and the ladder was measuring noise: within the bets we place, the claimed edge does not predict which ones actually deserve to win (rank correlation +0.01). Below the floor our plays deserve about 51%; above it they all deserve about 58%, with no ordering in between. So a 4% play and a 20% play are the same bet, they get the same stake, and they are published at the same flat 10% credited edge rather than their raw claim. Totals are currently stood down — no totals play is produced at any edge while we rebuild that side.
How we find a bet
Every bet is scored by one honest number, EV% (expected value):
EV% = (chance we win × the payout) − (chance we lose)
Pushes are neutral. A bet at −110 needs about a 52.4% real chance just to break even — the extra 2.4% is the house's cut. Our floor sits about 3 points of win-probability above that break-even, and every edge is computed against the consensus line at each side's real juice — never against one book's stray half-point.
We also track CLV (closing line value) — did the market move toward our number after we bet? The closing line is the market's final, sharpest price, so beating it consistently is the best proof a model is genuinely sharp rather than lucky. Better still, think of CLV as a floor on your expected return: if you routinely lock a better number than the market closes at, that edge is real money over the long run — the game-to-game scores just pile noise on top of it.
Does it actually work?
Every number below was graded on a model that never saw the game it’s grading — it only ever learned from earlier seasons and never peeks at the future. 2021-2025 seasons. The tables break the plays out by the size of the game — close spreads vs blowouts, low totals vs shootouts — because a real edge should hold up everywhere, not hide in one corner. Watch the CLV column first: it’s positive in every bucket, which is the honest proof. ROI is profit per unit bet; +5% means $105 back on every $100 risked.
Spreads
| line size | bets | hit rate | xHit rate | ROI | CLV |
|---|
| Pick'em - 3 | 216 | 56.0% | 56.4% | +11.4% | +5.7% |
| 3 - 7 | 376 | 60.0% | 57.4% | +12.8% | +3.8% |
| 7 - 10 | 139 | 62.8% | 58.9% | +19.4% | +3.1% |
| 10+ | 68 | 59.7% | 56.7% | +27.4% | +4.5% |
| All plays | 799 | 59.4% | 57.3% | +14.8% | +4.2% |
Totals
| line size | bets | hit rate | xHit rate | ROI | CLV |
|---|
| All plays | 0 | - | - | +0.0% | - |
The headline: across every qualifying bet, spreads returned +14.8% ROI at +4.2% CLV, and totals +0% ROI at +% CLV — and the CLV stays positive across every game size above, from pick’ems to double-digit spreads and low totals to shootouts. Read the +CLV as the floor on your expected return: we consistently lock a better number than the market closes at, and the realized ROI sitting on top is upside from a market that isn't perfectly efficient.
The deserved layer: xSpread, xTotal, and xCover
Final scores lie. A tipped pass becomes a pick-six, a fumble bounces sideways, a kicker shanks one — and suddenly a team that outplayed its opponent loses by 10. So alongside every real result we compute the deserved result: a play-by-play efficiency model re-scores the game on how each team actually moved the ball and stopped the other — producing xSpread (the margin the game deserved) and xTotal (the points it deserved). The model is trained leave-one-season-out, so it never saw the game it grades.
xCover / P(cover) takes the gap between the deserved number and the line and asks: did this bet deserve to cash? The gap is mapped to a probability with a noise scale fitted directly to historical cover outcomes — bets with this deserved signal covered X% of the time. A win at 20% deserved is a heist; a loss at 75% deserved is a robbery. Over a season the luck washes out — the gap between the win rate and the deserved win rate is how hot or cold a season ran.
The xHit rate column in the tables above is exactly that: the win rate the plays earned, luck stripped. See every bet graded both ways, week by week, on the Deserved to Cover tracker.
Entertainment purposes only. The information on xfpgm.com is not intended to be, and shall not be construed as, gambling advice, financial advice, or any other professional advice or service. xfpgm.com and its owners assume no responsibility for errors or omissions. Past performance is evidence, not a guarantee of future results. Please gamble responsibly — if you or someone you know has a gambling problem, call 1-800-GAMBLER.