NH Legislature 2026

How this forecast works

The short version

This forecast estimates how the November 3, 2026 elections for the New Hampshire General Court are likely to turn out: who wins each of the 24 State Senate seats, how many of the 400 State House seats each party wins in each of the 203 House districts, and therefore how likely each party is to hold a majority (13 senators, 201 representatives). It is built only from public data, every input to every district is shown on that district's page, and the election is simulated 40,000 times.

Four things make New Hampshire different from most states, and the model handles each one explicitly:

1. District baselines

For each district and each reference race we add up the votes of its towns and wards and compute the two-party Democratic margin, then subtract the statewide margin in the same race. That difference is the district's lean. Leans from the 2024 presidential (weight 40%), 2024 governor (15%), 2022 U.S. Senate (20%), 2022 governor (10%) and 2020 presidential (15%) races are averaged. A whole-city entry in a Senate district expands to all of that city's wards.

The district's own most recent legislative result is also turned into a lean, by subtracting that year's statewide legislative environment and removing the incumbency bonus the then-incumbents enjoyed, and blended at 30% when the race was contested. In multi-member districts the "district margin" is the party margin: the mean votes of a Democratic candidate against the mean votes of a Republican candidate, which is unaffected by how many candidates each side fielded.

2. The statewide environment

The anchor is the 2024 presidential result in New Hampshire (Harris by 2.8 points, two-party). The model forecasts a statewide "generic legislative" margin for 2026 and applies the difference as a uniform swing to every district. The generic margin is a blend of polls and a structural prior:

Within each type, polls are weighted by recency (half-life 14 days), sample size (square root), pollster quality (FiveThirtyEight's final numeric grades), and sponsorship (partisan-sponsored polls get half weight and are shifted 2 points against the sponsor); a pollster's second and later polls count progressively less.

The legislative offset. New Hampshire legislative candidates systematically run behind their party's statewide ticket: in 2022 the vote-weighted party margin across contested legislative districts was about 8 points more Republican than the U.S. Senate and U.S. House vote, and in 2024 about 5 points more Republican than the presidential vote. Part of that is the Republican incumbency advantage built up over two cycles, part is ticket-splitting in a state with a long tradition of it. The model subtracts 5 points from the generic margin to get the generic legislative margin. The backtests (which use only pre-election data) missed the actual legislative environment by about 3 points toward Democrats in 2022 and 4 points toward Republicans in 2024 with this offset, which is why it is set where it is and why the statewide error term is 4 points.

The environment page shows every poll, its weight, and each step of this calculation.

3. Candidates

Candidate lists come from Ballotpedia's transcription of the Secretary of State filings, because the Secretary of State's site cannot be reached from the machine that builds this site. Every district page says so.

4. Simulation

The simulation draws three layers of error, shared across both chambers: a statewide miss common to every district (SD 4 points, Student-t with 5 degrees of freedom so a large systematic polling miss is a live possibility), a regional miss shared by districts in the same region (SD 2 points; the regions are the North Country, Upper Valley, Lakes Region, Greater Manchester, Nashua and the Massachusetts border, Seacoast and Strafford, Concord and the Merrimack Valley, and the Monadnock region), and district-specific noise (SD 6 points for Senate seats, 5 points for House district party margins, plus the candidate-level deviations above). Open seats and districts without a recent contested result get a little extra uncertainty.

Chamber control is read off each simulation. The House total is the sum over 203 districts of the Democratic seats won in that simulation, so the correlation between neighbouring districts and between a town's base and floterial seats is carried through naturally.

5. The "what if the polls are off" slider

The slider fixes the statewide generic legislative vote at a chosen value and re-simulates both chambers with the regional, district and candidate error still in play; the curve is precomputed on a half-point grid and interpolated in the browser. The preset buttons apply the statewide misses measured in the 2022 and 2024 backtests, so "2022-style miss" means polls that understated Democrats by the amount they did that year, and "2024-style miss" the reverse.

6. Backtests

The model is run on the 2022 and 2024 elections using only what existed three days before each: district leans from earlier statewide races (only the 2020 presidential race for 2022, the first election on the current map), the ballot and incumbency from the results and the pre-election incumbent lists, and New Hampshire polls of the governor's race, the U.S. Senate or presidential race and the two congressional districts. No national generic-ballot poll list with sources survives for those cycles, so it is left out of the backtests and the backtest says so. The Backtests page reports seats called, Brier scores, margin error and interval coverage for the Senate; and for the House, the accuracy of "Democrats win at least j seats" in each contested district, how often the exact seat split was right, the chamber total, and the statewide miss.

Known limitations and weakest assumptions

Every weight and assumption

This is the complete configuration file the model ran with. Change a number here (in config/model_config.yaml) and the whole forecast re-derives from it.

Show configuration
# =====================================================================
# New Hampshire General Court 2026 Forecast — MODEL CONFIGURATION
# =====================================================================
# Every weight, prior and assumption lives here; the pipeline reads it on
# every run. Margins are DEMOCRATIC two-party margins in percentage points
# (positive = Democrat ahead). "Lean" = district margin minus the statewide
# margin in the same race.
# =====================================================================

election:
  date: "2026-11-03"
  cycle: 2026
  # Everything is up every two years: no holdovers in either chamber.
  house_seats: 400
  house_majority: 201
  senate_seats: 24
  senate_majority: 13
  chambers: [senate, house]        # which chambers to model this run

# ---------------------------------------------------------------------
# 1. DISTRICT BASELINE (partisan lean on current lines, exact by town)
# ---------------------------------------------------------------------
baseline:
  lean_weights:
    pres_2024: 0.40     # most recent high-turnout race
    gov_2024:  0.15     # Ayotte's 2024 coalition; she tops the 2026 ticket
    sen_2022:  0.20     # Hassan v Bolduc, the last midterm
    gov_2022:  0.10     # Sununu v Sherman: a landslide, but informative about where Republicans can over-perform
    pres_2020: 0.15     # older, damps single-race noise (Amherst's 2020 Biden line is missing in the source; excluded there)
  # Blend the lean-based estimate with the district's own most recent legislative result
  # (expressed as a lean vs that year's statewide legislative environment, incumbency removed).
  legislative_result_weight: 0.30
  legislative_result_max_margin: 60
  # Statewide "legislative environment": vote-weighted party margin (mean votes per D candidate
  # vs mean per R candidate) across contested districts that year. Computed from data; fallbacks:
  legislative_environment_fallback:
    2022: 1.1
    2024: -2.6

# ---------------------------------------------------------------------
# 2. CANDIDATE LAYER
# ---------------------------------------------------------------------
candidates:
  incumbency_advantage_pts: 3.0      # Senate (single-member)
  house_incumbency_advantage_pts: 2.5  # House: per-candidate bonus within a multi-member district (estimated from 2022/2024 same-party spreads)
  prior_performance_carryover: 0.35
  prior_performance_cap_pts: 6.0
  quality_overrides: []
  uncontested_win_prob: 0.995
  missing_candidate_penalty_pts: 8.0
  independent_challenger:
    enabled: true
    baseline_penalty_pts: 6.0
    extra_sd_pts: 3.0

# ---------------------------------------------------------------------
# 3. ENVIRONMENT (statewide swing)
# ---------------------------------------------------------------------
environment:
  anchor_race: pres_2024             # NH two-party presidential margin 2024: D+2.8
  prior:
    presidents_party: R
    midterm_swing_pts_toward_out_party: 4.0
    prior_sd_pts: 4.5
    prior_effective_n: 1500
  polls:
    half_life_days: 14
    max_age_days: 90
    sample_size_exponent: 0.5
    reference_sample_size: 600
    # FiveThirtyEight numeric grades (0-3) are mapped by pipeline/polls.py: 0.6 + 0.25 x grade; unrated 0.65
    rating_multiplier: {unrated: 0.65}
    partisan_weight_multiplier: 0.50
    partisan_bias_correction_pts: 2.0
    population_adjustment_pts: {LV: 0.0, RV: -1.0, A: -1.5}
    same_pollster_decay: 0.5
  # Each poll type is converted to an estimate of the statewide "generic" two-party margin, then
  # combined with these weights (renormalised over the types that have polls).
  source_weights:
    nh_legislative_generic: 0.35     # UNH: "which party do you want to control the NH House / Senate" — the only direct measure
    nh_governor: 0.20                # Ayotte v Warmington, corrected for the governor's personal vote
    nh_congressional_generic: 0.15   # statewide "which party for Congress"
    nh_congressional_districts: 0.15 # NH-01 and NH-02 head-to-heads, averaged, incumbency removed
    national_generic_ballot: 0.15    # shifted by NH's lean relative to the nation
  # Governor: Ayotte ran 12.4 pts ahead of the 2024 presidential result (R+9.5 vs D+2.8). Incumbent
  # governors in NH keep most of that personal vote; half of the remaining signal passes through.
  governor_personal_vote_pts: -10.0  # negative = Republican over-performance, in D-margin terms
  governor_pass_through: 0.50
  nh_congressional_pass_through: 0.80
  # NH-01 / NH-02 polls: subtract the incumbent's bonus, average the two districts, pass through
  cd_incumbent_adjust_pts: {nh_cd1: 0.0, nh_cd2: -3.0}   # Goodlander (D) is the NH-02 incumbent; NH-01 is open
  cd_pass_through: 0.70
  nh_lean_vs_nation_pts: 4.3         # 2024: NH D+2.8 vs nation R+1.5
  national_pass_through: 0.80
  # Legislative candidates run behind the top of the ticket in NH: the contested-race party margin
  # was ~8 pts more Republican than the US Senate/US House vote in 2022 and ~5 pts more Republican
  # than the presidential vote in 2024 (see backtests). Applied to the generic margin.
  legislative_vs_anchor_offset_pts: -5.0

# ---------------------------------------------------------------------
# 4. DISTRICT POLLS (none public in 2026; kept for completeness)
# ---------------------------------------------------------------------
district_polls:
  half_life_days: 21
  max_age_days: 120
  internal_weight_multiplier: 0.40
  internal_bias_correction_pts: 3.5
  blend_k: 900
  blend_k_independent: 300
  extra_poll_sd_pts: 4.0

# ---------------------------------------------------------------------
# 5. MULTI-MEMBER HOUSE MODEL
# ---------------------------------------------------------------------
house:
  # Each candidate's two-party share = party mean share (from the district margin) + a candidate
  # deviation. The deviation SD is estimated from the 2022/2024 spread of same-party candidates
  # within districts; this fallback is used if the estimate fails.
  candidate_sd_pts_fallback: 4.0
  # Shrink the estimated candidate SD toward the fallback (0 = use estimate only)
  candidate_sd_shrink: 0.25
  # Fewer candidates than seats: the party's "missing" lines are lost automatically. A party that
  # fields a full slate against a short slate also gains from "bullet" voting, captured in the
  # candidate-count term below (pts of margin per missing candidate on the OTHER side, per seat).
  short_slate_pts_per_missing: 1.0
  # Ticket splitting within a district is what the candidate deviation represents; the
  # independent-draw share says how much of it is uncorrelated across a party's candidates.
  candidate_deviation_independent_share: 0.75

# ---------------------------------------------------------------------
# 6. SIMULATION
# ---------------------------------------------------------------------
simulation:
  n_sims: 40000
  seed: 20261103
  statewide_sd_pts: 4.0           # NH polls missed by ~7 pts D-ward in 2022 (Senate race) and ~3.5 R-ward in 2024 (president)
  regional_sd_pts: 2.0
  district_sd_pts: 6.0            # Senate idiosyncratic
  house_district_sd_pts: 5.0      # House district-level shock shared by the district's candidates
  statewide_t_df: 5
  regional_t_df: 8
  open_seat_extra_sd_pts: 1.5
  no_recent_result_extra_sd_pts: 1.0
  statewide_sd_per_week_remaining: 0.35
  regions: [north_country, upper_valley, lakes, manchester, nashua_border, seacoast, concord_merrimack, monadnock]

# ---------------------------------------------------------------------
# 7. BACKTEST
# ---------------------------------------------------------------------
backtest:
  cycles: [2022, 2024]
  freeze_days_before_election: 3
  lean_weights:
    2022: {pres_2020: 1.0}
    2024: {pres_2020: 0.40, gov_2022: 0.25, sen_2022: 0.35}
  anchor_race:
    2022: pres_2020
    2024: pres_2020
  presidents_party:
    2022: D
    2024: D
  # poll types available in each cycle -> how they enter (see pipeline/backtest.py)
  source_weights:
    2022: {nh_us_senate: 0.35, nh_governor: 0.15, nh_congressional_generic: 0.30, nh_congressional_districts: 0.20}
    2024: {nh_president: 0.45, nh_governor: 0.20, nh_congressional_districts: 0.35}
  governor_personal_vote_pts:
    2022: -20.0     # Sununu, a four-term incumbent who ran ~25 pts ahead of Hassan
    2024: -6.0      # Ayotte as a non-incumbent: expected over-performance before the result was known
  cd_incumbent_adjust_pts:
    2022: {nh_cd1: -3.0, nh_cd2: -3.0}   # Pappas and Kuster were D incumbents
    2024: {nh_cd1: -3.0, nh_cd2: 0.0}    # Pappas incumbent; NH-02 open