Skip to main content
The prediction_markets schema is a cross-venue unified dataset that merges Polymarket and Kalshi onto one schema. Use it when you want to write a single query that returns results across both venues without per-venue UNIONs.
Maintained by: Dune · Refresh: ~1 hour · Venues: Polymarket (Polygon) + Kalshi

Available Tables

prediction_markets.markets

Unified market dimension across Polymarket and Kalshi: names, category, status, resolution and parlay legs

prediction_markets.trades

One row per taker fill across both venues with normalized P(Yes) pricing, side traded and taker action

prediction_markets.ohlcv_hourly

One Yes-side candle per market-hour across both venues, prices in [0, 1] probability space

prediction_markets.open_interest_hourly

Hourly open interest and traded volume per single market across both venues

Identifier conventions

Every row carries a venue column ('polymarket' or 'kalshi'). Identifiers are venue-scoped: market_id is a Polymarket condition_id (or combo condition ID for Polymarket Combos) when venue = 'polymarket' and a Kalshi ticker when venue = 'kalshi'. Always join on (venue, market_id). event_id and series_id follow the same rule; a level the venue does not have (Polymarket series, Kalshi outcome tokens) is NULL rather than a synthesized ID.

Notes

  • markets is the dimension; trades, ohlcv_hourly and open_interest_hourly are facts. trades and ohlcv_hourly carry no market names or attributes beyond category, and open_interest_hourly carries none at all. Join markets on (venue, market_id) for labels, category, status and resolution.
  • Every market is presented from its Yes side. Yes is the venue’s positional side 0 (outcome_index = 0 on Polymarket), never a label heuristic. For team-vs-team markets check yes_outcome_name to see which side is Yes.
  • price in trades and OHLCV is always P(Yes) in [0, 1]. In trades, outcome_side says which side was traded, taker_side whether the taker bought or sold it, and taker_fill_price is the price of that contract, so taker_fill_price × num_contracts = amount_usd.
  • category is a unified enum (sports, crypto, politics, finance, technology, culture, weather, world, health, other), plus mixed for parlays whose legs span several categories. The raw upstream classification is preserved in markets.category_native.
  • Resolution uses one vocabulary everywhere: yes, no, void (refund) and scalar (fractional payout) in markets.resolved_outcome and ohlcv_hourly.market_outcome, which also reads unresolved before settlement.
  • Parlays are included from both venues: Kalshi parlays and Polymarket Combos (multi-leg parlays), flagged with is_parlay = TRUE. For like-for-like single-market comparisons, filter is_parlay = FALSE.