Midterm Pulse2026
Data
ENES

HOW IT WORKS · MP-26

From every poll to one probability.

Midterm Pulse turns a public poll index and a race-level benchmark into House and Senate odds in seven auditable steps. Every chart below runs on the live model, its data and its engine.

Loading the live model…

The short version

Five steps, no math.

  1. 01

    Start from a forecast for every race

    An outside benchmark gives each of the 435 House districts and 35 Senate races an expected margin: who is ahead, and by how much.

    —e.g. one Senate race
  2. 02

    Take the country's temperature

    Average the national polls that ask which party people will vote for in Congress. Newer, bigger and likely-voter polls count more.

    —weighted average of all two-party polls
  3. 03

    Nudge every race

    If the national average has moved since the benchmark was made, every race moves with it, by 70% of the change.

    —moved since the benchmark
  4. 04

    Admit what we don't know

    Any race can miss by around 7.5 points. Part of that miss hits every race at once, because polls tend to be wrong in the same direction everywhere.

    ±7.5points per race, ±2.9 of it shared nationally
  5. 05

    Play the election 50,000 times

    Each run rolls the dice for the country and for every race, then counts the seats. The odds are simply how often each party wins a majority.

    —House and Senate odds

Want the math? The seven steps below run on the live model. Unsure about a word? Read the glossary →

01 Inputs

Two public sources feed the model. Everything else is context.

MP-26 does not collect polls or rate races itself. It reads Vote-Scope's generic-ballot poll index and its race-level forecast, adds the current Senate composition, and keeps other data strictly out of the probabilities.

  • Refresh every 15 minutes, with a dated fallback snapshot
  • Benchmark run —

Feeds the model

Vote-Scope poll indexGeneric-ballot polls→ weighting
Vote-Scope race forecastEvery race's expected margin→ race margins
119th Congress47 D caucus · 53 R · 34 D and 31 R seats not up→ fixed Senate seats

Context only

Census boundariesMaps and district shapesnot an input
FEC filingsCandidates and finance on race pagesnot an input
PolymarketCompared against the model, never blendednot an input

02 Poll weighting

Recent, large, likely-voter polls count most.

Every poll gets a weight from three factors. Recency halves every 30 days, sample size counts by its square root, and likely-voter samples beat registered voters and adults. The weighted average of all polls is the national environment.

w = 0.5age/30 × √(n / 1,000) × pop
  • pop LV 1 · RV 0.86 · A 0.72
  • Result —
Loading polls…

03 Movement

Only real movement since the benchmark is applied.

The benchmark was built with the polls available on its run date. So the model compares the same index, with the same weights, today and on that date. The difference is the only national movement it adds, and each race absorbs 70% of it.

movement = ballottoday − ballotbenchmark date
Loading…

04 Race odds

Every race becomes a probability.

Each of the 470 races starts from the benchmark's expected margin, plus its share of the movement. A normal error of ±7.5 points, calibrated to the benchmark's own race odds, turns that margin into a win probability.

  • Tipping point —
Loading races…

05 Error budget

Races miss together, not one by one.

Polls tend to miss in the same direction everywhere. So each race's error is split in two: a national error shared by all races, and local noise of its own. The shared part is sized to match the correlated error the benchmark publishes.

outcome = margin + national + local
  • National ±4.1 ballot pts × 0.7 = ±2.87
  • Total per race ±7.5 pts
Loading…

06 Simulation

Run the election 50,000 times.

One simulation draws a national error, then a local error for every race, and counts the seats each party wins. Repeat 50,000 times per chamber and the share of runs with a majority is the control probability.

  • House 435 districts, 218 to win
  • Senate 35 races + 65 seats not up; a 50–50 tie goes to the GOP via the Vice President
Loading…

07 Outputs

One response feeds the whole site.

The API returns control odds, seat medians and 80% intervals, and a probability for every race. The home story, the Senate builder, the district map, race pages and the model page all read the same numbers.

  • Deterministic fixed seeds: same inputs, same output
  • Cached until the benchmark, polls or date change
Loading…

08 Versions & limits

Versioned, documented, and backtested.

Every change to the method gets a new version and a changelog. The probability engine has been replayed on the 2018 and 2022 midterms and scored; the model stays labelled experimental because its benchmark cannot be replayed.

Model validation →Sources and methodology →
  1. v0.1Top-down chambers against a fixed D+7.4 baseline. The Senate read 69% while its own races implied 43%.
  2. v0.2Like-for-like movement, Senate simulated race by race, race error calibrated to the benchmark.
  3. v0.3House simulated race by race too; national error sized to the benchmark's correlated error.
  4. v0.4 · currentRace margins read as the benchmark's expected D−R vote, not its expected winning margin; race error refitted to ±7.5.

Known limits

  • Normal errors; the benchmark uses fatter tails.
  • One national factor; no regional correlation.
  • No pollster house effects or candidate fundamentals.
  • Backtest covers the probability engine, not the benchmark (no 2018/2022 Vote-Scope data).