r/CFBAnalysis • • Sep 11 '26

Built a CFB spread model and would love some feedback from other model builders

I’ve been building a college football spread model called 6P Predictions and figured this would be a better place to share it than a general betting subreddit.

Site is 6ppredictions.com if anyone wants to poke around. Sign up with a google account, and when it asks for a free access pin, it's 1797.

The basic idea is to create a model number for each game, compare it against the market, and then track whether the model actually identified value rather than just grading wins and losses after the fact.

A few pieces of the model currently include:

- opponent-adjusted team ratings

- dynamic home-field advantage rather than a fixed HFA number

- travel distance and attendance effects

- market spreads and bookmaker movement

- confidence tiers based on the size/quality of the model-market disagreement

- frozen predictions so historical results can’t move after the fact

I’ve also been experimenting with a system I call SmartFreeze, which tries to determine when a market number is worth preserving instead of simply taking whatever line exists at a predetermined time. It looks at things like key numbers, bookmaker consensus/scarcity, price pressure, and line movement. That part is still very much in prospective testing, so I’m collecting data before making any conclusions about whether it actually adds value.

For 2026 so far the published spread predictions are 30-18-1 ATS (62.5%), but I’m very aware that 49 plays is nowhere near enough data to claim I’ve discovered some huge edge. I’m more interested right now in whether the underlying process holds up over a much larger sample.

I’ve tried to make the site unusually transparent: predictions are timestamped/frozen, results stay visible, methodology is documented, and I’m starting to measure performance versus the closing market in addition to ATS results.

I’d especially appreciate criticism from people who build their own models. Things I’m interested in hearing about:

- where you think overfitting could creep in

- better ways to evaluate performance beyond ATS record

- how you handle market information without just turning the model into a copy of the market

- thoughts on CLV as a validation metric

- features you think are missing

- anything on the site/model that looks statistically questionable

I’m trying to build something that can survive scrutiny rather than just post picks when it’s running hot, so feel free to tear it apart.

8 Upvotes

12 comments sorted by

4

u/ReleaseEuphoric6166 Sep 11 '26

I have been modelling edges for almost the last 12 months continuous and the one piece of advice I can give you is when you think you have found an edge backtest it against a randomized control/null. This is the true test of an edge and there are very few. You will see touts on social media about an edge with 15 different conditions that carves out what looks like an edge and 99.9% of time it fails once looking at longer season and against randoms. You can see what I have done at quaizimo.com as reference where I have found a few that worked.

1

u/Coach_RT Sep 11 '26

Did you see the backtest part on the website by chance?

1

u/ReleaseEuphoric6166 Sep 11 '26

Went through it properly. It's better than most — walk-forward by season, you show 2024 losing, and the ROI disclaimer about pregame provider lines is honest.

The tier ladder is the strongest thing on there. 56.2 / 52.7 / 50.8 top to bottom is monotone, which is the shape a real effect has, and it's what u/OnlyTheOvers was getting at. Most people never show that because theirs bounce around

Two questions, both from mistakes I made and only caught in August after a year of believing a number that was wrong.

1) When you rebuild a past week, are you team stats only from prior weeks? If using CFBD's stats the season/advanced ignores the week parameter and hands back the full-season aggregate (or if you don't use n-1 to pull week 7 stats for week 8 games, made both of these at some point) regardless of what you ask for. Live it's fine, because in November the season only contains what's been played. Re-run it in the offseason and every game is scored using stats from games that hadn't happened yet. Mine did this for almost a year.

2) And worse than above is verify ELO returns ratings after week W? So if you fetch week 8 Elo to predict week 8, you're using the result. I proved it three ways, but the simplest was bye weeks: 23 teams idle in week 8 had identical Elo at weeks 7 and 8, and none were unchanged from 6 to 7. Elo carried 0.30 weight in my model.

What those two did to my numbers: published backtest 66.7% on the top tier, rebuilt clean it was 45,.9%. Not a haircut, a complete inverse. The fingerprint was that picks only the leaky version selected went 152-20, while picks in both versions went 142-126.

Neither touched the live record, because a version deployed before kickoff can't contain the result. That's exactly why it went unnoticed so long.

On the numbers you do have: Strong is 150-117, 267 decisions. Confidence interval runs about 50% to 62%, and break-even is a little over 52.% — inside it. So Strong might be a 7% ROI edge or nothing, and 267 games can't say. Worth printing that interval next to the 56%.

2

u/ExternalTangents Florida Gators • /r/CFB Poll Veteran Sep 11 '26 edited Sep 11 '26

Regarding better ways to evaluate performance beyond ATS record:

In terms of predicted vs actual scoring margin (or over/under), I think looking at absolute error, mean-squared error, and bias would be good ways to identify whether you’re actually more accurate than Vegas or if you’re just lucking into the good ATS record.

If you’re also doing any kind of translation of spreads to win probability, tracking whether teams predicted to have an X% chance of winning are actually winning X% of the time.

2

u/ReleaseEuphoric6166 Sep 11 '26

Building on this — I'd go further and say publish the error number, not just track it. We put ours on the card next to every projection. Our margin is off by 13.23 points on average, the line is off by 12.38. Totals, 13.85 for us against 12.34. Worse than the market at both, and we show it anyway.

One thing worth knowing before you run it, u/Coach_RT: a good ATS record and a worse error than the market aren't a contradiction. You can be less accurate overall and still land on the right side of the number 30 out of 49 times. That's most of why I don't trust our own record yet either.

The calibration point above is the right one and there's a harder version of it. Throw your number and the market number into the same regression and see which one still matters. We did that and ours died — our coefficients ran through zero, the market's sat well clear of it. The regression had every chance to find something in our model and found the market instead. You can run that on your 49 games this week.

That's also your answer on using market data without becoming a copy of the market. If the market's coefficient eats everything, you've built a copy. Same test.

On CLV, the first thing I'd check is whether the number you graded at was ever actually available. We freeze once at a set hour and publish the book and the price with the pick, because a number averaged across six books isn't a bet anybody could place.

And to be straight about our own stuff since I linked it: live records right now are 2-3 on the board and the totals rule I like most is 20-23, down 11% on the week. Cleared its controls in testing, still losing. Which is sort of the point of showing it.

1

u/Dazzling-Company-641 Sep 13 '26

Couple things that bit me building CFB spreads:

1) Freeze the prediction at a fixed pre-kick timestamp and grade against the close from that same timestamp. If you keep refreshing into kick, your “edge” is contaminated.
2) Treat market movement as a feature and as a benchmark. If you can’t beat the close over a real sample, ROI is mostly noise.
3) Confidence tiers only help if they’re calibrated - plot predicted cover% vs actual in bins. Pretty labels without calibration just hide overbetting.
4) Dynamic HFA is fine; just validate it out of sample by season, not just by MAE on the training window.

Happy to dig into any one of those if useful.

1

u/Coach_RT Sep 13 '26
  1. Right now it’s at 30 mins before kick

  2. It’s beta right now; just tracking it and publishing results as we go

  3. Please expand further on this.. not certain what you mean

  4. Backtested with dynamic HFA and without and results were statistically significantly better than without

1

u/Dazzling-Company-641 Sep 13 '26

On #3, calibration:

A “high confidence” tag is just a label until you check whether games you tagged ~60% cover actually covered ~60% of the time.

How to do it:
1) Every frozen pick has a predicted cover probability p (or a tier that maps to a p band: e.g. LOW 52-55, MED 55-60, HIGH 60+).
2) After the season (or a big sample), bin by p. In each bin: average predicted p vs actual cover rate.
3) Plot those. A calibrated model sits on the diagonal. If your “HIGH / 65%” bin only covers 54%, that tier is lying. You’re overbetting the label.

That’s why I said tiers without calibration hide overbetting. People size up on “HIGH” because it feels sharp, while the bin is basically a coin flip.

Bonus checks: same plot by spread size and by favorite/dog. A model can look calibrated overall and still be drunk on -14s.

If you want one number: ECE (expected calibration error) across bins, plus the raw table. The table is what other builders actually read.

1

u/shahbucks00711 29d ago

I want to double down on #2. The closing line value is the most accurate measure of whether you have an edge over the market. It's also an easy way to get limited on sportsbooks if you're betting alts, props, and high volume.

I'll bookmark the site and check in later. The design looks great at first glance. Best of luck OP!