Cryptolean
// Methodology · latency

Settlement latency — how long a venue takes to pay out after the question is answered.

Current definition latency-v1. Charts stamped with it were computed by src/resolution/latency.py, and every value plotted for a past date could have been computed on that date.

Definition and failure modes

compute(df, **params) -> pd.Series   # hours, indexed venue:market_id

Slow settlement is the quiet failure mode of a prediction market. It never shows up in a dispute count: nobody contests the outcome, the money simply sits. Zone 11 measures dispute frequency everywhere else; this is the other half, and it needs no credential at all — both venues ship the timestamps for free.

WHAT closed != settled ACTUALLY COSTS YOU

Kalshi's expiration_time is the SCHEDULED expiration and settlement_ts is when the contract actually settled. Anchoring on the wrong one does not produce a slightly-off number, it produces a nonsense one. Measured on 13,237 finalized Kalshi markets:

anchor = close_time                median   +2.53h    0 negative
anchor = expected_expiration_time  median   +0.03h    5,599 negative
anchor = expiration_time           median  -167.97h   13,089 negative

The third row says Kalshi settles a week before its contracts expire. It does not. schema.py carries settlement_time so this stays fixed in one place.

WHY THE TWO VENUES ARE NOT ONE NUMBER

The anchors mean different things and the difference is not cosmetic:

Kalshi      close_time is when TRADING STOPS. It is scheduled, and a
            contract cannot settle before it.
Polymarket  endDate is a DEADLINE — "by June 30". A market resolves the
            moment the event happens, which is often long before it.

28.8% of Polymarket markets (22,897 of 79,539) close BEFORE their stated end date, a median of 162 hours early. That is the venue working correctly, not negative latency. Pooling those into a mean drags Polymarket's average to −142 hours and would let us publish "Polymarket settles six days before the deadline" as if it were an operational fact about payout speed.

So compute reports signed hours and nothing else, and summary() splits the two populations rather than averaging across them:

early       resolved before its stated deadline (Polymarket, mostly)
settled     resolved at or after the anchor — the comparable population
censored    trading stopped, never settled. Excluded from every quantile,
            counted in `censored_n`, because dropping it silently is how a
            venue's slowest contracts disappear from its latency figure.

On the comparable population the venues are nearly identical at the median — Kalshi 2.53h, Polymarket 2.71h — and diverge hard in the tail: p99 of 85h against 679h. The tail is the finding. A median is a claim about a normal day; the 99th percentile is a claim about the day it matters.

CENSORING, READ BEFORE QUOTING IT

1,886 Kalshi markets are closed with no settlement timestamp — 12.5% of everything past trading close, median age 188 days. That reads like a settlement backlog and it is not: 1,859 of the 1,886 have zero volume. They are untraded strike ladders (500 hourly EURUSD, 500 USDJPY, 400 index strikes) that nobody has any reason to settle. Only 27 censored markets carry volume at all, and their median age is 36 days. Report the count, then report what it is.

Version history

Newest first. Each entry says what changed and whether values that had already been published moved with it, followed by the sentence from the module that decided the verdict.

  1. latency-v12026-08-05InitialCurrent

    close_time -> settlement_time, signed, three populations, censoring counted not dropped.

    The first version of this metric. There is no earlier definition to restate.

Charts drawn with it

None on the site today. The definition is versioned and exported, and no chart currently carries its stamp — either a chart is missing from the export or the module is no longer drawn. The catalogue reports the gap rather than hiding the metric, because a definition nobody can see the output of is exactly the thing a reader should be told about.

Current version
latency-v1
Versions on record
1
First dated
2026-08-05
Restatement policy
Never moved
Never restated. Every bump on record added output without redefining what was already there.
Charts
0
Source
src/resolution/latency.py
Public functions
by_size, censored, compute, curve, key, population, settled, summary, tail, tail_context
Machine-readable
catalog.json · llms.txt