Summary
Nine things looked like edges. All nine were artifacts of how the data was measured, not features of the market. The interesting part is that they failed in a small number of repeating ways — six distinct failure modes account for all nine deaths, and most of them are invisible unless you go looking.
No candidate survived a correctly specified test. Several looked outstanding, with t-statistics above 5, monotonic gradients across twenty price buckets and billions of contracts of support, until the measurement was fixed.
The single most useful output is the checklist below. Every one of these nine died on it, and each item was learned by getting it wrong first.
The checklist
Run a candidate against these six before believing it. Any one of them can turn a +4¢ edge into a −2¢ loss without changing a single number in the result.
The nine
In the order they were tried. Each death informed the next test, which is why the later ones died faster.
Commodity favourite fade
commod_no_fav / commod_yes_fav — natgas, WTI 15-minute
The claimBuying NO on the favourite at a 10–20¢ yes-mid won 88–89% against roughly 86% breakeven.
Cause of deathDead across 3,587 paper trades, and still dead with fees removed entirely: +0.05¢ and −0.26¢ per contract. The confidence interval never cleared breakeven; the early sample was noise.
No real edgeBitcoin resting-order maker
btc_maker — KXBTC15M
The claimResting bids inside fair value won 71.6% of the time.
Cause of deathUnfilled orders were being scored as wins. Filtering to orders that actually filled: 55.7% against a 61.2% breakeven. Unfilled orders won 82.3%, filled ones 55.7% — a textbook adverse-selection signature. You get filled precisely when you are wrong.
Simulated fillsAdverse selectionNFL parlay-combo longshots
KXMVE* — auto-generated multi-leg combos
The claimUp to +8.77¢ per contract at 31¢, monotonic across twenty consecutive price buckets. The cleanest-looking gradient of the whole search.
Cause of deathMedian volume zero. Average spread 38–40¢. And the bid/ask in the markets snapshot is captured after settlement, so it is not a tradable quote at all — the same field showed a nonsensical 100¢ median spread on KXNFLGAME, one of the most liquid series on the exchange.
No liquidityPost-settlement quotesAnytime-touchdown mispricing
KXNFLANYTD
The claimImplied 21.2% against an actual 31.9% — a +10.71pp gap over 1,184 liquid markets. Per bucket it looked even better: 43.6¢ markets resolving YES 91.2% of the time.
Cause of deathA market priced at 43.6¢ does not resolve YES 91% of
the time. Nothing is that wrong. The entry was anchored 60 minutes before
close_time, which on sports markets is a backstop days after the game — so
it was reading the settlement collapse, not a trade. Re-anchored on each market's own final
print, the edge inverted to −8.05¢.
Favourite–longshot bias, taken
Pooled, all liquid series ex-KXMVE
The claimA clean monotonic bias: longshots overpriced, favourites fair. Net of fees, selling the 15–30¢ buckets paid +4.1 to +4.4¢ per contract, positive in every year from 2022 to 2025, spread across twenty independent series with real depth.
Cause of deathRepriced at a level a taker actually paid rather than the last print: average cost 72.38¢ against a 72.09% win rate. Calibrated to within a third of a cent. Net −1.58¢, negative in all five years, t = −5.76 clustered by day. The entire "mispricing" was the spread.
Non-executable priceEvent-basket arbitrage
14,576 mutually-exclusive events, 80,604 legs
The claimExactly one leg of a mutually-exclusive event resolves YES, so the legs must sum to 100¢. 8,871 events summed above 102¢. Buying NO on every leg pays regardless of outcome — no prediction required.
Cause of deathThe overround is monotonic in staleness. Legs priced within 15 minutes of each other: −6.83¢ per basket. Within an hour: −5.31¢. Only when legs are quoted more than six hours apart does it turn positive (+0.34¢). Priced simultaneously — the only way a basket is tradable — Kalshi's books are coherent and then some.
Non-simultaneous pricesThe maker side of the book
Temperature family — KXHIGHCHI, KXHIGHNY, KXHIGHLAX, KXHIGHAUS
The claimThe strongest-looking result of the search. Across 46.4M prints and 12.2B contracts, takers lose −0.941¢ gross and the maker opposite them collects it — replicated out of sample on 2026 data at −1.026¢. The temperature series pay a maker-free fee type, and all four came out positive: KXHIGHCHI +0.82¢ at t = 4.10, KXHIGHNY +1.26¢ at t = 5.81, each over ~400 trading days. It even correctly flagged KXATPMATCH at −0.64¢ as a series where making loses.
Cause of deathThe price buckets pooled both taker sides, so maker sold YES at 15¢ and maker bought YES at 85¢ — opposite positions — landed in the same cell. Split properly, the exact trade this implied (resting a sell of YES at 10–30¢) is worth +0.03¢, t = 0.03, across 452 million contracts. Dead zero.
Pooled opposite sidesSelling extreme favourites
90–99¢ sell-YES; KXATPMATCH, KXWTAMATCH
The claimResting an offer to sell YES at 99¢ — buying NO at a penny — paid +3.62¢ per contract at t = 8.63, with a clean monotonic gradient from 95¢ up. In tennis it looked extraordinary: KXWTAMATCH +16.71¢, KXATPMATCH +15.27¢, with a real mechanism — tennis has retirements, so 99¢ favourites lose more often than a penny implies.
Cause of deathNot one year is individually significant: 2022 t = 0.94, 2023 t = 0.15, 2024 negative, 2025 t = 1.71. The pooled t = 8.63 is an artifact of stacking five years in which nothing holds. All the tennis data is 2025 — one season, so no out-of-sample test is possible at all. And the implied claim (16–18% of 98–99¢ favourites losing) is too large to be real in a liquid market.
Single seasonPooled yearsWeather latency — the settled-outcome trade
KXHIGHCHI, KXHIGHNY, KXHIGHLAX, KXHIGHAUS, KXHIGHMIA
The claimThe best idea of the search, and the only one that was not a statistical pattern. The daily high is monotonic: once Midway prints 54°, the "52° to 53°" bucket is mathematically dead. Not likely — settled. Buy the decided side while the book is still slow. Validation was strong: 4,972 markets proven early with 0.14% contradictions, and the intraday observed max never once exceeded the official daily max across 425 days. Excluding New York it returned +10.6¢ per contract with losses included, t = 5.69, 38 winning markets to 1.
Cause of deathThe bad proofs are adversely selected by volume. Where there is enough liquidity to deploy capital, the proof fails a third of the time.
| Volume quintile | Contracts | Markets | Bad proofs |
|---|---|---|---|
| 1–3 (quiet) | 1–1,201 | 42 | 0.0% |
| 4 | 1,258–4,895 | 13 | 23.1% |
| 5 (liquid) | 5,346–78,636 | 13 | 30.8% |
WhyThe thermometer disagrees with Kalshi's settlement about 8.5% of the time, by one or two degrees, and the disagreements cluster in boundary cases — which are exactly the markets that attract late volume. Restricted to markets with 1,000+ contracts the edge is +2.29¢ at t = 0.45. A safety buffer makes it worse, because a large buffer selects for days when the thermometer wildly disagrees — the corrupted ones.
The rescue attempt, and why it failedSome bad proofs were not boundary disputes but bad readings: New York on 29 Dec 2024 reported 61°F then 68°F — near record warmth for December — and the station then went dark for fourteen hours. That shape is detectable without knowing the answer, by requiring any reading to be corroborated by another observation within 90 minutes.
| Corroboration tolerance | Markets | Bad proofs | t (tradable size) |
|---|---|---|---|
| none | 68 | 7 | 0.45 |
| ±8°F | 68 | 7 | 0.45 |
| ±5°F | 68 | 7 | 0.45 |
| ±3°F | 66 | 5 | 0.87 |
VerdictThe filter caught two of the seven. The remaining five are ordinary, well-corroborated readings that simply differ from Kalshi's settled value by a degree or two at a boundary — nothing in the data marks them as suspect, because nothing about them is. This is the hard limit: the thermometer is not the settlement. Any independent measurement will disagree at boundaries, and boundaries are where the volume is.
Adverse selectionMeasurement ≠ settlementWhat is actually true
Three results survived every test. None of them is a strategy, but all three are worth knowing.
Takers lose about a cent a contract, exchange-wide. −0.941¢ gross in the 2021–2025 archive and −1.026¢ out of sample in 2026, across billions of contracts and 507 series. Real, replicated, and not harvestable — it does not survive decomposition into any side, band or series you could actually place an order on.
A maker buying YES loses reliably. Across the 10–70¢ range over four years, t = −3 to −6, deepest at 40¢ (−3.49¢, t = −6.00). This is a prohibition rather than an opportunity: if a resting strategy is ever run, only ever rest on the sell-YES side.
The fee model was wrong and is now right. Taker fees are
ceil(0.07 × mult × C × P × (1−P)), maker fees are 25% of
that and apply only on the quadratic_with_maker_fees type. The old model
double-charged MLB and invented maker fees on crypto, commodity and tennis series where Kalshi
charges none. Unknown series now default to the expensive assumption.
What the project produced
- The archive. 36GB covering 7.7M markets and ~72M trades back to July 2021.
- The screening loop. duckdb over Parquet, taking 7.7M markets to a specific falsifiable claim in minutes. It found all nine of these — and then killed all nine.
- The test harness. A live maker strategy with 193 passing tests, hard caps, a crossing guard proven over every bid/ask pair from 0 to 100, and post-fill drift measurement.
- Weather validation. Five stations of intraday and official daily observations joined to Kalshi settlements, with the monotonic proof verified at 0.14% error.
A note on measuring the right thing
One methodological point worth carrying forward.
A small live test could have been judged on profit. That would have been useless: an edge of about one cent per contract against a roughly 40¢ outcome swing needs on the order of 9,500 contracts to detect — about a year at a dollar an order. Read as P&L, the result would have been pure noise, and noise is convincing in either direction.
The right target was post-fill drift: if you are filled at 20¢ and the market is at 18¢ five minutes later, you were picked off. Drift has a standard deviation near 4¢ rather than 40¢, so it exposes adverse selection in roughly 64 fills instead of 9,500 contracts. It takes two weeks instead of a year, and it targets the actual unknown.
When a live test is small, pick the lowest-variance thing that answers the question. It is almost never the P&L.