We spent two weeks testing a spot-lag trading strategy in Kalshi’s 15-minute crypto prediction markets: when the underlying price has moved far enough to make one outcome likely, can we buy that outcome before the order book catches up?
We built a prototype, ran a paper strategy, traded live, attempted three rounds of calibration, and replayed recorded markets. The most revealing result came from an event study. By the time a large move arrived through our settlement-index feed, roughly 90% of the book’s measured adjustment had already happened.
We had set out to trade stale quotes. The evidence suggested that our signal was stale instead.
This is a postmortem of that discontinued experiment. The figures use the available five-day replay and approximately ten-hour local event-study sample. They do not represent the longer recording period still awaiting analysis.
The question we were trying to answer
A high probability of winning is not enough. A contract that pays $1 and costs 99 cents can win almost every time and still lose money after an occasional failure and trading fees. Our question was whether the price available to us was low enough relative to the probability of settlement—and whether that price would survive until an order arrived.
We chose to model the settlement index itself. That seemed a natural starting point: it was the variable that determined the payout, and Kalshi exposed it alongside the running final-minute average. It also made the hypothesis unusually easy to test. We could record the index and the book, align their clocks, and examine which moved first.
The experiment covered BTC, ETH, SOL, XRP, DOGE, BNB, HYPE, ZEC, and NEAR. For the contracts we studied, settlement compared the final minute’s average index value with the average before the market opened. This differs from comparing two instantaneous spot prices. Kalshi describes that distinction in its crypto settlement guide.
A deliberately simple model
Our baseline assumed zero-drift Brownian price changes. We estimated volatility from the most recent 180 index ticks, requiring at least 25 observations spanning 20 seconds. Log-return volatility was converted into price units before estimating the distribution of the settlement average.
Averaging matters. With at least 60 seconds remaining, the variance time was the time until the averaging window began, plus the variance contribution of 60 equally weighted future observations. Inside that window, we combined the already observed average with a forecast for the remaining observations.
Here is the current index, the target, its rounding precision, volatility in price units per square-root second, and seconds to expiry. Within the final minute, observations have average and remain. Before that minute, . is the standard normal cumulative distribution function.
The initial entry rules required a model probability of at least 80%, an ask no higher than 95 cents, a modeled edge after fees of at least 2.5 cents, and an index displacement of at least 5 basis points from the target. We rejected books older than two seconds and considered five windows: 450, 300, 180, 60, and 30 seconds before expiry. Each market could trigger once per window, with positions held to settlement.
There was no drift term, jump process, or model of changing volatility. We treated the probabilities as uncalibrated estimates from the beginning.
From prototype to live orders
| Date | Milestone |
|---|---|
| September 20 | Read-only prototype, authenticated market data, and first paper entries. |
| September 21 | First live IOC orders; execution checks and calibration work. |
| September 22 | Third calibration review; migration to a server and a Rust execution core. |
| September 26 | Five-day replay of the simple displacement rule. |
| October 4 | Last live order at 10:57 UTC; the strategy was discontinued. |
Live orders were immediate-or-cancel limit orders in whole contracts, initially with a $5 budget per order. We persisted order intent before sending a request. An acknowledgement was not treated as a fill: terminal order state and individual executions had to be reconciled.
The final measured submission-to-acknowledgement latency was 30 ms at the median and 142 ms at the 90th percentile. These are acknowledgement measurements, not direct observations of one-way arrival at the matching engine. The replay used a 30 ms assumed arrival delay; that assumption should be read separately from the measurement.
Earlier in the local run, the index tick used at decision time was already 303 ms old at the median and 978 ms old at the 95th percentile. Faster execution could reduce one part of the path. It could not make an old input new.
Four views of the same experiment
We examined the ledgers, a rule replay, an event study, and a population of per-second observations. These answer different questions and should not be treated as interchangeable samples.
| Dataset | Coverage | Purpose |
|---|---|---|
| Paper ledger | 1,022 settled entries; roughly 1½ days | What the simulator reported. |
| Live ledger | 1,029 submitted orders, September 21–October 4 | What execution and settlement actually returned. |
| Rule replay | 4,379 markets, September 22–26 | A five-day test with an arrival-delay assumption and top-of-book depth. |
| Event study | 4,780 events; 3,502 retained placebo observations | The timing of book changes around large index ticks. |
| Per-second population | 110,014 labeled observations; 287 markets; 40 settlement windows | Model behavior beyond the trades we selected. |
The population export contained 120,265 observations in total; only 110,014 had a settlement label. For that analysis, settlement was reconstructed from recorded index observations in the final minute, requiring at least 50 ticks. All 160 markets overlapping with available official outcomes agreed. That agreement validates the overlap, not every unobserved or missing-tick case.
For the event study, we selected index moves above coin-specific thresholds of roughly three one-second standard deviations, with a three-second separation between events in the same coin. We tracked the nearest eligible expiry’s Yes mid-price, signed in the direction of the index move. The baseline was the book state two seconds before the tick. Placebo observations came from small, non-event ticks with randomly assigned directions.
The channel we recorded delivered approximately one index tick per second. Kalshi documents this cadence for cfbenchmarks_value; this experiment did not evaluate every other data feed. We compared local receive times and, separately, Kalshi book timestamps with the upstream index timestamps.
The book moved first
Set time zero to the moment an index tick reached our recorder. One second earlier, the event-minus-placebo mid-price response had already completed 18% of its eventual three-second move. Half a second earlier, it had completed 61%. At receipt, it was approximately 90% complete.
The book moved before the signal
Directional price change · ¢
Seconds relative to index receipt
| Seconds | Events (¢) | Placebo (¢) |
|---|---|---|
| -2 | 0.000 | 0.000 |
| -1 | 0.831 | 0.006 |
| -0.5 | 2.830 | 0.011 |
| -0.25 | 3.829 | 0.010 |
| -0.1 | 4.115 | 0.010 |
| 0 | 4.166 | 0.004 |
| 0.05 | 4.233 | 0.005 |
| 0.1 | 4.253 | 0.002 |
| 0.2 | 4.303 | 0.013 |
| 0.3 | 4.337 | 0.024 |
| 0.5 | 4.375 | 0.032 |
| 0.75 | 4.408 | 0.035 |
| 1 | 4.459 | 0.013 |
| 1.5 | 4.513 | -0.004 |
| 2 | 4.497 | 0.006 |
| 3 | 4.554 | -0.053 |
This pattern was present across all nine assets. At receipt, the placebo-adjusted response ranged from roughly 85% complete for BNB to 100% for HYPE. Larger index moves did not reveal a substantially later response: the corresponding shares were 89%, 92%, and 92% across increasing event-size groups.
The mid-price is not an executable quote, so we also examined the side that would look stale: the Yes ask after an upward index move, or the Yes bid after a downward move. We measured the first move in that side’s price relative to the pre-event baseline.
| Clock | 10th percentile | Median | 90th percentile |
|---|---|---|---|
| Local receipt | −1.89 s | −1.01 s | −0.33 s |
| Upstream timestamps | −1.82 s | −0.95 s | −0.27 s |
When quotes repriced
Repriced share · % / excess · pp
Seconds relative to index receipt
| Seconds | Events (%) | Placebo (%) | Excess (pp) |
|---|---|---|---|
| -1 | 49 | 34 | 16 |
| -0.5 | 79 | 41 | 38 |
| -0.25 | 90 | 44 | 46 |
| 0 | 93 | 46 | 46 |
| 0.1 | 93 | 48 | 46 |
| 0.25 | 94 | 49 | 45 |
| 0.5 | 94 | 51 | 43 |
| 1 | 95 | 55 | 41 |
| 2 | 96 | 61 | 35 |
| 3 | 97 | 65 | 31 |
By receipt, 93% of event observations had repriced, compared with 46% of placebo observations. The excess was already near its maximum a quarter-second before receipt. Repricing was common even without an event; the comparison with placebo is what makes the timing informative.
The local wall clock was about 190 ms behind the exchange clock, so its absolute network-latency estimates were unreliable. Within-recorder timing and the upstream comparison nevertheless gave similar orderings. Agreement between them strengthens the observation, but does not remove every clock or timestamp-semantics assumption.
These results do not tell us exactly which feed each market maker used, or how much of the gap came from index aggregation, publication, transport, or trading-system speed. They do tell us that the book usually incorporated the move before it reached this strategy’s index input.
A 99% win rate left very little room
To separate the timing idea from our probability model, we replayed a simpler rule: when the index was at least 10 basis points beyond the target, buy the indicated side. We tested the first qualifying observation in the final minute and fixed snapshots 60 and 30 seconds before expiry. The replay assumed arrival after 30 ms, capped fills at the then-visible top-of-book quantity, and used official outcomes.
| Entry | Observations | Win rate | Mean ask | Fee-adjusted EV |
|---|---|---|---|---|
| First crossing, final 60 s | 1,407 | 99.4% | $0.992 | +0.14¢ |
| T−30 s snapshot | 270 | 100.0% | $0.996 | +0.33¢ |
| T−60 s snapshot | 1,235 | 99.4% | $0.994 | −0.04¢ |
Little room after fees
Mean and 95% confidence interval
Fee-adjusted EV per contract · ¢
| Entry | n | EV (¢) | 95% interval (¢) |
|---|---|---|---|
| Final minute | 1407 | 0.14 | -0.4 to 0.56 |
| T−30 s | 270 | 0.33 | 0.16 to 0.59 |
| T−60 s | 1235 | -0.04 | -0.64 to 0.42 |
The price explained most of the result. Of the 1,407 first-crossing observations, 1,273 had asks above 98 cents; that group’s estimated net EV was just 0.03 cents per contract. The 90–95 cent group contained only 31 observations, won 87.1% of the time, and lost about 7 cents per contract after modeled fees.
The apparent bargain was usually expensive enough to have little expected value left. The cheaper contracts were much less certain than a simple displacement signal suggested.
Median visible top-of-book depth ranged from 276 to 522 contracts across the three entry rules. That is displayed depth, not guaranteed capacity. The replay did not establish that all of it would remain available to us in competition with other orders.
Fee treatment also matters at this scale. Kalshi’s general taker fee schedule uses , rounded up to the next cent, where is the number of contracts. Our per-second analysis uses the unrounded per-contract approximation . The replay figures above are reported fee-adjusted estimates from the supplied export, not a reconciliation of exchange charges. Live-ledger fees below are actual reported charges.
The model looked better before execution
The paper ledger reported $137.26 in net profit on $4,285.98 of purchase cost, approximately 3.2%. The live ledger ended at a $26.16 loss after fees, approximately −0.69% of purchase cost. These percentages describe turnover-based returns in different samples, not account returns or a matched paper-versus-live experiment.
| Measure | Result |
|---|---|
| Submitted / filled orders | 1,029 / 935 (90.9%) |
| Contracts traded | 4,383 |
| Purchase cost | $3,778.53 |
| Trading fees | $34.90 |
| Realized P&L before fees | +$8.74 |
| Realized P&L after fees | −$26.16 |
| Profitable / losing trading days | 4 / 6 |
Fees were almost four times gross profit. But transaction costs were only part of the explanation. The 450-second entry window accounted for $24.89 of the loss. It had looked profitable in the shorter paper sample; the live run continued for another twelve days, under changing parameters and market conditions.
Selection was another problem. On selected trade observations, the market ask predicted outcomes slightly better than our model: Brier scores were 0.1042 and 0.1058 respectively, and log losses were 0.3526 and 0.3730. Lower is better for both metrics. Across the broader per-second population, the model’s Brier score was 0.1000 versus 0.1013 for the market mid-price.
Those comparisons use different samples and different market-price measures—ask versus midpoint—so they are not a controlled estimate of execution damage. They do show why an average forecasting score was an inadequate reason to trade. We needed the model to work specifically where it disagreed with an executable price.
A larger gap was not a better signal
Probability / price · %
Modeled net per contract · ¢
Model probability minus ask · percentage points
| Gap (pp) | n | Model (%) | Observed (%) | Ask (%) | Net (¢) |
|---|---|---|---|---|---|
| < 0 | 27585 | 77.1 | 76.1 | 80.0 | -4.88 |
| 0–2.5 | 40893 | 92.0 | 91.1 | 91.1 | -0.38 |
| 2.5–5 | 18450 | 88.2 | 87.7 | 84.6 | 2.39 |
| 5–10 | 15424 | 88.5 | 89.6 | 81.5 | 7.12 |
| 10–15 | 2705 | 89.5 | 77.6 | 77.7 | -1.3 |
| 15–20 | 260 | 87.3 | 56.5 | 70.6 | -15.49 |
The largest disagreements were especially troubling. In the 15–20 percentage-point gap bucket, the model predicted an 87.3% win rate. The average ask was 70.6 cents. The observed win rate was 56.5%, and hypothetical net P&L was −15.49 cents per contract. That bucket had only 260 observations across 23 settlement windows, but it was a useful warning: the most attractive-looking model signal could be the least trustworthy.
Moderate disagreement looked more promising in this sample. A 5–10 point gap produced an estimated +7.12 cents per contract. That was a retrospective slice of correlated observations, however, not a validated replacement strategy.
The same underlying crypto moves also affected several positions at once. The paper analysis had 1,022 entries but only 121 settlement windows. Aggregating returns by window produced variance 1.64 times the estimate under an independent-trade assumption. Counting trades overstated how many separate bets we had made.
Our uncertainty estimate was too narrow
Three calibration rounds failed the acceptance criteria we had set. In the third review of the three-minute window, 144 training observations and 78 validation observations produced a Brier score of 0.08872 after calibration, slightly worse than 0.08857 before it. Across windows, settlement-block bootstrap intervals for improvement included zero.
We then examined the distributional assumption directly. For each market near a fixed horizon, we standardized the realized settlement error by the model’s forecast standard deviation. If the approximation were well specified, those errors would resemble a standard normal distribution.
| Seconds to expiry | Markets | Error standard deviation | Share beyond ±3 |
|---|---|---|---|
| 440 | 281 | 1.40 | 3.56% |
| 300 | 281 | 1.30 | 3.20% |
| 180 | 278 | 1.28 | 1.80% |
| 90 | 251 | 1.32 | 2.79% |
| Standard normal reference | — | 1.00 | 0.27% |
More uncertainty than the model allowed
Standardized settlement error · 278 markets
Standard normal quantile
| Normal quantile | Observed error |
|---|---|
| -2.911 | -7.838 |
| -2.549 | -5.070 |
| -2.366 | -3.397 |
| -2.239 | -3.297 |
| -2.140 | -3.159 |
| -2.058 | -2.955 |
| -1.988 | -2.917 |
| -1.927 | -2.839 |
| -1.872 | -2.838 |
| -1.823 | -2.260 |
| -1.777 | -2.179 |
| -1.735 | -2.140 |
| -1.696 | -2.035 |
| -1.659 | -1.864 |
| -1.624 | -1.853 |
| -1.591 | -1.846 |
| -1.560 | -1.795 |
| -1.530 | -1.679 |
| -1.502 | -1.676 |
| -1.475 | -1.568 |
| -1.448 | -1.531 |
| -1.423 | -1.494 |
| -1.399 | -1.471 |
| -1.375 | -1.460 |
| -1.352 | -1.433 |
| -1.330 | -1.404 |
| -1.309 | -1.376 |
| -1.288 | -1.340 |
| -1.267 | -1.328 |
| -1.247 | -1.327 |
| -1.228 | -1.324 |
| -1.209 | -1.301 |
| -1.191 | -1.286 |
| -1.172 | -1.261 |
| -1.155 | -1.261 |
| -1.137 | -1.250 |
| -1.120 | -1.228 |
| -1.104 | -1.226 |
| -1.087 | -1.222 |
| -1.071 | -1.198 |
| -1.055 | -1.190 |
| -1.040 | -1.189 |
| -1.024 | -1.184 |
| -1.009 | -1.174 |
| -0.994 | -1.159 |
| -0.979 | -1.147 |
| -0.965 | -1.125 |
| -0.951 | -1.107 |
| -0.937 | -1.100 |
| -0.923 | -1.098 |
| -0.909 | -1.095 |
| -0.896 | -1.092 |
| -0.882 | -1.086 |
| -0.869 | -1.080 |
| -0.856 | -1.030 |
| -0.843 | -1.024 |
| -0.830 | -1.020 |
| -0.817 | -0.998 |
| -0.805 | -0.969 |
| -0.793 | -0.949 |
| -0.780 | -0.948 |
| -0.768 | -0.937 |
| -0.756 | -0.869 |
| -0.744 | -0.830 |
| -0.732 | -0.821 |
| -0.720 | -0.815 |
| -0.709 | -0.773 |
| -0.697 | -0.739 |
| -0.686 | -0.718 |
| -0.674 | -0.707 |
| -0.663 | -0.702 |
| -0.652 | -0.698 |
| -0.641 | -0.635 |
| -0.630 | -0.630 |
| -0.619 | -0.630 |
| -0.608 | -0.614 |
| -0.597 | -0.611 |
| -0.586 | -0.607 |
| -0.576 | -0.589 |
| -0.565 | -0.548 |
| -0.555 | -0.538 |
| -0.544 | -0.533 |
| -0.534 | -0.528 |
| -0.523 | -0.516 |
| -0.513 | -0.515 |
| -0.503 | -0.513 |
| -0.493 | -0.490 |
| -0.482 | -0.485 |
| -0.472 | -0.485 |
| -0.462 | -0.458 |
| -0.452 | -0.412 |
| -0.442 | -0.402 |
| -0.432 | -0.399 |
| -0.422 | -0.397 |
| -0.413 | -0.386 |
| -0.403 | -0.382 |
| -0.393 | -0.366 |
| -0.383 | -0.353 |
| -0.374 | -0.350 |
| -0.364 | -0.345 |
| -0.354 | -0.344 |
| -0.345 | -0.342 |
| -0.335 | -0.340 |
| -0.326 | -0.331 |
| -0.316 | -0.331 |
| -0.307 | -0.327 |
| -0.297 | -0.315 |
| -0.288 | -0.299 |
| -0.279 | -0.297 |
| -0.269 | -0.293 |
| -0.260 | -0.281 |
| -0.251 | -0.278 |
| -0.241 | -0.276 |
| -0.232 | -0.263 |
| -0.223 | -0.255 |
| -0.214 | -0.246 |
| -0.204 | -0.235 |
| -0.195 | -0.228 |
| -0.186 | -0.211 |
| -0.177 | -0.202 |
| -0.168 | -0.202 |
| -0.158 | -0.200 |
| -0.149 | -0.181 |
| -0.140 | -0.176 |
| -0.131 | -0.171 |
| -0.122 | -0.170 |
| -0.113 | -0.158 |
| -0.104 | -0.154 |
| -0.095 | -0.151 |
| -0.086 | -0.144 |
| -0.077 | -0.136 |
| -0.068 | -0.136 |
| -0.059 | -0.120 |
| -0.050 | -0.112 |
| -0.041 | -0.104 |
| -0.032 | -0.087 |
| -0.023 | -0.085 |
| -0.014 | -0.063 |
| -0.005 | -0.030 |
| 0.005 | -0.024 |
| 0.014 | -0.024 |
| 0.023 | -0.014 |
| 0.032 | -0.013 |
| 0.041 | -0.011 |
| 0.050 | -0.005 |
| 0.059 | 0.000 |
| 0.068 | 0.012 |
| 0.077 | 0.013 |
| 0.086 | 0.016 |
| 0.095 | 0.029 |
| 0.104 | 0.037 |
| 0.113 | 0.037 |
| 0.122 | 0.044 |
| 0.131 | 0.049 |
| 0.140 | 0.064 |
| 0.149 | 0.096 |
| 0.158 | 0.101 |
| 0.168 | 0.111 |
| 0.177 | 0.114 |
| 0.186 | 0.135 |
| 0.195 | 0.140 |
| 0.204 | 0.193 |
| 0.214 | 0.227 |
| 0.223 | 0.255 |
| 0.232 | 0.257 |
| 0.241 | 0.270 |
| 0.251 | 0.277 |
| 0.260 | 0.298 |
| 0.269 | 0.313 |
| 0.279 | 0.316 |
| 0.288 | 0.320 |
| 0.297 | 0.325 |
| 0.307 | 0.327 |
| 0.316 | 0.345 |
| 0.326 | 0.359 |
| 0.335 | 0.377 |
| 0.345 | 0.378 |
| 0.354 | 0.397 |
| 0.364 | 0.439 |
| 0.374 | 0.446 |
| 0.383 | 0.477 |
| 0.393 | 0.480 |
| 0.403 | 0.482 |
| 0.413 | 0.486 |
| 0.422 | 0.490 |
| 0.432 | 0.493 |
| 0.442 | 0.501 |
| 0.452 | 0.507 |
| 0.462 | 0.510 |
| 0.472 | 0.519 |
| 0.482 | 0.525 |
| 0.493 | 0.542 |
| 0.503 | 0.544 |
| 0.513 | 0.549 |
| 0.523 | 0.551 |
| 0.534 | 0.555 |
| 0.544 | 0.563 |
| 0.555 | 0.580 |
| 0.565 | 0.609 |
| 0.576 | 0.612 |
| 0.586 | 0.620 |
| 0.597 | 0.671 |
| 0.608 | 0.673 |
| 0.619 | 0.687 |
| 0.630 | 0.710 |
| 0.641 | 0.711 |
| 0.652 | 0.712 |
| 0.663 | 0.724 |
| 0.674 | 0.746 |
| 0.686 | 0.773 |
| 0.697 | 0.823 |
| 0.709 | 0.826 |
| 0.720 | 0.827 |
| 0.732 | 0.833 |
| 0.744 | 0.857 |
| 0.756 | 0.865 |
| 0.768 | 0.866 |
| 0.780 | 0.867 |
| 0.793 | 0.872 |
| 0.805 | 0.884 |
| 0.817 | 0.890 |
| 0.830 | 0.921 |
| 0.843 | 0.946 |
| 0.856 | 0.965 |
| 0.869 | 0.967 |
| 0.882 | 0.991 |
| 0.896 | 1.004 |
| 0.909 | 1.009 |
| 0.923 | 1.020 |
| 0.937 | 1.022 |
| 0.951 | 1.037 |
| 0.965 | 1.040 |
| 0.979 | 1.109 |
| 0.994 | 1.119 |
| 1.009 | 1.132 |
| 1.024 | 1.139 |
| 1.040 | 1.143 |
| 1.055 | 1.151 |
| 1.071 | 1.156 |
| 1.087 | 1.197 |
| 1.104 | 1.273 |
| 1.120 | 1.275 |
| 1.137 | 1.292 |
| 1.155 | 1.316 |
| 1.172 | 1.338 |
| 1.191 | 1.346 |
| 1.209 | 1.376 |
| 1.228 | 1.377 |
| 1.247 | 1.382 |
| 1.267 | 1.389 |
| 1.288 | 1.417 |
| 1.309 | 1.502 |
| 1.330 | 1.545 |
| 1.352 | 1.595 |
| 1.375 | 1.605 |
| 1.399 | 1.611 |
| 1.423 | 1.640 |
| 1.448 | 1.758 |
| 1.475 | 1.853 |
| 1.502 | 1.929 |
| 1.530 | 1.940 |
| 1.560 | 1.963 |
| 1.591 | 1.988 |
| 1.624 | 2.032 |
| 1.659 | 2.055 |
| 1.696 | 2.205 |
| 1.735 | 2.209 |
| 1.777 | 2.263 |
| 1.823 | 2.342 |
| 1.872 | 2.352 |
| 1.927 | 2.396 |
| 1.988 | 2.508 |
| 2.058 | 2.546 |
| 2.140 | 2.600 |
| 2.239 | 2.638 |
| 2.366 | 2.709 |
| 2.549 | 2.724 |
| 2.911 | 2.801 |
The observed standard deviations were 28–40% above the model’s prediction. Events outside three model standard deviations occurred about 7–13 times as often as a standard normal would suggest. These are small, dependent samples, but the direction of the mismatch was consistent: our model assigned too little probability to large settlement errors.
The market’s own prices were less confident. Regressing the normal-score transform of the midpoint against the model’s score gave an approximate relationship of , with fitted scale factors around 1.25–1.29 outside the final minute. This is a description of observed prices, not evidence of the models used by individual market makers.
Simply widening our model did not establish an edge. In the filtered sample used for the scale scan, moving from to improved Brier score from 0.1252 to 0.1250. It was a small in-sample change, not proof that a recalibrated strategy would survive live execution.
A visible window is not necessarily a tradable one
Three distinctions matter when interpreting an apparent spot-lag opportunity. First, a direct exchange spot feed may reveal a move before a settlement index publishes it. That puts the signal at a different point in the information sequence. We did not test that version, so our index-driven result cannot establish whether a direct spot signal would have arrived early enough to trade.
Second, displayed liquidity and the speed of the participants supplying it can differ across markets. A shallow book may show a price gap with very little capacity behind it. Slower quote updates are one possible explanation, but depth alone does not identify the liquidity providers or establish how quickly they react. Our Kalshi observations cannot answer that question for another venue.
Third, filling a backtest at the displayed best price assumes that the quote survives until matching. Polymarket’s order documentation describes a delayed status for marketable orders subject to a matching delay: acceptance is not a fill. Where makers can cancel during that interval, they have additional time to withdraw a stale quote before the taker reaches it. That mechanism protects resting liquidity from being picked off; it does not reserve the displayed price for the taker. A replay that omits it can overstate executable opportunity.
Our experiment did not measure how much of any apparent window on another venue survives live execution. For the Kalshi strategy we tested, the problem occurred earlier: most repricing preceded the index signal itself. Even without an additional taker delay, faster matching would not recover a price that had already changed.
What this experiment did not establish
The result is narrower than “spot-lag trading does not work.” We tested one class of strategies, using a particular settlement-index input, in a particular set of 15-minute markets.
- We did not test a version driven by direct exchange spot feeds. The event study measures the index’s timing relative to the book; it does not measure the best obtainable spot signal.
- We did not test five-minute contracts or other venues. The settlement window, price structure, and execution rules may differ.
- The five-day replay and ten-hour local study are interim samples. The longer recording period is not included here.
- Parameters changed during the live run, and some analysis followed inspection of the data. Historical holdouts and bootstrap intervals do not make this a prospective randomized experiment.
- The replay assumes passive observation of a book our own orders do not change. Queue competition, withdrawals, partial fills, and fee rounding can affect the executable result.
- Per-second observations and different crypto assets share outcomes and market shocks. The effective amount of independent evidence is much smaller than the row count.
Why we stopped
Our original criterion was straightforward: after a signal appeared, could we obtain a sufficiently favorable price before it disappeared, and still make money after fees?
The experiment did not meet that criterion. Most of the measured quote adjustment preceded our index signal. Near expiry, high win rates came with prices close to the payout. Earlier entries exposed weaknesses in the model’s uncertainty estimate, selection, and correlated risk. The live ledger finished below zero.
Our strategy was reacting to a move the order book had already largely priced in.
We discontinued the strategy. What remained useful was the research process: recording and replay, explicit execution assumptions, event studies with placebo comparisons, and evaluation beyond the subset of trades we happened to take.
