← Notebook

Model Development · Kept

Retrained on five seasons of history

Elo and training now start in October 2021 instead of 2023. On held-out seasons, the longer history matched or beat the shorter one.

Question

Elo ratings and the training data both started in October 2023. That kept the model focused on recent basketball, but it threw away two seasons of games that the database already had. Is more history better, or does older basketball (a different pace, different rules emphasis, different rosters) just add noise?

Why more history need not mean older basketball

Two mechanisms keep recent games in charge even with a longer history. First, training weights decay with age, so a game from three seasons ago counts for about 13% as much as last night’s:

model/train.pylines 101–104
# Recency weighting — slower decay over 2 years
max_date = pd.to_datetime(train['game_date']).max()
days_ago = (max_date - pd.to_datetime(train['game_date'])).dt.days
sample_weights = np.exp(-days_ago / 550)

Second, Elo pulls every rating 25% of the way back toward 1500 each summer, so a 2021 rating has largely faded by 2024.

What the longer history adds is earlier Elo ratings (by 2023 every team has a well-settled rating instead of starting from 1500) and more examples of rare situations: elimination games, long injury absences, extreme rating gaps.

Check

Both start dates were trained and compared on the same held-out seasons:

Held-out seasonWinners picked, 2023 startWinners picked, 2021 start
2025-2665.3%67.0%

Margin and total errors were lower with the longer history in two of the three test seasons (2024-25, 2025-26 and 2026-27 so far).

Change

data/ingestion/team_strength.pylines 28–33
# First game replayed. Training and live must use the same start, or live Elo has
# more history than the ratings the model learned from. 2021-10-19 = first game of
# 2021-22, the earliest season in the DB (moved from 2023-10-24 on 2026-11-07 with a
# retrain on the full history; out of sample it matched or beat the 2023 start on
# 2024-25, 2025-26 and 2026-27). Change it only together with a retrain.
ELO_START_DATE = '2021-10-19'

Live forecasts replay the same games as training, so the ratings the model sees each night are the ones it learned from.