This page is a snapshot of the model's last run. To refresh with the latest lines, run the pipeline and republish:
Each refresh downloads fresh nflverse lines, reruns Engine A and Engine B, appends new timestamped rows to both logs (older rows are never edited), and rebuilds this page. Game-day plan: refresh Sunday morning, and again close to kickoff for any game in the watch list.
Every pick against the market favorite, and how many of them won. Each underdog pick costs, on average, the gap between the favorite's and the dog's probability; this is where family members give back points to the all-favorites picker.
These are estimates, not known picking behavior. They are fitted from 2024–2025 weekly scores, which show how far each member's week strayed from the all-favorites score but never which games they picked. Flagged zero-score weeks were treated as missed entries, not as contrarian picks. Actual 2026 picks, once logged in pool_picks.csv, progressively replace these priors.
Descriptive only. Casey's +3 over two seasons is inside the noise of a 500-game sample and is not evidence of predictive skill.
The production probability is the no-vig consensus moneyline. A challenger football model may adjust it only after showing chronological out-of-sample improvement over the market. None has.
Each block adds features to logit(P) = a·logit(P_market) + Σ b·x. Test log loss must fall for a block to stay. It never does.
Objective: Ryan's probability of finishing first, not expected correct picks. Monte Carlo over the remaining schedule with common random numbers: game outcomes drawn from Engine A probabilities, each opponent's pick drawn from their fitted tendency and team lean, standings carried forward, ties split evenly. For every game this week the engine compares P(first) with the favorite against P(first) with the underdog, jointly across the week. Robustness is the size of that effect against the simulation's own noise: HIGH is more than three times the noise, MEDIUM between one and three, LOW inside it, and LOW resolves to the favorite. (Until Week 4 a deviation also needed the same sign with the family modeled half and twice as contrarian; an 11-season replay showed that veto left about one dog a season and no gain, decision D27.)
Every Engine B run is a new set of timestamped rows. Nothing is edited after the fact; a later refresh adds rows.
We pick the team the betting market says is more likely to win, in every game, because two seasons of family scores and twenty seasons of NFL history both say that nothing else does better. The clever part is not predicting football. It is measuring how the family picks, so we know whether it ever pays to disagree with them.
A moneyline like Seahawks −166 / Patriots +140 is the bookmaker's price on each team. Convert each price to an implied chance, then rescale so the two chances add to 100%, which strips out the bookmaker's cut ("the vig"):
q = 100 / (ML + 100) if the moneyline is positive q = |ML| / (|ML| + 100) if it is negative P(home) = q_home / (q_home + q_away)
For that game: q = 0.624 and 0.417, so P(Seahawks) = 0.624 / 1.041 = 60%. This is the only "football model" in production.
Across — regular-season games since 2007, the market favorite won — of the time, and the probabilities are honest at every level: teams priced at 60–65% win about 60%, teams priced at 80–85% win about 84%. A season is 272 games, which makes the margin of error on a picker's accuracy about ±3 points, so a 66% picker and a 68% picker are indistinguishable in one year.
We then tried to beat it. A logistic regression with the market as the starting point and extra factors added one block at a time:
log-odds(home wins) = a · log-odds(market) + b₁·Elo + b₂·rest + b₃·division + b₄·cold + b₅·wind + b₆·QB change
Trained on past seasons and tested on later ones (2014–2025), every added block made the predictions slightly worse. With the market alone the fitted slope is 1.04, which means the line needs no correction. Coin flips were checked separately: home teams win 50.5% of games where the favorite is under 55%, exactly what the line already implies. Full tables are on the Model & audit tab.
Most correct picks does not win a pool. Finishing ahead of six specific people does. Those are different targets:
Score objective: maximize expected correct picks → always take the favorite Pool objective: maximize P(Ryan's score ≥ everyone else's) → depends on what they pick
Here is why they can differ. If all six opponents take a 60% favorite and Ryan does too, the game changes nothing; if it were the only game, everyone ties and Ryan's chance of first is 1 in 7. If Ryan alone takes the 40% underdog, his chance of first is 40%. So taking an underdog can raise the chance of finishing first even though it lowers the expected score. Whether it actually does depends on how often the others pick underdogs themselves, and by how much. That is a measurement question.
CBS does not show past picks, but it shows weekly scores. If a member always took favorites, their weekly score would equal the all-favorites score exactly. Every underdog pick moves it up or down by one point, so the scatter of a member's weekly gap identifies how often they deviate without revealing which games:
D = member's points − all-favorites points, each week E[D²] ≈ r · n_close + r² · (Σ (1 − 2p))² solve for r, the underdog rate
Fitted on 2024–2025 (the more recent season counting double), shrunk toward a cautious prior, with unentered weeks treated as missing rather than as contrarian. As real 2026 picks are revealed after each kickoff they progressively replace the estimate:
rate = (observed underdog picks + prior × 10) / (observed picks + 10)
These are estimates, labeled as such on the Pool strategy tab. Two known team loyalties (Packers, Bears) are modeled only for the members who told us about them.
Three times a week the pipeline downloads fresh lines and plays the rest of the season 20,000 times: each game's winner is drawn from the market probability, each opponent's pick from their fitted tendency, and the standings carried forward. For every game this week it compares Ryan's chance of finishing first with the favorite against the same with the underdog, and recommends whichever is higher. The robustness grade says how big that difference is compared with the simulation's own noise: HIGH is a clear call, MEDIUM a real but smaller one, and LOW means the two are too close to tell apart, so LOW always resolves to the favorite.
"Refresh now" asks GitHub to run the same pipeline the schedule runs: fresh lines, both engines, new log rows, rebuilt page. It needs a GitHub token with permission to start that one workflow. The first tap asks for it; after that it lives only in this browser (never in the page, never in the repository). Make one at GitHub → Settings → Developer settings → Personal access tokens → Fine-grained → Generate: repository access only brauns-pickem, permissions Actions: read and write. A refresh takes one to two minutes and the page reloads itself when the new build is live. Forget the token on this device.
Descriptive, not proof: over 500 games, a few points either way is noise. The point is the direction, not the margin.