Methodology
How we transform prediction market data into thematic intelligence.
What we measure
Safehouse aggregates active prediction markets into thematic indexes. Each index tracks a weighted basket of 15–75 binary prediction markets related to a theme — AI, crypto, geopolitics, US politics, monetary policy, climate/energy, and global economics.
Every price represents a probability backed by real money at risk. When someone buys a contract at 62¢, they're risking real capital on their belief that the probability is higher than 62%. This financial skin in the game filters out noise, punishes overconfidence, and forces participants to actually be right — not just loud.
When uncorrelated money-backed probabilities move together, it's a stronger signal than correlated ones.
Unlike a stock index where components share an economic driver, prediction markets in a theme are often uncorrelated. It takes a real thematic event to make them move together.
How markets are selected
We ingest every active market from Polymarket and Kalshi — typically 40,000–50,000 at any time. Roughly 95% are irrelevant. Our three-tier relevance system filters them:
Tier 1
Keyword Scan
Checks titles against theme-specific keyword sets
Instant
Tier 2
Embedding Similarity
NLP compares ambiguous markets against theme anchors
NLP
Tier 3
LLM Classification
Final call on the ~5% the first two tiers can't decide
Accurate
This produces 3,000–5,000 viable markets. Each is scored for quality (price informativeness, liquidity, trading activity, resolution horizon, description quality) and must pass eligibility gates to enter an index.
How indexes are computed
Each index is a weighted composite of its constituent markets' prices, scaled to 0–100. The weight formula considers liquidity, recency, relevance, and quality.
- •Liquidity — higher-volume markets carry more weight
- •Recency — markets resolving sooner are weighted higher (90-day half-life)
- •Relevance — markets with stronger thematic relevance score higher
- •Quality — markets with better data quality carry more weight
Weights are capped at 20% per individual market and 15% per market series to prevent any single question from dominating.
Weight formula
raw_weight = ( sqrt(volume + open_interest) × exp(-0.693 × days_to_res / 90) × relevance_score × max(quality_score, 0.1) ) # Normalize, cap 20% per market, # 15% per series, re-normalize
Composite value: sum(price_i × weight_i) × 100 → 0–100 scale.
Signals & metrics
Instead of just a number, we compute named signal states that tell you the character of current activity:
| Signal | What it means |
|---|---|
| Consensus Shift | Markets across the theme are moving in the same direction |
| Divergence | Markets disagree — some up, some down |
| Turbulence | Lots of movement but no clear direction |
| Sharp Move | Big directional change in the index |
| Quiet | Low activity, stable prices |
| Active | Normal market activity |
Momentum
How much the index moved in the last 24h or 7d. The headline number.
+3.2 ptsBreadth
Fraction of constituent markets moving in the same direction.
0.82Dispersion
How spread out market prices are. High = diverse opinions.
18.4Volatility
How much the index fluctuates hour to hour.
2.1 pts/dayNarrative: For each signal state change, we identify the top constituent markets driving the move. “Markets are aligning. Ukraine ceasefire probability (+12%) and Iran sanctions extension (+8%) are pushing the index up.” No LLM hallucination — computed directly from price changes and weights.
Technical details
Five weighted components, each normalized to 0.0–1.0:
quality_score = ( 0.25 × price_info + # 1 - |2p - 1|^1.5 0.30 × liquidity + # min(1, log10(volume + OI) / 7) 0.20 × activity + # exp(-0.058 × hours_since_trade) 0.15 × horizon + # <7d: 0.3, <30d: 0.7, <180d: 1.0, <365d: 0.7, else: 0.4 0.10 × description # <100ch: 0.3, <300ch: 0.6, <500ch: 0.8, else: 1.0 )
raw_weight = ( sqrt(volume + open_interest) × # Liquidity exp(-0.693 × days_to_res / 90) × # Recency (90d halflife) relevance_score × # Classification confidence max(quality_score, 0.1) # Quality (floor 0.1) ) # Normalize, cap 20% per market, 15% per series, re-normalize
Composite value: sum(price_i × weight_i) × 100 → 0–100 scale.
| State | Condition |
|---|---|
| consensus_shift | breadth ≥ 0.75 AND |momentum_24h| ≥ 3 |
| divergence | breadth < 0.50 AND dispersion ≥ 20 |
| turbulence | volatility ≥ 3 AND |momentum_24h| < 2 |
| quiet | volatility < 1 AND |momentum_24h| < 1.5 AND dispersion < 10 |
| sharp_move | |momentum_24h| ≥ 5 |
| active | default (none of above) |
| Gate | Threshold |
|---|---|
| Quality score | ≥ 0.35 |
| Liquidity | volume + OI ≥ $500 |
| Price range | 0.05 ≤ price ≤ 0.95 |
| Last trade | within 14 days |
| Dead flag | FALSE |
| Hard cap | 75 constituents |
We believe transparency builds trust. If you spot an issue with our methodology, let us know.
Data sources
All data comes from two platforms. We use both to ensure cross-platform coverage and enable deduplication.
Polymarket
The largest decentralized prediction market by volume. Blockchain-based, global participation, deep liquidity on political and macro markets.
polymarket.com →Kalshi
The first CFTC-regulated US prediction market exchange. Event contracts on economics, politics, weather, and more with institutional-grade infrastructure.
kalshi.com →When the same question exists on both platforms, we merge them using embedding similarity and structural verification.
Custom themes
Beyond the 7 curated themes, Pro and Enterprise users can create custom indexes on any topic. Self-serve creation uses keyword matching and embedding similarity to find relevant markets instantly. Enterprise white-glove creation uses an LLM to generate comprehensive theme configurations from natural language descriptions.
Custom themes receive the same treatment as curated: quality scoring, eligibility gates, diversity caps, signal states, narratives, and alerts.
Create your own →See the methodology in action
7 curated indexes. Real-time signals. Full transparency. No credit card required.
