Broncos Betbot 2026: the program
A user manual and a guide to what the software does, why, and what it has shown. Written Mon Oct 5 2026, after the Week 4 settle;
numbers from the ledger, the settle reports and the study notes as of that afternoon. Terms with a dotted underline link to the glossary (hover
for the definition); figure and section references link to their targets. Repo copy: docs\BETBOT_PROGRAM.html.
Part 1. What Betbot is contents
1.1 In one paragraph
Betbot is a player performance model with a betting slip attached. Every week it takes the free NFL data (play-by-play, usage, snap counts, injuries, Next Gen Stats, pressure and coverage charting), the weather and the referee, and predicts what each player on the Broncos game will do: catches, yards, carries, touchdowns, passing lines. It then reads every line FanDuel offers on the game, works out where its own probability beats the price by a margin, sizes those lines with a fraction of the Kelly stake, and prints a card. The operator places the card by hand, ticks each ticket off on a local confirm page, and on Monday the whole thing is reconciled against FanDuel's own record to the cent and graded. The question it is built to answer is whether its probabilities are right; whether that makes money at FanDuel's prices is the second question, and the card's record answers it in the open.
1.2 What you get each week
| Output | What it is |
|---|---|
| The card | A priced table of the lines the model stakes: market, player, side and line, FanDuel's price, the model's probability, the market's no-vig probability, the edge in points, the stake, the minimum price to accept, the token to attach, a one-line reason. The footer shows the roll it was sized on, the Kelly fraction, the caps and the gate numbers. |
| The route page | The same tickets in the order FanDuel's app is laid out: biggest money first, with the search word, the market tab and the button label to tap. Rows turn red if a ticket was placed with no ledger row. |
| Serve | A confirm page on 127.0.0.1:8787. Each placed ticket is ticked with its real stake and price; ladder tickets ask for the rung from the slip, because FanDuel's rung label is the line (the "3+" rung is over 2.5). |
| Previews | The matchup preview (who is pressuring whom, what the secondary allows each receiving role), the injury preview (what the card would look like with the inactives' usage redistributed), and from Week 5 the paper board: every game on the slate priced as paper, the model's calibration evidence. |
| The Monday report | The card graded against what happened and against the closing price; the card by side; the calibration table; the gate line that says whether the Kelly step is earned; one reconciling cash line so the roll ties to FanDuel's balance. |
1.3 The rules, on one screen
- One roll. $400 in once, no refills, in play every week until the season ends or it is gone. No all-in tickets.
- Broncos games only. The models train on the whole league; the money goes on Denver's game.
- FanDuel only, and never by robot. Pages are saved by hand from Chrome; prices come from The Odds API, a licensed feed of FanDuel's board. Nothing automated touches the account.
- Before the close. Every card ticket goes in before the model's own closing snapshot at kickoff minus nine, so every ticket has a closing price to be measured against.
- The card is the only evidence. Card tickets at the card's stake and price, judged against what happened and against the close. Anything else on the account is recorded for the cash tie-out and goes no further (D17).
- Money and doctrine are the operator's. The model recommends; the operator decides, at the Monday settle, in writing, with the evidence beside the decision.
- Additive records, preview before execute. Nothing is deleted from the ledger; every operation proposes before it writes.
- Sunday freeze. From noon on game day until the close lands: no code changes, no ledger writes.
1.4 Who does what
The operator presses the keys, saves the pages, types what the system cannot see (tokens, inactives, the referee, shadow matchups, the rung on a ladder ticket), places and confirms every ticket, and makes every money and doctrine decision. Code (Claude Code) builds the software from written, numbered pastes, one commit per step with the tests green, and reports back. The reviewer reads the reports and the logs, writes the next paste, keeps the state page and the tracker current, and tells the operator what to press. The runner (GitHub Actions) refreshes the data every night and takes the closing and paper-board snapshots on schedule.
Part 2. Why it exists contents
2.1 The objective, in the operator's words
"I'm ok with high percentage bets - even if the margin isn't wide. I want a player performance prediction model more than I want a 'book-beater'. I'm ok with aggregate consistency, or high percentage parlays with the boosts they offer. The idea is narrowing the guesswork on each individual player's performance given the conditions and matchups - and how that equates to the team's performance."
Steve, Oct 5 2026
That sets the bar. A book-beater is judged on dollars against the close, a few tickets a week, and takes a season to say anything. A performance model is judged on whether its probabilities are right on every line it prices, hundreds a week across the league, and says something in a month. Betbot is built for the second test and keeps the first as a diagnostic.
2.2 Why a model at all
The 2025 season was a manual system with AI help. Its 52 recorded picks beat FanDuel's closing price by +5.05% on raw prices and +0.57% after the book's margin, with 19 of 52 beating the close: a coin flip, on a sample that could not be told from luck because nothing recorded a probability before the game. In 2026 every line on the board gets a probability before kickoff, every ticket is recorded with the price taken, the model's number, the market's number, the closing price and the result, and Monday ties the lot to FanDuel's record. "Is the model any good" becomes a table, and from Week 5 the table grows by about 490 lines a week.
2.3 Why the money rules look like this
| Rule | Setting | Why |
|---|---|---|
| Kelly at a quarter | 0.25 of the growth-optimal stake | The standard discount for a probability that is estimated rather than known; a bad week stays a bad week. The step to a half is a coded gate (D6): it opens only when calibration has been measured on enough lines, and the report prints KELLY GATE MET the week it does. |
| Caps | 4% a ticket, 80% a week, 10% on one-sided markets, SGPs at half the fraction and $10 | The operator's own activity is not scored here; the weekly report carries one aggregate line for it (paste 53). |
| The band and the edge | Both probabilities between 25% and 75%; the model at least one point over the market | The model has no record on longshots and FanDuel's margin is widest there. |
| The blend | Sizing on the average of the model's and the market's probability, edge capped at eight points | The 2025 study showed the raw model is overconfident on two-way lines (figure 3); a card sized on it would have sat 14 to 25 points above the market in Week 1. |
| The stake gate | Three targets in the last three games, 10% target share, 40% snap share | Week 2 priced a tight end on his 2025 starter role two weeks after he lost it. |
| One-sided markets | Priced against a market-fair reference, shrunk 70% toward it, withheld past +400 | Anytime TD and ladder rungs have no opposite side to remove the margin from (D16). |
2.4 Why calibration is the proof (D19)
Closing-line value is the bettor's classic test: did the price you took beat the price at the close. It has two problems here. The card places eight to ten tickets a week, so four weeks are forty measurements and a yes or no at that count is noise. And FanDuel's props board often does not move at all in the last hours: in Week 4 none of the 1,496 selections moved between the card and the close (figure 10), so every ticket's CLV was exactly zero, which says nothing about the model either way.
Calibration asks a better question of a performance model: when it says 60%, does it win 60% of the time? The gate to half Kelly reads exactly that, by decile, on every line the model prices league-wide: largest gap five points or under on 1,000 or more two-way lines over four graded weeks. The paper board (section 5.6) supplies the lines; the first reading comes around the Week 7 settle. CLV stays in the report as a diagnostic.
2.5 Why the card is the only evidence (D17)
A FanDuel account carries more than the card: a substitution when a line moved, a parlay built by hand, an in-play ticket. In one pile with the card's tickets, the model's record would be unreadable after a season. So the card's own tickets at the card's stake and price are the evidence; everything else is recorded in the ledger because the roll has to tie, is capped by a rule of the operator's own, and appears in the report as one cash line. A card ticket placed after the close or after kickoff leaves the pre-close record for the same reason: it has no close to be judged against.
2.6 Why nothing changed at Week 5 (D18)
The 2025 study (figure 2) says the model's favoured overs lose at the close and its unders hold, and the reviewer recommended unstaking the overs. The operator declined: "The model is what it is. Without long-term statistical proof that overs are a bad choice, there is no reason to change them." One season of backtest is one sample and 44 live tickets are noise; a settings change on that would be the over-fitting the project exists to avoid. The live by-side table in every report is the running test, and the question re-opens at the Week 9 settle.
2.7 What is being built next, and why
- The paper board. Every game on the slate, every week, snapshotted early and late, priced by the same model and settings, graded Monday. It turns about ten evidence tickets a week into about 490 two-way lines a week, for about $1.10 of API credits a week.
- The backfill. FanDuel's historical closes for 2024 and 2023 are being bought in batches (2025 is on disk: 284 games, 8,172 two-way lines), so the model is tested on three seasons of real prices and so that the operator's four-year point holds: four years is about an NFL career and twice as good as two at telling a pattern from a fluke.
- Matchups and Next Gen Stats. Expected pressure rate, expected line yards, what each defence allows each receiving role, each corner's own coverage numbers, separation and air yards. Built nightly into their own tables, joined only by study rows, adopted only when a backtest with its sentence written beforehand says so. The Week 5 preview already reads:
Bo Nix vs LAC pass rush: LAC pressure 27.6% (10th), DEN allows 22.6% (17th), expected 28.9%
DEN run game vs LAC front: DEN line yards 2.99 (15th), LAC allows 3.06 (20th), expected 3.14
DEN passing vs LAC secondary: LAC allows 7.64 (26th) yards an attempt; its defensive backs allow 9.55 (28th) yards a target
LAC against WR2 (Courtland Sutton): 69 yards on 6.7 targets a game (28th fewest)
Justin Herbert vs DEN pass rush: DEN pressure 22.2% (21st), LAC allows 30.1% (31st), expected 31.0%
- The regression matrix. Every open model question in one harness with fixed folds, an untouched holdout and pre-registered pass sentences (section 4.5); decisions at the Oct 12 settle for anything that passes with margin.
- The boost lane. Two- and three-leg parlays of the highest-probability legs, with FanDuel's parlay-only boosts in the expected value, backtested first; a preview inside the Sunday run if it passes.
2.8 The decisions that shape it
| Decision | When | What it says |
|---|---|---|
| D3 | Aug 25 | No browser automation against FanDuel. Saved pages and typed inputs only; The Odds API for prices. |
| D6 | Aug 25, amended Oct 5 | The Kelly step from 0.25 to 0.50 is a coded gate rather than a judgment call; it now reads calibration. |
| D7 | Aug 25, amended Oct 5 | What counts as proof: calibration and accuracy on every priced line; CLV a diagnostic. |
| D16 | Sep 10 | One-sided markets priced against a market-fair reference and shrunk toward it; longshots withheld; matchup features ship one at a time with a backtest against the market baseline. |
| D17 | Sep 28 | The card is the only model evidence; other tickets on the account are recorded for the cash tie-out and go no further. |
| D18 | Oct 5 | No settings change for Week 5; overs, passing markets and the stake gate stay as live all season; review at the Week 9 settle. |
| D19 | Oct 5 | Proof is calibration. The league-wide paper board; the multi-season backfill; a pattern search on the whole history. |
Part 3. Running a week contents
Everything is a key on one menu, ops\Betbot.cmd. The header shows the next game, the countdown, the newest card, open tickets, tokens,
whether the close task is scheduled and whether the feature table is fresh. Every key leaves a dated transcript in ops\logs; the
quick-start card is H and the full manual is M.
3.1 Saturday: prep
Find the week's referee on footballzebras.com, then press P. It refreshes the feature table through the current week,
checks the close task is scheduled for kickoff minus nine (press 2 if the header says otherwise), asks for the referee
(Enter skips; game lines stay unquoted without one), opens the shadow-matchup file in Notepad (one line per pairing, CB <defender> shadows
WR <receiver>; close it if none), prices the paper board for the games already snapshotted, makes the capture folder and prints the
Sunday clock.
3.2 Sunday: the card
- Kickoff minus 90. The inactives post. Save FanDuel's Rewards page into
data\exports(Ctrl+S, "Webpage, Single File"). - Kickoff minus 70. Press G. It runs the status check, refreshes only if the table is stale, takes the tokens
(Notepad: one
addline per boost, or the saved Rewards page once paste 52 lands), the referee, the inactives file, the matchups file, then builds the board, the card, the route page and serve, prints the injury preview and the paper board, and shows the clock. It refuses after the close and asks before the inactives are out. - Placing. Work the route page in its order. After FanDuel confirms a ticket, tick it on serve before starting the next. Tap exactly the button the route page names; read the side back from the slip before Place Bets. Line moved: skip it, never the neighbouring line. Ladder lines: FanDuel's rung label is the line. A token whose minimum stake is above the card stake stays unused. SGP only at or above the ladder's first non-zero price.
- Kickoff minus 20. Press 5: every placed ticket has a ledger row, by name; nothing on the wrong side; the close task is Ready.
- Kickoff minus 9. The close lands by itself; L shows
CLOSE LANDEDwith the feed's own timestamp. If it did not, 6 runs the fallback loop. From here, no card tickets. - After the game. Save My Bets (settled) and Transaction History (from its own URL, one save per page) into
data\exportswith the names 7 prints.
3.3 Monday: settle
Press 7. It reads the two saved pages, proposes every ledger change (tickets matched by FanDuel id, voids, the cash rows,
the runner's closing snapshot, the paper board) and writes nothing. Send the log to the reviewer; on a yes press 8: the same
with apply, then the grade, the report in docs\reports, the roll tied to FanDuel's balance, the spent close task removed. Decisions, if
any are due, are made here and recorded in docs\DECISIONS.md.
3.4 Reading the report
| Block | What to look at |
|---|---|
| Card as built, card as placed | The model's result at card prices, and what the operator's placement did to it. The gap between the two is execution, and every gap so far has produced a rule or a tool. |
| By side | Overs and unders separately: the running test of D18. |
| Evidence tickets and CLV | Tickets placed before the close, with the price movement to the close. Zero movement is a measurement. |
| Calibration | Predicted against realised by decile, with n, for the card and (from Week 5) the paper board; both counts shown, priced rows and two-way lines. |
| The gate line | Where the Kelly step stands against its numbers. |
| Other account activity | One cash line so the roll ties; nothing else. |
Part 4. What the evidence says contents
Every number below is walk-forward (the model never sees the game it is scored on), scored against what happened and against FanDuel's closing price with the margin removed, reported with its count, and produced under a pass sentence written before the run. Noise is stated with the number: the standard error of a hit rate on n sides is about 50/√n points.
4.1 The 2025 season against FanDuel's closes
What it means. The model's probabilities are useful on unders and on claimed edges above five points, and nothing in the settings makes it a book-beater at the close. Passing markets lose on both sides. The dollars, if they come, come from placing at kickoff minus 70 against a close that rarely moves, or from a better model, which the matrix in section 4.5 is testing now.
4.2 The card's record, Weeks 1-4
4.3 Three studies the card is waiting on
4.4 What would prove the reasoning wrong
- A paper-board calibration table whose largest decile gap stays above five points after four graded weeks and 1,000 lines: the probabilities are not usable at face value and the gate stays shut, whatever the roll does.
- The unders edge (figure 2) failing on the holdout and on the paper board: the one finding the cards lean on was a 2025 artefact.
- The live split (figure 6) reversing over a season: the overs finding does not transfer to 2026 prices.
- The roll reaching zero before the evidence does: the experiment ends on money, which is what the caps are for.
4.5 Being tested now: the regression matrix
One harness, eight fixed folds inside 2025 (weeks 7 to 14 scored), a holdout nobody chose anything with (2025 weeks 15-18, the playoffs, 2024 as it
lands), and a pass sentence written before each run. Rows: the persistence of each stat year over year (which picks the model's windows); injury
usage; Next Gen Stats; FTN tendencies; the matchup features, each and cumulative; the live LightGBM against a tuned one and an automated ensemble
with SHAP so the patterns have names; the market-anchored refit; sacks re-fitted on posted players; the boost lane. A feature row is adopted if
log-loss beats the base on every market it feeds, its largest reliability gap is no worse, and the holdout agrees in sign. A row that passes the
folds and fails the holdout fails. Verdict in docs\REGRESSION_MATRIX_2025.md; decisions at the Oct 12 settle.
Part 5. How it works contents
5.1 Data
The free side is nflverse: play-by-play, usage, snap counts, rosters and injuries since 2016, Next Gen Stats since 2016, PFR pressure and coverage
since 2018, FTN per-play charting since 2022, refreshed nightly by the runner and on Saturday by P. Weather is an hourly
forecast at the stadium. The paid side is The Odds API with the FanDuel filter: a live board is about 1,500 selections across 58 markets for 65
credits; historical closes are sold at ten credits a market from May 2023 for props. The feature table (player_game) holds each
player's rolled usage and production before each game, about 25,000 rows a season, 55 inputs; the Next Gen, charting and matchup tables sit
beside it and are joined only by study rows, so nothing enters the live model without a decision.
5.2 Models
The live props model (player_props-1.1.0) is LightGBM, one model per market, predicting a mean and a spread per player-game; counts are
priced on a negative binomial, yards on a log-normal or gamma, and the probability of any line comes from the fitted distribution. Game lines are
Normals with the closing line as an input; their first backtest said they do not beat the close, so they price team totals and SGP legs and are rarely
staked. One-sided markets use a market-fair reference fitted on 2025 closes. Two refits are queued behind the matrix: a dispersion refit per market
and position (1.3.0) if the spread check fails, and the market-anchored refit (2.0.0) that takes the market's number as an input and learns where
it is wrong.
5.3 From board to card
- Pull FanDuel's board for the game (one full pull; a second inside 15 minutes is refused; a credit floor stops any pull unless forced).
- Price every selection: the model's probability, the market's no-vig probability, the edge, the EV.
- Gate: feature readiness (no referee, no game lines), the stake gate, the role-change check in weeks 1-3, the band on both probabilities, the minimum edge, the TD price floor.
- Size: blend the two probabilities, Kelly 0.25 of the ledger's roll, then the caps.
- Tokens: assigned after sizing; a token never raises a stake.
- SGP: a copula proposer builds the parlay from card legs; the ladder prints the stake at each FanDuel price.
- Write the card, the route page and serve; store every line with its numbers as of the build.
5.4 The ledger and the settle
SQLite, additive only. Every priced selection ever stored (about 226,000 rows, 189,000 of them historical closes), every card and its lines, every ticket with its origin, stake, price, boost, model probability, closing price and result, every token with its terms, every Transaction History row. Corrections are new rows with the ticket id as evidence; paper tickets are evidence and never cash. Monday's settle proposes, then applies: My Bets matched by FanDuel id, cash rows imported, the closing snapshot fetched, the paper board graded, the report written, the roll tied to the balance.
5.5 The runner and the close
GitHub Actions does three things: the nightly data refresh and feature build (10:00 UTC), a closing snapshot at kickoff minus eight for every standard slot (guarded so it only fires when a Broncos game is inside the window; the result is downloaded at the settle), and the paper-board snapshots at six weekly slots plus 6 AM Sunday for London. On the PC a scheduled task takes the close at kickoff minus nine; the close refuses a stale feed, so a flat board is a measurement, never an artefact.
5.6 The paper board
Every slate game is snapshotted twice by the runner, early and late, and priced as paper by the same model and settings as the Broncos card with stakes sized on the $400 opening roll so weeks compare. Monday grades it, and the report's calibration block reports priced rows and two-way lines separately, because the gate counts two-way lines once each: about 490 a week, so the 1,000-line floor is reached around the Week 7 settle. Paste 52 adds game lines (weather and a referees file for every game), an early-against-late movement section, and pricing on the runner right after the snapshot.
5.7 What it costs
Everything but the prices is free. The Odds API is $59 a month for 100,000 credits: a full board is $0.04, a live game week about $0.24, a season of historical closes about $39.50, a paper-board week about $1.10. The rules since October: no plan change mid-cycle (unused credits expire on the 1st), a spend-down check on the 25th, backfills in batches of 40 games with the estimate printed first and a credit ceiling on every call, and any test that could spend runs on a copy of the ledger with a zero ceiling.
5.8 How the work moves
- Pastes. The reviewer writes a numbered instruction file; the operator tells Code to read it; Code works it in order, one commit per step, tests green, and reports with the numbers the paste asked for.
- Sentences before numbers. Every model or feature change carries its pass sentence in the paste, before the run. A run that fails the sentence is reported as failed, whatever else it shows.
- Decisions at the settle. Nothing reaches the live card without a decision row the operator answers on a Monday, recorded in
docs\DECISIONS.md. - Typed inputs, saved pages. Tokens, inactives, the referee, shadow matchups and ladder rungs are typed; My Bets, Transaction History and Rewards are saved from Chrome. Nothing is scraped from FanDuel.
Glossary contents
Every term below is linked from its first use in each section (dotted underline; hover for the definition).
- Two-way line
- A line with an over and an under at posted prices; the unit the gate counts.
- Paper board
- Every slate game, every week, priced as paper tickets and graded; the calibration evidence.
- Paper ticket
- A recorded prediction with no money on it; evidence in grading and calibration, excluded from the roll and every cap.
- Route page
- The placement order for the card in FanDuel's own layout, with the search word, the tab and the button label.
- One-sided market
- A line with no opposite side to remove the margin from (anytime TD, ladder rungs, sacks); priced against a market-fair reference.
- CLV, closing-line value
- How much better the price taken was than the closing price, raw or with the book's margin removed; a diagnostic since D19.
- Close, closing line
- The board at kickoff minus nine minutes, taken by the scheduled task or the runner; the market's last price.
- No-vig
- The market's probability with the book's margin removed (the two sides of a line scaled to sum to 100%).
- Fold, walk-forward
- A fit on weeks 1 to k, scored on week k+1; eight fixed folds inside 2025 for the matrix (weeks 7 to 14 scored).
- Holdout
- Data never used to choose anything, scored once at the end: 2025 weeks 15-18, the playoffs, 2024 as it lands.
- Log-loss, Brier
- Scores of a probability against what happened; lower is better; both are reported against the market's no-vig number.
- Calibration, reliability
- Whether lines the model calls x% win x% of the time, measured by decile; the largest gap between predicted and realised is the gate's number.
- Decile
- One of ten probability buckets (50-60%, 60-70% ...) that the calibration table is read by; each bucket needs enough lines for its gap to mean anything.
- Standard error, noise
- How far a measured rate can sit from the truth by chance alone: about 50 divided by the square root of n, in points, for a hit rate on n sides. A result inside two standard errors of zero is reported as noise.
- Kelly gate (D6)
- The coded rule (D6, read through D19) that moves the Kelly fraction from 0.25 to 0.50: largest decile gap five points or under on 1,000 or more two-way lines over four graded weeks. The card footer and the settle report print its numbers (the gate line); the report prints KELLY GATE MET the week it opens.
- Kelly fraction
- The share of the growth-optimal stake actually used; 0.25 live, 0.50 behind the calibration gate.
- Stake gate (6b)
- Usage thresholds a player must clear before his line is staked: three targets in the last three games, 10% target share, 40% snap share.
- Ladder, rung
- FanDuel's alternate lines on a stat (10+, 20+ yards); the rung label is the line (3+ is over 2.5).
- SGP
- Same-game parlay; the price is read from FanDuel's slip and typed by hand; nothing is scraped.
- Token
- A FanDuel promotion (profit boost, bet reset, no-sweat, bonus bet) with its terms, inventoried and assigned after sizing.
- Snapshot, batch
- One pull of a board into odds_snapshots; every row carries its batch id and, since schema v10, the feed's own timestamp.
- Paste
- A numbered instruction file the reviewer writes for Code (ops\pastes\paste_NN_name.md); Code works it in order and reports back.
- Settle
- Monday's two-phase tie-out (propose, apply) of the ledger to FanDuel's record, then the grade and the report.
- Serve
- The local confirm form (127.0.0.1:8787) where each placed ticket is ticked with its real stake and price.
- Roll
- The FanDuel balance as the ledger knows it; cards size on it; $496.03 today.
- Edge
- The model's probability minus the market's no-vig probability, in points.
- EV
- Expected value: the average return per dollar if the probability is right, price and boost included.
- Credits
- The Odds API's unit of spend: one per market per region per request for live boards, ten for historical.
- The Odds API
- The licensed price feed that carries FanDuel's board and closes; costs credits, carries no account risk; the only paid data source.
- nflverse
- The open-source NFL data project (play-by-play, stats, snaps, rosters, injuries, Next Gen Stats, PFR, FTN charting); free, refreshed nightly.
- Runner
- The GitHub Actions jobs: nightly refresh, closing snapshots at kickoff minus eight, paper-board snapshots. Downloads to the PC as artifacts; never writes the ledger.
- Board
- Every selection FanDuel offers on a game at one moment, as stored from The Odds API (about 1,500 selections) or from saved pages.
- Card
- The model's priced table of staked lines for the Broncos game, with stakes, minimum prices and token suggestions; the only model evidence.