verex

Market Groups & Probability-Sum Semantics

Goal: make the relationship between the markets inside one event a first-class, declared field — so Verex knows when outcome probabilities must sum to 100%, when they may not, and never renders one as the other.

Companion to negative-risk-markets.md. Neg-risk covers one group type (mutually exclusive). This doc covers the taxonomy around it — and the types where “sum = 100%” is simply the wrong question.

Why — the observed puzzle

Kalshi, “Will the Clarity Act become law?” — three markets under one event:

Kalshi: three "before date" markets whose YES prices sum to 137%

Market YES
Before Jul 1, 2027 41¢
Before Oct 1, 2027 46¢
Before Jan 1, 2028 50¢
Sum 137%

This is not mispricing and not a display bug. The three markets are nested: “before Jul 2027” ⊂ “before Oct 2027” ⊂ “before Jan 2028”. They can all be YES at once (one early passage resolves all three), so there is nothing forcing them to sum to anything. The invariant that does apply here is monotonicity — 41 ≤ 46 ≤ 50 — and it holds.

The mistake to design against: assuming “outcomes under one event” ⇒ “probabilities partition 100%”. That only holds for one of the group types below.

Group taxonomy

Group type Example Invariant Σ YES Neg-risk?
Binary — a single market “Will X happen?” YES + NO = 1 100% by construction (CTF split/merge) n/a
Exclusive + exhaustive (categorical) World Cup winner — 48 teams + “Other” exactly one YES resolves = 100% (arbitrage-enforced) ✅ yes
Exclusive, non-exhaustive a candidate shortlist with no “Other” at most one YES resolves ≤ 100% partial
Directional / nested (Kalshi’s term) the screenshot; TSA “1M+ / 2M+ / 3M+ check-ins” monotone: A ⊂ B ⇒ P(A) ≤ P(B) unbounded (137% above) ❌ no
Independent / multi-winner “Which phrases will the Fed chair say?” none = expected number of winners ❌ no

Only row 2 makes “normalize to 100%” a meaningful operation. Applying it to the screenshot would print 41/137 = 30% for a market the book says is 41% — a fabricated number.

What Kalshi actually does

So what number is “real”?

The displayed % is a last-trade or mid price on one side of a spread, not a normalized probability. For an exclusive + exhaustive group only a band is enforceable:

Σ best_bid_i  ≤  1  ≤  Σ best_ask_i

Cross either bound and there is a riskless trade (below). The true probability vector lives inside that band; picking a single point inside it is a modeling choice, not a fact. Rules Verex should adopt:

  1. Never normalize outside an exclusive group. Show raw per-market prices.
  2. When normalizing is valid, label it (“normalized”) and keep the raw price reachable.
  3. Compute the sum as a diagnosticΣ ask − 1 is the group’s over-round, a liquidity quality signal worth surfacing to the MM agent, not to the casual trader.

Why exclusive groups actually sum to 100% on Verex

The neg-risk stack (negative-risk-markets.md) makes it an arbitrage fact, not a convention. Converting NO shares over a set S of k outcomes yields 1 YES for every outcome not in S, plus (k−1) USDC. Both directions close:

Directional groups have no such conversion — nested outcomes aren’t a partition, so there is no complete set to mint or redeem. Their invariant (monotonicity) can only be enforced off-chain, in the MM agent and in validation.

Design for Verex

Open questions

Features

Resources