Most people who get into sports betting end up with a spreadsheet. They track their bets, maybe a few power ratings, maybe a homemade adjustment for rest days. The leap from "spreadsheet bettor" to "actual model" sounds intimidating, but it is just a series of small, concrete decisions: pick what you want to predict, pick the stats you trust, train it, test it honestly, and turn it loose. This guide walks through that exact arc inside the Tinker builder, so you can build a sports betting model without writing any code.
Step 1: Pick the target
The single most important decision in any modeling project is what you are predicting. In sports betting, your target is usually one of:
- Game margin — home team final score minus away team final score. Useful for spread bets.
- Total points — combined score. Useful for over/under bets.
- Win probability — binary 1/0. Useful for moneyline bets.
- Player stat — points, rebounds, passing yards. Useful for prop bets.
For your first model, pick game margin in a sport you watch a lot. The volume of data is high, the closing lines are public, and the feedback loop is quick — you find out within hours of kickoff whether your prediction was reasonable. In the Tinker builder, the target picker is the first dropdown, and "home team margin" is a sensible default.
Step 2: Choose your inputs
Your inputs are the stats and signals your model leans on to make its call. The temptation is to throw everything in. Resist that. A model with 5 well-chosen inputs consistently beats one with 50 noisy ones, especially on a small slate of past games.
For an NFL margin model, a strong starting set is:
- Vegas spread line — the closing spread is the single best input in football, because it already bakes in everyone else's homework. Use it as your baseline to beat.
- Net EPA per play, last 8 games — efficiency above replacement, on offense minus defense.
- Quarterback availability — binary or ELO-style adjustment for the starting QB.
- Rest differential — days since last game for home minus away.
- Travel distance — west-coast-to-east-coast 1pm games are a real effect.
This 5-input setup will get you within shouting distance of the closing line. Adding a 6th only helps if it tells you something the other five do not already.
Always include the schedule
Any game-level model in Tinker needs the schedule added to its inputs so the trainer can tell one matchup from another. This one is mandatory — without it the trainer cannot match each prediction back to how the game actually finished. Tinker flags it for you, so just make sure it is in the list before you train.
Step 3: Train and read the output
Training is where the model learns the relationship between your inputs and what you are predicting. You hit train, it runs through every past game, and you get back four key numbers:
- Train RMSE — how closely the model fits the games it studied. Gets better with more inputs, but watch out for overfitting.
- Validation RMSE — how well it does on games it never saw. This is the honest number.
- Cover rate vs spread — does the prediction beat the closing line? Anything above 52.4% breaks even at -110 juice.
- Edge per bet — how much you expect to make per unit wagered.
For a first NFL margin model on, say, 5 seasons of data, a healthy validation RMSE is in the 12-14 range. Cover rate should land somewhere between 50% and 53%. If you see 56% cover rate on a brand-new model with 5 features, something is wrong — usually one of your stats secretly contains the final score or some other clue from after the game started, which you would never have when placing the bet.
Step 4: Backtest like you mean it
Backtesting just means replaying your model against past seasons as if you had bet them live: the same juice you would actually pay, the same units you would actually risk, going game by game in order so the model only ever uses what it would have known before kickoff. The backtest tab in Tinker handles all of this if you pick your seasons carefully.
Three rules for an honest backtest:
- Always test forward in time. Build on weeks 1-8, then check on weeks 9-16. Never let the model train on weeks 1-16 and then "test" on weeks 9-12 — it already saw those answers and the result is a lie.
- Grade against the closing line. Opening lines make your model look better than it is, because the closing line has soaked up more information by kickoff. The fair test is whether you beat the close.
- Charge real juice. -110 means you need 52.38% to break even. Make sure your backtest counts the vig — report your cover rate after the juice, not your raw win percentage.
A worked example with concrete numbers
Imagine you train an NFL margin model with the 5 features above on the 2018-2024 seasons, then check it season by season on games it never saw. The results:
- Validation RMSE: 13.1
- Cover rate: 52.9% over 1,840 games
- Edge per bet at -110: 0.9 cents per dollar
- Sharpe (risk-adjusted): 0.31 over the test period
That is a real, modest, profitable model. At a flat $100 per game over 1,840 bets, it produces about $1,650 in expected profit. Not life-changing, but a baseline you can build on. The next move is to see what a 6th input adds: weather, a divisional flag, a recent ATS streak. Add one stat, re-train, and compare cover rate and Sharpe — adding junk often bumps cover rate by luck while quietly dragging Sharpe down.
Common first-model mistakes
- Letting the model see the future. If any stat includes information from after the bet went down, your results are fake. The most common culprit: a season average that accidentally includes the very game you are predicting.
- Cherry-picking which games you train on. Building only on "games where the home team scored more than X" warps the model, because it never sees the other half of reality.
- Tweaking until the backtest looks good. If you keep swapping stats and re-running the same backtest, you are just fitting to that one stretch of games. Hold back a final batch of seasons you never touch until the very end, then test on those once.
- Confusing "signal" with "story." A stat with a good narrative ("rest is huge in Week 17") is not the same as a stat that actually moves results. Let the numbers decide, not the takes.
Step 5: Deploy and monitor
Once your model has shown a real edge on seasons it never saw, the last step is letting it make live picks for you. Tinker's publish flow turns a trained model into a live prediction stream that shows up on the picks pages. From there you can watch its real-time cover rate against the closing line. If the live cover rate falls more than 3 percentage points short of the backtest over 100+ bets, something has shifted — usually the market has caught up, or your stats have stopped predicting games in the new environment.
The model leaderboards stack published models against each other over real betting samples — the cleanest scoreboard in the system. You will see your model's rolling cover rate, edge per bet, and sample size — the same numbers from the build, but now from live action.
Where to start tomorrow
Open the Tinker builder, pick NFL margin as what you want to predict, and use the 5-stat starter set above. Build on 2018-2024, then check it on the 2025 season it never saw, and look at the RMSE and cover rate. From there, the loop is simple: add one stat, retrain, compare. After 5-10 cycles you will know which inputs actually carry weight in your sport.
Bottom line
Building a sports betting model is a series of clear decisions, not a black-box mystery. Pick a clean thing to predict. Choose 5 to 7 strong inputs. Test it season by season on games it never saw. Charge real juice in your backtest. Go live only when the cover rate clears 52.4% on a real sample, and keep watching the live cover rate against the closing line.
The Tinker builder makes every step visible — you see the inputs, the training output, the backtest curve, and the live picks. There is no magic, just the discipline of grading your own work honestly. Once that loop is running, every extra model is just another turn of the same crank. Stack your results against published models on the leaderboards to see where you land.
Take it the rest of the way in Shark Snip
Once the five-stat starter model is training cleanly, the natural next step is to open the Workshop with the same inputs pre-loaded and start the loop one change at a time. Add a single stat, retrain, log the cover rate against the prior version — that is the entire workflow for your first ten model versions. Once a build clears the 52.4% breakeven mark across a season it never saw, publish it to the creator marketplace so other bettors can follow it, check its record, or build on it. Use the leaderboard as the scoreboard: a model that beats the closing line over a real sample shows up there, and a model that keeps losing closing line value gets exposed fast. If you want a low-stakes way to feel how the model performs without risking your bankroll, drop the same projections into the NFL auto-battler and watch how it plays out across a simulated season.
Bet responsibly — set limits, never chase losses.
Named modeling examples
A model page is more useful when the feature examples are concrete. Josh Allen rushing attempts, Ja'Marr Chase target share, Nikola Jokic assist rate, Tarik Skubal strikeout projection, Igor Shesterkin starter confirmation, and Islam Makhachev control time are all different prediction problems. A single “player form” feature cannot explain them all, so the model needs sport-specific inputs and review notes.
- NFL: separate route participation, pressure rate, and red-zone role from box-score volume.
- NBA: separate usage, minute projection, pace, and back-to-back fatigue.
- MLB: separate starter skill, handedness, park, weather, and lineup confirmation.
- NHL and UFC: late confirmations and fight-week news can matter more than a season average.
Model inputs worth naming
Use names as evidence, not decoration. The useful SEO win is that Josh Allen, Ja'Marr Chase, Bijan Robinson and Puka Nacua and Chiefs, Bills, Eagles and Lions appear inside decisions, thresholds, and internal links instead of being dumped into a keyword list.
- NFL model: route participation for Ja'Marr Chase, rushing attempts for Josh Allen, pressure rate allowed by the Bengals, and red-zone carry share for Jonathan Taylor should be separate features.
- NBA model: usage, projected minutes, rest, and pace should move Nikola Jokic or Shai Gilgeous-Alexander props differently than a one-number power rating.
- MLB model: Tarik Skubal strikeout projection, Coors Field park factor, lineup confirmation, and bullpen rest need their own columns.
- Review loop: grade entry price, closing price, bet result, and model error separately so lucky results do not hide bad forecasts.
Build or audit the workflow in Tinker and review it with CLV.
Research note board
Use this model-audit board to keep features, validation, and bet sizing from collapsing into one confidence score.
| Model layer | What to inspect | Example input | Downgrade when |
|---|---|---|---|
| Feature | Whether the variable maps to the sport and market | Josh Allen role data or closing line value price movement | The feature is a proxy for something you can measure directly |
| Validation | Out-of-sample error, CLV, calibration, missing data | Chiefs market movement after injury news | Wins come without beating the close or improving calibration |
| Sizing | Bankroll, confidence interval, correlation, market limit | vig exposure compared with related tickets | Multiple bets repeat the same thesis at full stake |
Model calibration: predicted vs observed
Predicted win probability bucket vs the empirical win rate inside that bucket on the test set. Points on the y=x reference line are perfectly calibrated; points below mean the model is overconfident in that bucket.
EV per $100 across win rate × odds grid
Expected value of a $100 stake at each combination of true win rate and market odds. Anywhere the cell is positive you have a long-run profitable bet; the magnitude shows how aggressive Kelly will size it.



