Skip to content
pol

Methodology

Every parameter this model uses lives in one file (config/model_params.yml) and is listed below, with a citation where one exists. If a number isn't on this page, it isn't in the model.

How the forecast works

  1. Average the polls. For each race, polls fielded within the last 45 days are averaged — widening to 120 days when fewer than 2 qualify — keeping one poll per pollster and weighting by recency (a 14-day half-life) and sample size (capped at 1,500).
  2. Correct for pollster house effects. Before a poll enters an average, the model subtracts that pollster's estimated lean — how far its polls sit from everyone else's. Every firm's number is published, including the ones the model decided not to act on. The method is spelled out below.
  3. Blend with fundamentals. The poll average is blended with a fundamentals-only prior — partisan lean and incumbency for the Senate; the district's 2024 result and the national swing since then for the House. The more a race has been polled, the more the average counts, saturating at a poll weight of 3.0; a race with no polls sits entirely on its prior.
  4. Simulate 10,000 correlated elections. Every simulated world draws error at four levels and adds them up: one national error (3.0 points) shared by every race in both chambers; one regional error (2.0) per U.S. Census division; one state error (2.0) read by that state's Senate race and every one of its House districts; and each race's own. A bad night in Georgia is therefore a bad night for Georgia's Senate race and its districts together, not fourteen independent coin flips around a shared national mood — which matters, because independent error averages away over 435 districts and correlated error does not. Every error is scaled up the further out from election day the forecast is run (up to 1.75× at its widest).
  5. Call control. 34 Democratic-caucus and 31 Republican Senate seats aren't on the 2026 ballot at all; add each simulated world's contested seats to those holdovers. Because the sitting vice president is a Republican (the tiebreak), Republicans control the Senate at a 50-seat tie and Democrats need 51 — an independent who hasn't said which party they'd caucus with is uncommitted, and a world where an uncommitted independent holds the balance counts toward neither party's control probability. The House is simpler: whoever reaches 218 of 435 seats controls it. A candidate's party (for who wins this race) and their caucus (for who controls the chamber) are deliberately different questions throughout.

Pollster house effects, in plain language

Some polling firms consistently show a race a point or two more Democratic, or more Republican, than everyone else polling the same thing at the same time. That gap is called a house effect. It is not the same as being wrong — it is measured against other pollsters, not against an election result that hasn't happened — but leaving it in means the average partly reflects who happened to poll recently rather than what the electorate thinks.

  1. Measure one poll against its contemporaries. For every poll, we build an average of what other firms found on the same question — the generic ballot, or that specific race — within 45 days either side of it, weighted the same way the model's own averages are. The gap between the poll and that average is the poll's residual. The firm's own polls are excluded from the comparison, so nobody is ever measured against themselves.
  2. Only compare what is comparable. A residual needs at least 3 other firms in the window; against one or two, the "gap from the field" is mostly the other firm's own lean. Polls in races where the polling disagrees about who is actually running, and polls fought against a placeholder opponent, are left out entirely — the same rule that keeps them out of the averages.
  3. Pool a firm's residuals into one number. All of a firm's residuals, across the generic ballot and every race, average into a single estimated lean. Older polls count for less, halving every 180 days, because a firm's methods change.
  4. Shrink it toward zero, then cap it. A firm with three polls might look 6 points off the field purely by chance, so the raw number is pulled toward zero by how much evidence stands behind it: a firm keeps n / (n + 5) of its raw effect, where n is its number of usable polls. Whatever survives that is capped at 3.0 points, just above the largest house effect published research reports. Firms with fewer than 3 usable polls have their estimate shown but not applied.
  5. Subtract it, and publish it. The surviving number comes off each of that firm's polls before they are averaged, and every firm's figures are on the pollsters page — raw, shrunk, and whether it was used. Race pages show the adjustment poll by poll.

One simplification, stated plainly. House effects and polling averages depend on each other: the "field" a poll is compared against is itself made of polls with their own leans. 538 handles that by running its aggregation three times, and Silver Bulletin loops the average and the house effects until the numbers stop moving. We compute house effects once, from unadjusted averages, and then use them. That is a simplification, not a refinement, and it means our effects are slightly biased toward zero for firms polling alongside other firms that lean the same way.

Known limitations

Every parameter

In file order, exactly as config/model_params.yml has them.

Poll averaging

window_days 45
extended_window_days 120
min_polls_in_window 2
half_life_days 14
default_sample_size 400
sample_size_cap 1500
sample_size_pivot 600

Blending polls with fundamentals

weight_saturation 3

Fundamentals — partisan lean & national baselines

incumbency_adj 1.5
open_seat_adj 1.5
pres_national_margin_2024 -1.5
pres_national_margin_2020 4.5
house_national_margin_2024 -2.6
imputed_baseline_margin 35

Chamber control rules

senate_holdover_dem_caucus 34
docs/BUILD_NOTES.md Phase 2 §A2 holdover arithmetic
senate_holdover_rep 31
vp_party rep
docs/BUILD_NOTES.md Phase 2 §A2
senate_total_seats 100
house_majority_seats 218

Simulation

n_sims 10000
stale_run_minutes 30

Election date

date 2026-11-03

Newsroom (Phase 5)

writer_model anthropic/claude-opus-5
brief_model anthropic/claude-opus-5
max_output_tokens 2000
max_dispatches_per_race_per_day 3
max_dispatches_per_day 40
movement_threshold 0.08
movement_note_cooldown_days 7
brief_poll_count 12
recent_headline_count 5
headline_max_chars 90
dek_max_chars 200
body_max_words 450

Data collection

cadence_hours 2
user_agent_contact [email protected]
max_district_sources 40
docs/BUILD_NOTES.md Phase 8 §A (state-by-state district survey)

Site display rules

movers_window_days 7
movers_floor_pp 1.5
docs/BUILD_NOTES.md Phase 3 §8.2 (10,000-sim noise measurement)
movers_count 6
tossup_band_pp 65