How it works

Sardine tells you, for a live Kalshi crypto contract, how often contracts in this exact situation (this far from the target, which Kalshi calls the strike, this much time left) have actually settled Up (Yes, in Kalshi's words), and whether Kalshi's price is above or below that once the fee is counted.

Everything on this page is an input to that sentence. The board is the output.

What does the purple number mean?

The purple box in the figure — History: 66% (n = 2,004) — is the answer Sardine gives. It reads: of the past windows that sat this far from the strike with this long left, this share settled YES, and this many windows were counted. It is a count of what happened, not a forecast of what will. The rest of this section is what the figure does not say, and the definitions behind it.

One thing the figure leaves out: since September we also record every second of every live contract — both sides of the book, depth, last trade. Kalshi's public API publishes only one-minute history, so a second that passes un-recorded cannot be recovered from them afterwards.

What doesn't Sardine claim?

Most tools in this category promise profit. Here is exactly where this one stands, so you can decide what it's worth.

  • We are not better than the price. Kalshi's quote predicts settlement slightly better than our count does. We measured it and say so.
  • A gap is not an edge. On most boards, contracts priced away from their history have not gone on to pay. Each board says which it is.
  • The fee usually decides it. At 50¢ Kalshi's fee is 1.75 points while the market is typically within 1 point of correct — so coin-flip contracts are the hardest part of the board for anyone.
  • We refuse to answer outside the range we have data for, rather than extrapolating a confident-looking number.

The figure: how the purple number is built

Everything above in one picture, for readers who want the mechanics. It is wide; on a phone it scrolls sideways, or download it as a PDF.

Figure 1. How Sardine computes the purple number, and why one BTC history serves two venues. Black is always the venue's price. Purple is always Sardine's count of what happened before. Nothing purple depends on which venue the contract trades on. A. THE HISTORY · built from BTC alone, continuously since May 2026 1 BTC spot, 1 Hz Recorded once per second by the Sardine recorder, around the clock. It never reads a market price. 10,000+ windows so far, +96 per day. 2 Settled 15-minute windows Each window carries: start price S₀, spot Sₜ at every second, time left τ, and one outcome, Up or Down, taken from the settlement of that window. 3 Distance in vol units z = ln(Sₜ / S₀) ÷ ( σ₁ₕ · k(τ) ) σ₁ₕ = trailing 1-hour realized vol of BTC k(τ) = horizon scale for τ minutes left Dimensionless: same z at $30k or $150k. 4 Base-rate table Bucket every second by (z, τ), count how often it finished Up. z ∈ [1.0, 1.5), τ ≈ 7 min → P(Up) = 66%, n = 2,004 windows Why vol units and not dollars $50 ahead with 5 minutes left is a large lead on a quiet Sunday and a coin flip minutes after a Fed statement. Filing both under “$50” averages two different situations and misstates both. Dividing by the last hour’s realized movement puts each in a row with windows that felt the same to a trader at the time. That is the regime handling; no regimes are labelled by hand. Tested against 30-day options- implied vol (DVOL): realized vol gave a 6.6-pt split-half error, implied 8.6. Realized is used. QUIET SUNDAY BTC moving ≈ $20 per window $50 ahead → z ≈ 2.5 AFTER A FED PRINT BTC moving ≈ $300 per window $50 ahead → z ≈ 0.2 The table, schematically P(Up) by z bucket × time left. Illustrative values; live table on /record. τ \ z −1.5 −0.5 0 +0.5 +1.5 12 min 14% 36% 50% 64% 86% 7 min 8% 31% 50% 66% 92% 2 min 2% 20% 50% 80% 98% Highlighted cell: the live lookup in panel B below (z ≈ +0.5 to +1.5, ≈ 7 min left). Cells with n < 60 windows are never shown; the site prints a dash instead. B. LIVE, RIGHT NOW · the venue supplies only its price and its fee Kalshi 15 min live today Kalshi’s price e.g. Up at 53¢ · from its API This is the only venue-specific input Live BTC and this window S₀, Sₜ, τ from Sardine’s own recorder. Compute z exactly as in panel A. look up (z, τ) 53¢ + 1.8¢ fee = 54.8¢ Fee is the venue’s own formula, on its own line, so the comparison is what you would actually pay. History: 66% (n = 2,004) Same cell, same count, regardless of venue. Grey words until this venue’s gate passes. 11¢ under Sardine after fees → Open on Kalshi Settles on a 60-second average of the CF Benchmarks BTC index. Gate: split-half error ≤ 6 pts on ≥ 720 windows, two weeks running, before any coloured word. COMING SOON recorder live since 22 Sep 2026 · the tab ships after its own gate passes Polymarket 15 min not yet on the site Polymarket’s price e.g. Up at 51¢ · from its public API This is the only venue-specific input Live BTC and this window S₀, Sₜ, τ from Sardine’s own recorder. Compute z exactly as in panel A. look up (z, τ) 51¢ + 0.9¢ fee = 51.9¢ Fee is the venue’s own formula, on its own line, so the comparison is what you would actually pay. History: 66% (n = 2,004) Same cell, same count, regardless of venue. Grey words until this venue’s gate passes. Gap after fees → Open on Polymarket Settles on a single Chainlink print at the window boundary; ties resolve Up. Its table is counted from its own settlements by a Polymarket recorder, then held to the same gate. Note on transferability. Both venues price the same proposition (BTC above its window-open price at the close), so panel A applies to both. They differ in the reference index and the endpoint method: Kalshi averages the final minute, Polymarket reads one print. That difference is concentrated at the boundary and therefore in the 75–90¢ band. A reconstruction under the Polymarket rule moved that band by −12 pts, of which about two thirds is proxy error from a third index. Sardine therefore counts Polymarket from Polymarket’s own settlements before showing a number. sardine.info · every window and every published number is downloadable on /record (CC BY 4.0) · not a forecast: the market is usually right; this is what happened before.

scroll →

Download as PDF See the record — how often it has been right

Where are the full tables?

One row per distance bucket, one column per time-to-expiry bucket. The cell is how often those windows settled YES, and the count behind it. This is the one page where sigma, Wilson intervals, split-half and calibration error belong.

Download CSV

Columns are checkpoints, not ranges: the reading taken when that many minutes were left, matched to the nearest quote within a minute. "2 min left" is the last checkpoint Sardine answers at. Inside the final two minutes it has no number, which is why the replay on the Live page shades that zone and says Sardine stays quiet there.

Distance from target (sigma)
How far spot sat from the strike at that moment, divided by the volatility estimate for the remaining time. It is what makes a 0.1% move with 2 minutes left comparable to a 0.4% move with 15.
Wilson interval
The confidence interval on a settlement frequency. Used rather than the textbook normal interval because it behaves near 0% and 100%, which is exactly where these cells live.
Two window counts
The tables are built from the Kalshi windows that settled in the last 60 days (the span is printed under each table). Sixty days, not the whole file, since 2026-10-26: the market's behaviour in the last two minutes of a window changed in August 2026, and a table averaged over May-to-October described neither period; the window is re-applied at every rebuild and the split-half gate re-run. The downloadable history files hold only the windows for which Sardine also recorded its own price path, which starts later, so their window count is smaller. Each page quotes the count of the file it is built from and says which.
Strike-rows
One row per strike per window. Larger than the window count, because a single window has many strikes. The headline sample size uses independent windows, not strike-rows.
Calibration error
Worst out-of-sample gap between what the table said and what happened. It is also the threshold the verdict uses: a price has to be further from history than this before we call it priced above or below.
Split-half
The table is rebuilt on each calendar half of the data separately. If the two halves disagree in sign, the result is treated as unstable.

How often has it been right?

Accuracy in the table below is the largest miss in any History bucket holding 200 or more settled windows, re-measured against the table we are serving every half hour. You can check it yourself: open the published CSV, read the miss column, take the biggest number. It describes how well the published figure has matched over every window we hold, including the ones the table was built from — so it is a description, not a forecast test.

A market has one of three statuses, and the table below says which is which right now. Serving: its split-half calibration error is inside the 6-point limit we set before looking. Serving under review: the latest rebuild put it over the limit, so the counts stay up but the claim comes down — the error bar becomes the measured miss, nothing on it is called an edge, and the Live page says "under review" on the board. Held: too few priced windows to build a table at all, so nothing is shown. We downgrade the claim rather than withdraw the numbers, because a count you can check beats a blank.

About colour: Sardine's own number is always purple. Green and red words appear only on markets where gaps of that size have historically paid (the "Gaps sort returns" column). Everywhere else, including every market under review, the words are grey and describe the gap without claiming anything about what it pays.

What can I download?

Loading…

Everything above is derived from these files. They regenerate every half hour, so nothing on this page is computed somewhere you cannot check. CC BY 4.0.

Loading…

What does Sardine collect about me?

No accounts, no cookies, no advertising, nothing sold. One cookieless analytics script, named on the privacy page. What Sardine logs, in full — it is a short page and it is specific.

Gap alerts on X: @sardine_hunter