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
Thin-Market Fallback (Midpoint & Liquidity)
When a candidate has no yes-side bids (yes_bid = 0), the standard midpoint formula (yes_bid + yes_ask) / 2 produces a meaningless number, because it averages zero against the ask and inflates the result. In these cases both the Midpoint and Liquidity-Weighted components fall back to the candidate's last trade price, and the spread-based liquidity adjustment is skipped because there is no real two-sided market to analyze.
The aggregate goes one step further. If a candidate's Kalshi book is one-sided (no bid or no ask) or locked (the ask is not above the bid), Kalshi is treated as inactive for that candidate and the aggregate uses Manifold alone, exactly as for a candidate with no Kalshi market. A last trade with no current bid behind it can be stale, and counting it would overstate thinly traded candidates.
Example, Mike Simmons: Simmons has virtually no buy-side interest on Kalshi. His order book might show yes_bid = 0, yes_ask = 19, last_price = 1. Without the fallback, the midpoint formula would compute (0 + 19) / 2 = 9.5%, and the liquidity-weighted price would land around 7.8%, suggesting 8 to 10% support for a candidate trading at 1 cent. With the fallback, both components report 1%, matching his last trade, and because his book is one-sided his aggregate comes from Manifold alone.
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 × 8 × 0.36 = +0.72pp. Result = 64 + 0.72 = 64.7% (buyers showed aggression)
- Shift is proportional to the spread width, so the result always stays within the bid-ask range
The Complete Formula
Aggregate Probability = (0.40 × Manifold) + (0.42 × Kalshi Last Price) + (0.12 × Kalshi Midpoint) + (0.06 × Kalshi Liquidity-Weighted)
Why Aggregation Beats Single-Source Data: The Laura Fine Example
A real incident during this race perfectly illustrates why IL9Cast's multi-source approach is more reliable than watching a single market.
What happened: A trader on Kalshi bought Laura Fine yes-contracts aggressively, pushing the last trade price all the way up to 30%. Then they stopped. The market maker immediately placed no-orders at 16%, while existing yes-orders sat unfilled at 14%. For quite a while, Kalshi's displayed probability showed 30%, based solely on that last executed trade.
The reality: The actual market consensus was a 14-16% spread. No one was willing to buy above 14%, and no one was willing to sell below 16%. The 30% price was a single trade artifact, not a reflection of genuine market sentiment.
IL9Cast's response: Our aggregated probability showed the upward price movement somewhat (the trade did contain real information) but stayed grounded around the spread rather than jumping to 30%. Here's why:
- Manifold's 40% weight provided a stabilizing second opinion that didn't react to the thin Kalshi trade
- Midpoint component (12%) used the 14-16% spread, reporting ~15% instead of 30%
- Liquidity-weighted component (6%) also used spread-based pricing rather than the outlier trade
- Spike dampening capped the change to ±3 percentage points per 3-minute interval, preventing wild single-trade swings
The result: while Kalshi briefly showed Laura Fine at 30%, IL9Cast accurately reflected the true market state: modest upward movement constrained by the actual bid-ask reality. This is exactly the kind of thin-market artifact our aggregation approach is designed to filter out.
The takeaway: Single prediction markets can be misleading when liquidity is low or a single large trade occurs. By combining multiple price signals and applying dampening, IL9Cast gives you a clearer, more stable view of the race.
Spread-Based Weight Throttle (Feb 2026)
When a Kalshi last trade price falls outside the current bid-ask spread, its weight in the aggregate is automatically reduced. This prevents stale or outlier trades from disproportionately influencing the forecast.
- Normal weights (last price within spread): 40% Manifold, 42% Kalshi Last, 12% Midpoint, 6% Liquidity-Weighted
- Throttled weights (last price outside spread): 40% Manifold, 20% Kalshi Last, 28% Midpoint, 12% Liquidity-Weighted
- Why not zero: Even an outlier trade contains some price signal (a buyer was willing to pay that price), so we reduce its influence rather than ignoring it entirely
- Thin markets unaffected: The throttle only applies to a two-sided book. When
yes_bid = 0 (no buy-side orders), Kalshi is set aside for that candidate entirely, as described in the thin-market fallback above
Using the Laura Fine example above: with last_price at 30% but the spread at 14–16%, the throttle would shift weight toward the spread-based components (midpoint ~15%, liquidity-weighted ~15%), keeping the aggregate grounded near market consensus instead of being pulled toward the 30% outlier.
Soft Normalization (30% Strength)
Final probabilities are lightly normalized to prevent excessive drift while preserving raw market values:
- Candidates with no active Kalshi market (no market at all, or a one-sided or locked book; 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
Chart Smoothing
To produce clean, readable trend lines, the chart pipeline applies multiple smoothing layers:
- Spike dampening: Per-candidate probability changes are capped at ±3 percentage points per 3-minute collection interval, preventing sudden jumps from thin-market trades or API glitches
- Exponential Moving Average (EMA): Chart data is smoothed server-side with an EMA (alpha = 0.15). Each displayed point is 15% new value + 85% previous smoothed value
- RDP simplification: The Ramer-Douglas-Peucker algorithm reduces thousands of raw data points to ~200-400 visually significant points, removing redundant noise
- Monotone cubic interpolation: The frontend renders curves using monotone splines that prevent overshoot between data points
Update Frequency
Market data is collected every 3 minutes, around the clock, including election day. Every snapshot is saved, and the chart pipeline described under Infrastructure below smooths and thins the series for display.
Results Heatmap (1st & 2nd Place Probabilities)
The Markets page includes a results heatmap showing the derived probability of every possible 1st-place and 2nd-place finish combination. Since prediction markets only provide marginal win probabilities (P(candidate wins)), we derive the joint probabilities using conditional probability:
Joint probability formula:
P(A finishes 1st, B finishes 2nd) = P(A wins) × P(B wins) / (Σ P − P(A wins))
Intuition: If candidate A wins (with probability P(A)), the remaining candidates compete for 2nd place. We assume their relative win probabilities determine who finishes 2nd. So candidate B's chance of finishing 2nd, given A won, equals B's probability renormalized among all non-A candidates: P(B) / (Σ P − P(A)), where Σ P is the sum of every candidate's win probability (1 when the odds add to exactly 100%; the soft normalization can leave them slightly above). Multiplying by P(A) gives the joint probability of A finishing 1st and B finishing 2nd.
Key assumption: This treats candidates as independent. It assumes that A winning doesn't change the relative ordering of the remaining candidates. In practice, ideologically similar candidates may cannibalize each other's support, which would make some 2nd-place finishes more or less likely than this model predicts. The heatmap is a first-order approximation, not a full correlated model.
Reading the heatmap: Rows represent the 1st-place finisher, columns represent the 2nd-place finisher. The diagonal is empty (a candidate can't finish both 1st and 2nd). Stronger teal cells indicate higher probability pairs. The most likely 1st/2nd combination is highlighted at the top.