# Portland Trail Blazers — independent basketball forecast

Snapshot: October 10, 2026. Model independent-basketball-v2.

This model projects each scheduled Portland game and sums its probability to expected season wins. No betting odds or market totals enter the new strength ratings or probabilities. The original market-anchored state is retained only as an immutable comparison and as the source of already-parsed official schedule geometry.

## Reproduce offline

Python 3, NumPy, and SciPy are required. Run from the extracted directory:

```
python calibrate_independent.py
python build_independent.py
python render_independent.py
```

These commands regenerate the **preseason baseline**. Do not run the preseason builder over a live state containing completed games. `independent-state.json` and the HTML's `forecast-state` script contain the full machine-readable forecast. `forecast-builder`, `independent-inputs`, and `calibration-builder` preserve the source in the report. The standalone scripts and all official raw JSON snapshots are supplied here.

Expected output: approximately 44.606 wins; median 45; central 80% interval 32–57. Seed 202610102; 200,000 seasons. Minor floating-point differences are possible across library versions. Sum of the 82 marginal probabilities is the authoritative expectation; the finite simulation mean differs slightly.

## Files

- `independent_inputs.py`: explicit all-team roster, rotation and availability assumptions; detailed Portland player grades and minutes.
- `calibrate_independent.py`: fit opponent-adjusted offense/defense, schedule effects, historical persistence and uncertainty; evaluate a locked 2025–26 benchmark.
- `build_independent.py`: team projections, per-game margin components, uncertainty simulation and prospective archives.
- `render_independent.py`: report and CSV rendering from state; it does not alter probabilities.
- `Portland-82-Game-Forecast.csv`: full per-game output and explanations.
- `independent-data/`: NBA team logs, advanced/four-factor/base stats, player logs and current rosters. Matching `.source.json` files record exact API URLs.
- `original-state.json` and `original-market-builder.py`: immutable prior model, clearly distinguished from the independent benchmark. Never execute the old builder for an update.
- `raw-stats.txt`: original official NBA advanced-stat response used to enumerate team IDs when refreshing snapshots.
- `fetch_independent.py`: optional online NBA refresh helper. It skips existing snapshots; preserve dated originals when refreshing.
- `MANIFEST-SHA256.json`: file hashes for reproducibility.

## Interpret the assumptions correctly

Measured: official box-score performance, schedule and roster identities. Estimated: opponent-adjusted past performance, home/rest effects, previous-season retention and historical residual uncertainty. Judgment: player future minutes, impact grades, team roster changes, development, recovery timing, small travel and matchup effects.

Portland uses a minutes-weighted player-grade ledger. The other 29 teams use documented team-level offense/defense changes; their projected rotations help explain those judgments and set health uncertainty. This is not a fully estimated all-player RAPM/EPM model. Positive defensive rating means points prevented.

The 2025–26 held-out Brier score (~0.2333) evaluates only the historical rating foundation. It does not establish calibration of this year's roster adjustments or season-total tails. The central 80% range is deliberately wide because shared team uncertainty affects many games together. The health component draws aggregate season availability, not actual dated injuries. Exact proprietary shot quality and reliable future lineup effects are unavailable.

## Preserve history when updating

1. Materialize the authoritative current report; read `forecast-state`. Never assume this baseline bundle is the latest state.
2. Verify final official NBA identities, score and season type. Process newly completed games chronologically and deduplicate. October 7 preseason game 0012600033 is already known.
3. Archive the genuinely pregame probability before any result is added. Retain separate original-market, independent-preseason, and latest-pregame series. No retrospective forecast substitution.
4. Update all-team regular-season strength using one regularized margin fit centered on these independent preseason ratings, with prior information equivalent to 20 games. Document the precise design/penalty when first applied. Prefer consistently possession-adjusted, garbage-time-filtered data; otherwise use score margins clipped to ±25 and disclose the fallback. Preseason scores never enter the fit. Do not add a duplicate win/loss update.
5. Refresh availability, trades, rotations and opponent profiles with dated evidence. Replace season-average health with near-term scenarios without counting an injury twice. Resolve both Cup-dependent regular-season slots when assigned, excluding the Cup championship and updating both teams' rest/travel.
6. Recalculate actual wins plus remaining probabilities; rerun shared-uncertainty simulations. Preserve parameters unless an evidence-supported change is documented. Separate the mechanical result effect from strength/availability revisions.
7. Save the same report identity; calculate Brier and log loss only against archived pregame probabilities. After 82 regular-season results, issue the final forecast-versus-actual review.

No preseason result is included in the 82-game record. No postseason opponents are fabricated.
