NBA Four-Factors Composite

Preseason

Exhibition games, scored by the early-season carryover model on last season's games only and priced from Kalshi. Starters rest, so these rows show how far the offseason view travels, not regular-season skill.

Tracked apart from everything else: never in the Ledger, Calibration, hypotheses or any fit (tag fourfactors_hl25_b2b_carry25_preseason_g0).
How to read these numbers Judge every ROI against its null: the ROI if the market's no-vig prices were exactly right. That is about −4% (the hold: Kalshi's taker fee and spread, or the bookmaker's margin), not zero. Market is Kalshi's last pre-tip price wherever a game has one (2025-26 on), else the sportsbook close; the hypotheses stay on the sportsbook prices they were registered on. ± is one standard error (1 SE). Colour marks only gaps of at least 2 SE from the null: green above, red below; everything else is left plain. Shaded columns are the ones to read first.
Glossary
Lean
The side the model gives ≥ 50% (as recorded on the row).
Value side
The side where the model's probability beats the market's no-vig probability. Graded only through the pre-registered hypotheses; the blanket value bet is retired (see the note under the hypotheses).
Model %
The picked side's mean model win probability.
Market %
The picked side's mean no-vig market probability (q): the price with the bookmaker's margin removed.
Win %
How often the picked side actually won.
Break-even
The win rate the posted price needs to pay back; above q by about the hold.
ROI
Profit per 1-unit bet.
Null
The ROI expected if the market is right (q × payout − 1). vs null = ROI − null.
z
(ROI − null) ÷ SE. Across many cells, about one in twenty shows |z| ≥ 2 by chance.
EV
Win % − break-even; its null is q − break-even.
Fav ROI
1u on the market favourite of the same games at the same price: the same-row baseline a pick rule has to beat (a tie at 50% goes to home).
Log loss, Brier
Proper scores of the probabilities; lower is better. Compared with the close on the same games.
Preseason
Written before tip and frozen, like native rows, but exhibitions.
Reconstructed
Scored afterwards with that season left out of the fit and graded at the close: hindsight, never forward evidence.

66 games recorded: 66 with a model P, 66 with a pregame price, 66 graded, 66 graded with a model P and a close.

Preseason · exhibitionKalshi close · 2026-27log loss model − market +0.1399 ± 0.0618 · n=66
Probabilities vs the close (log loss)
Market better
by 2.3 SE · model − market +0.1399 ± 0.0618 (1 SE)
0.8128 vs 0.6729 · n=66
Brier (model / market)
0.2937 / 0.2397
model − market +0.0540 ± 0.0254 (1 SE) · market better by 2.1 SE
Picked the winner (model lean / market favourite)
50.0% / 54.5%
same games · accuracy is not calibration
Model vs market calibration, P(home win)
Model Market (no-vig close)
0%0%20%20%40%40%60%60%80%80%100%100%Stated probabilityActual win rateModel, 0.0–0.2: stated 16.3%, actual 100.0% (n=1, ±2 SE 73.9 pp)Model, 0.2–0.3: stated 26.2%, actual 60.0% (n=5, ±2 SE 39.2 pp)Model, 0.3–0.4: stated 35.6%, actual 37.5% (n=8, ±2 SE 33.8 pp)Model, 0.4–0.5: stated 45.3%, actual 66.7% (n=9, ±2 SE 33.1 pp)Model, 0.5–0.6: stated 54.4%, actual 42.9% (n=7, ±2 SE 37.6 pp)Model, 0.6–0.7: stated 64.2%, actual 40.0% (n=10, ±2 SE 30.3 pp)Model, 0.7–0.8: stated 74.7%, actual 76.9% (n=13, ±2 SE 24.1 pp)Model, 0.8–1.0: stated 85.3%, actual 46.2% (n=13, ±2 SE 19.5 pp)Market (no-vig close), 0.2–0.3: stated 28.4%, actual 100.0% (n=2, ±2 SE 63.7 pp)Market (no-vig close), 0.3–0.4: stated 33.6%, actual 40.0% (n=5, ±2 SE 42.2 pp)Market (no-vig close), 0.4–0.5: stated 44.8%, actual 46.7% (n=15, ±2 SE 25.7 pp)Market (no-vig close), 0.5–0.6: stated 54.5%, actual 31.2% (n=16, ±2 SE 24.8 pp)Market (no-vig close), 0.6–0.7: stated 65.3%, actual 73.3% (n=15, ±2 SE 24.5 pp)Market (no-vig close), 0.7–0.8: stated 74.0%, actual 66.7% (n=9, ±2 SE 29.2 pp)Market (no-vig close), 0.8–1.0: stated 81.0%, actual 75.0% (n=4, ±2 SE 39.2 pp)

Each point is one probability bin: across the x-axis what was stated, up the y-axis how often it happened. On the dashed diagonal = calibrated. The bar is ±2 SE, where a correct forecast would usually land; a bar that misses the diagonal is a real miss, not noise. Hover a point for its numbers; the table below has them all. Both forecasts are for the same games; each is binned on its own probability. Negative model − market on the scores means the model did better; an interval spanning 0 has not separated them.

Model bins in numbers — with the market's mean on the same games
Model P(home)nModel meanMarket mean (same games)ActualActual − model (± 1 SE)
0.0–0.2116.3%48.8%100.0%+83.7 ± 37.0
0.2–0.3526.2%48.6%60.0%+33.8 ± 19.6
0.3–0.4835.6%45.8%37.5%+1.9 ± 16.9
0.4–0.5945.3%50.8%66.7%+21.4 ± 16.6
0.5–0.6754.4%50.2%42.9%-11.5 ± 18.8
0.6–0.71064.2%60.9%40.0%-24.2 ± 15.1
0.7–0.81374.7%64.5%76.9%+2.2 ± 12.0
0.8–1.01385.3%63.2%46.2%-39.2 ± 9.8

Flat 1u bets at the pregame price — Preseason · Kalshi close · 2026-27

Lean — the model's favourite

PicksnW–LROINullvs null (± 1 SE)Win %Break-evenModel %Market %Fav ROI
All picks6633–33-18.3%-4.0%-14.3 ± 10.650.0%60.7%69.1%58.4%-17.0%
Game by game — newest first
DateAway @ HomeModel P(home)Pregame q(home)Close q(home)Final (away–home)
2026-10-16DEN @ LAL60.8%66.5%57.9%121–106
2026-10-16POR @ GSW49.8%41.5%48.8%118–128
2026-10-16UTA @ PHO79.3%61.9%61.9%119–116
2026-10-16ATL @ DAL32.8%52.0%50.7%135–111
2026-10-16SAC @ SAS89.4%81.5%80.7%97–126
2026-10-16CHO @ MEM24.5%56.5%56.5%98–117
2026-10-16WAS @ NOP77.1%52.0%52.5%106–107
2026-10-16MIN @ CHI37.1%66.5%66.5%116–133
2026-10-16MIA @ ORL50.1%66.5%70.5%115–136
2026-10-16BOS @ PHI42.8%60.5%77.5%125–120
2026-10-16TOR @ DET74.4%76.7%78.7%125–129
2026-10-16MIL @ IND61.6%72.5%71.5%128–127
2026-10-15OKC @ HOU49.1%43.1%43.5%89–116
2026-10-15TOR @ NYK63.2%64.5%58.3%120–122
2026-10-14DEN @ LAC56.3%37.5%34.5%110–122
2026-10-14PHO @ SAS77.1%76.7%80.5%103–123
2026-10-14NOP @ DAL52.7%41.1%43.5%101–97
2026-10-14CHI @ MIL57.1%45.5%32.8%125–104
2026-10-14DET @ MIN46.2%62.5%63.5%128–106
2026-10-14BRK @ MIA87.9%61.9%60.5%128–144
2026-10-14CHO @ BOS63.3%71.8%74.8%93–114
2026-10-13GSW @ LAL76.4%53.0%43.5%101–89
2026-10-13POR @ SAC44.6%41.1%31.5%110–98
2026-10-13IND @ OKC83.1%71.5%67.2%112–114
2026-10-13CLE @ ORL42.8%46.5%46.0%116–132
2026-10-13NYK @ TOR63.4%76.5%75.5%98–148
2026-10-12SAS @ UTA20.1%64.5%66.5%109–119
2026-10-12MIN @ NYK67.2%50.5%48.0%122–104
2026-10-12OKC @ ATL50.0%60.5%63.5%110–113
2026-10-12BRK @ WAS64.1%57.5%55.5%131–122
2026-10-11CHI @ DEN81.1%68.5%68.5%128–133
2026-10-11MIL @ CHO83.3%56.5%56.5%90–105
2026-10-11ORL @ CLE74.6%63.9%63.9%105–119
2026-10-11DAL @ HOU81.2%52.0%50.5%132–115
2026-10-10SAS @ PHO39.4%28.5%29.2%98–102
2026-10-10SAC @ GSW71.2%67.5%68.5%106–111
2026-10-10MIN @ MIA57.7%32.2%43.3%125–124
2026-10-10PHI @ BOS74.5%67.2%68.8%106–144
2026-10-10ATL @ IND32.7%53.0%53.5%119–117
2026-10-10DET @ WAS16.3%44.9%48.8%108–114
2026-10-10LAC @ TOR63.8%60.7%60.9%106–114
2026-10-09MEM @ CHI69.0%54.5%54.5%104–100
2026-10-09HOU @ DAL33.6%46.5%42.5%135–117
2026-10-08SAC @ LAL84.4%77.5%74.8%110–114
2026-10-08ATL @ SAS70.3%71.5%71.5%123–116
2026-10-08NOP @ MIA72.6%72.5%71.5%118–128
2026-10-08PHI @ BRK28.3%27.5%27.5%108–114
2026-10-08WAS @ NYK90.0%68.5%67.5%111–109
2026-10-08BOS @ CLE56.7%41.5%63.5%124–113
2026-10-07GSW @ POR75.0%80.5%81.5%118–123
2026-10-07ORL @ MEM38.4%45.8%47.5%122–118
2026-10-07MIL @ OKC84.2%82.7%81.5%128–126
2026-10-07PHO @ CHI41.5%45.3%42.5%117–124
2026-10-07MIN @ IND36.4%43.1%44.1%112–123
2026-10-06LAL @ GSW47.9%61.2%67.8%98–124
2026-10-06DEN @ UTA29.3%49.5%50.0%117–106
2026-10-06NOP @ OKC83.4%46.5%44.5%116–110
2026-10-06BRK @ CHO90.4%52.0%50.5%124–90
2026-10-05LAL @ SAC28.8%35.5%42.5%127–103
2026-10-05MIN @ MIL34.6%34.8%32.5%116–97
2026-10-05MEM @ ATL86.9%59.5%59.5%132–123
2026-10-05PHO @ DET75.5%56.5%53.5%107–109
2026-10-05NYK @ PHI43.1%39.5%36.5%97–120
2026-10-04UTA @ DEN84.1%60.5%59.5%109–97
2026-10-04GSW @ LAC72.9%42.6%42.6%101–104
2026-10-03MIA @ TOR65.7%64.2%51.8%129–105

q is the no-vig market probability. Prices are refreshed each build until tip and frozen after; prices are Kalshi's YES asks with the taker fee included (as American odds: what a bet costs); q is the bid/ask midpoints normalised (the market's view), and the close is the last 1-minute Kalshi candle before tip. b2b_net is read from the previous day's scoreboard.

Built 2026-10-19 07:42 UTC. Win probabilities from prior-game four factors, roster talent and the NBA injury report; the market is a benchmark only and never enters the model. Full statistics: ledger_report.txt · model tags and coefficients: Model. Not betting advice.