Methodology

How we aggregate prediction markets

Prediction Markets Aggregation

The Markets page aggregates real-time probabilities from two major prediction markets: Manifold Markets (community-driven) and Kalshi (real-money exchange). This provides a live, crowd-sourced forecast updated automatically as new trades occur.

Overall Weighting: 40% Manifold + 60% Kalshi

Manifold Markets (40% weight):

  • Community prediction market using play money
  • Lower barrier to entry, broader participation
  • Captures general consensus and casual forecasters
  • Uses an Automated Market Maker (AMM) for price discovery
  • Good for long-term sentiment, less susceptible to short-term noise

Kalshi (60% weight):

  • Real-money exchange with cash-settled contracts
  • Higher barrier to entry, attracts serious forecasters with skin in the game
  • Reflects genuine conviction (money is at risk)
  • Traditional order book exchange (bid/ask spread pricing)

Kalshi Component Breakdown (60% total weight)

Within Kalshi's 60% weight, we use three price signals:

1. Last Price (42% overall = 70% of Kalshi's 60%)

  • The most recent completed trade price
  • Reflects real money execution and recent market sentiment
  • Given highest weight because it shows actual conviction backed by capital
  • Most responsive to new information and recent trades

2. Midpoint (12% overall = 20% of Kalshi's 60%)

  • Average of the current best bid and best ask prices: (bid + ask) / 2
  • Represents the fair value between buyers and sellers right now
  • Includes current order book state but not yet executed
  • Smooths out last trade anomalies or outliers

3. Liquidity-Weighted Price (6% overall = 10% of Kalshi's 60%)

  • Purpose: Captures buying vs selling pressure by analyzing where the last trade occurred within the bid-ask spread
  • Why only Kalshi? Kalshi uses a traditional order book exchange where buyers and sellers post bids and asks. Manifold uses an Automated Market Maker (AMM) that algorithmically sets prices, so order book analysis doesn't apply
  • How it works: Calculate position in spread = (Last Price - Bid) / (Ask - Bid). Position of 0.0 = traded at bid (sellers aggressive), 0.5 = at midpoint (balanced), 1.0 = at ask (buyers aggressive)
  • Spread dampening: Wider spreads reduce the adjustment because they indicate less confidence. At 0pp spread: factor = 1.0 (full shift potential). At 10pp spread: factor = 0.2 (heavily dampened)
  • Example: Bid=60, Ask=68, Last=66, Mid=64, Spread=8. Position = (66-60)/8 = 0.75 (near ask). Offset = 0.75 - 0.5 = +0.25. Dampening = 1 - (8/10)×0.8 = 0.36. Shift = 0.25 × 6 × 0.36 = +0.54pp. Result = 64 + 0.54 = 64.5% (buyers showed aggression)
  • Caps shift at ±3 percentage points to avoid overreaction

The Complete Formula

Aggregate Probability = (0.40 × Manifold) + (0.42 × Kalshi Last Price) + (0.12 × Kalshi Midpoint) + (0.06 × Kalshi Liquidity-Weighted)

Soft Normalization (30% Strength)

Final probabilities are lightly normalized to prevent excessive drift while preserving raw market values:

  • Candidates with no Kalshi market (marked with *) use 100% of their Manifold probability
  • Only 30% of the normalization adjustment is applied to each candidate
  • 70% of the raw aggregated value is preserved
  • This keeps top candidates higher while preventing probabilities from summing to unrealistic totals

Update Frequency

  • Default: Every 3 minutes
  • Final 3 days before election: Every 1 minute
  • Election day: Every 1 minute

Historical snapshots are saved with every update and aggregated hourly for clean trend visualization.

Questions?

IL9Cast's prediction market aggregation is maintained by Ryan McComb, a student at ETHS, as an educational project to help voters understand real-time sentiment in the Illinois 9th Democratic Primary race.

For questions about the market aggregation methodology or to report data issues, please reach out directly.