Closed-trade P&L sliced by the dimensions most likely to reveal a real edge or a real leak, plus what's being filtered out before it ever becomes a trade. Machine-readable copy of this page: /strategy.json. Threshold retuning proposals: latest backtest report.
How close to market close the trade was opened. Entering near expiry has been the single largest leak in this system — near-close trades leave no room for Kalshi to converge before the market resolves.
| Days from open to resolution | Closed | Win Rate | Total P&L |
|---|---|---|---|
| a. <1 day | 626 | 47.6% (298/626) | $-1603.00 |
| b. 1-3 days | 325 | 50.5% (164/325) | $-785.50 |
| c. 3-7 days | 499 | 59.5% (297/499) | $-47.42 |
| d. 7-30 days | 677 | 72.2% (489/677) | $+1821.28 |
| e. 30+ days | 2778 | 66.8% (1856/2778) | $+646.73 |
Classifier score of the wallet whose trade fired the signal. Watch for variance *within* a bucket — check the wallet table below before setting a score floor.
| Score Bucket | Closed | Win Rate | Total P&L |
|---|---|---|---|
| 0.6-0.7 | 1769 | 69.9% (1237/1769) | $+1384.13 |
| 0.7-0.8 | 116 | 75.0% (87/116) | $+255.31 |
| 0.5-0.6 | 4417 | 57.5% (2540/4417) | $-91.29 |
| Market Type | Closed | Win Rate | Total P&L |
|---|---|---|---|
| unclassified | 1431 | 55.9% (800/1431) | $+1849.07 |
| us_policy | 1222 | 91.6% (1119/1222) | $+1753.38 |
| entertainment | 22 | 86.4% (19/22) | $+182.50 |
| other | 2476 | 62.9% (1557/2476) | $+144.45 |
| intl_political_removal | 140 | 85.0% (119/140) | $+120.25 |
| us_corporate_legal | 29 | 55.2% (16/29) | $-18.00 |
| intl_diplomatic_resolution | 982 | 23.8% (234/982) | $-2483.50 |
| Side | Closed | Win Rate | Total P&L |
|---|---|---|---|
| NO | 3315 | 86.1% (2855/3315) | $+7934.40 |
| YES | 2987 | 33.8% (1009/2987) | $-6386.25 |
Gap relative to the Kalshi price — which is also the return on capital if the gap fully closes, since cost is entry price × size. Read against the entry-price panel below: the two are strongly related, because a fixed 3¢ gap is a large relative edge on a cheap contract and a small one on an expensive contract.
| Gap % | Closed | Win Rate | Total P&L |
|---|---|---|---|
| 50%+ | 1379 | 47.0% (648/1379) | $+1170.65 |
| 0-10% | 1006 | 77.6% (781/1006) | $+565.75 |
| 10-25% | 1593 | 65.0% (1036/1593) | $+248.95 |
| 25-50% | 2324 | 60.2% (1399/2324) | $-437.20 |
The strongest single lever in the book so far, and largely what the gap panel above is proxying. It also sets what the fixed 10¢ stop-loss means in risk terms: 10¢ is ~68% of a 15¢ entry but ~13% of an 80¢ one, so the same stop is near-unreachable at the cheap end and a hair-trigger in the middle.
| Kalshi entry price | Closed | Win Rate | Total P&L |
|---|---|---|---|
| a. <10c | 231 | 80.5% (186/231) | $+157.78 |
| b. 10-25c | 1459 | 82.4% (1202/1459) | $+1466.18 |
| c. 25-50c | 2216 | 40.3% (892/2216) | $-1012.40 |
| d. 50-75c | 1562 | 66.1% (1033/1562) | $+1872.10 |
| e. 75c+ | 834 | 66.1% (551/834) | $-935.50 |
Minimum 10 closed trades, worst P&L first.
| Ticker | Closed | Win Rate | Total P&L |
|---|---|---|---|
| KXHORMUZNORM-26MAR17-B260801 | 676 | 14.5% (98/676) | $-1571.50 |
| KXUSIRANMOU-27JAN01-26JUN19 | 316 | 43.0% (136/316) | $-1036.50 |
| KXUSAIRANAGREEMENT-27-26AUG | 60 | 0.0% (0/60) | $-906.50 |
| KXUAPFILES-26MAY27-26JUN29 | 43 | 0.0% (0/43) | $-798.00 |
| KXUSAIRANAGREEMENT-27-26JUL | 280 | 32.5% (91/280) | $-674.25 |
| KXFABLERESTORE-27-26JUN27 | 275 | 61.1% (168/275) | $-441.25 |
| KXTRUMPBIBIMEET-26AUG01-JUL21 | 12 | 0.0% (0/12) | $-392.00 |
| KXMUSKOAI-26 | 37 | 8.1% (3/37) | $-370.60 |
| KXHORMUZWEEKLY-26MAY31-T20 | 12 | 0.0% (0/12) | $-259.00 |
| KXHORMUZNORM-26MAR17-B260601 | 16 | 18.8% (3/16) | $-125.50 |
| KXSULYOKOUT-26MAY-JUL01 | 26 | 0.0% (0/26) | $-120.25 |
| KXHORMUZWEEKLY-26JUL12-T150 | 87 | 48.3% (42/87) | $-95.00 |
| KXUSAIRANAGREEMENT-27 | 169 | 64.5% (109/169) | $-92.50 |
| KXFABLERESTORE-27-26JUN20 | 37 | 48.6% (18/37) | $-81.37 |
| KXHORMUZWEEKLY-26JUL26-T50 | 17 | 5.9% (1/17) | $-75.50 |
Minimum 10 closed trades, worst P&L first. A wallet losing consistently here is a blocklist candidate regardless of its classifier score.
| Wallet | Closed | Win Rate | Total P&L |
|---|---|---|---|
| 0xb40e89677d59665d5188541ad860450a6e2a7cc9 | 252 | 37.7% (95/252) | $-689.62 |
| 0xc8ab97a9089a9ff7e6ef0688e6e591a066946418 | 502 | 46.8% (235/502) | $-634.55 |
| 0x0c0e270cf879583d6a0142fc817e05b768d0434e | 93 | 1.1% (1/93) | $-455.25 |
| 0x93511d72d294f1478739bc38f578bf0306fd9e4d | 33 | 24.2% (8/33) | $-363.00 |
| 0x645a91730f588c5586e8860936a7e3554303fd84 | 168 | 10.7% (18/168) | $-339.25 |
| 0x8a98109fb0f1d87d9bfcb4486ba3587b95c51b92 | 141 | 46.8% (66/141) | $-332.40 |
| 0x614dc8d3542c12103d2c6a3553fd761e391d1546 | 52 | 0.0% (0/52) | $-326.75 |
| 0x5235578efe24555b0c98e7dc10a902b09089c04a | 58 | 6.9% (4/58) | $-319.00 |
| 0x40cfb29411d29f4fa0908f2a121297042cccd21d | 37 | 13.5% (5/37) | $-292.30 |
| 0x5a218c7ad04135830a45c41aaed7294df7809318 | 41 | 7.3% (3/41) | $-282.50 |
| 0x9e8077593bf0a6fd63f988dcf589f7558897f694 | 26 | 0.0% (0/26) | $-255.88 |
| 0x96489abcb9f583d6835c8ef95ffc923d05a86825 | 110 | 50.0% (55/110) | $-209.00 |
| 0x9cb35555b913c805a62a2e34bce4ef14f0e81367 | 135 | 43.7% (59/135) | $-192.97 |
| 0x4aa87d513621c74a091f514e9c14b52377f46531 | 11 | 0.0% (0/11) | $-155.00 |
| 0x4e4203102fd7bde55ce1bcf9f1ef222e251949ed | 25 | 0.0% (0/25) | $-130.00 |
Pairs whose Kalshi/Polymarket gap was still wide when the trade expired. A gap that never closes suggests the two markets don't resolve on the same condition — a matching problem, not a slow signal. Populates going forward only (196 expiries recorded so far).
| Ticker | Expired | Avg Gap at Expiry | Avg PM Price |
|---|---|---|---|
| KXHORMUZNORM-26MAR17-B270101 | 50 | 9.9¢ | 0.605 |
| KXFARAGEOUTREFORM-26JUL-JAN01 | 15 | 7.9¢ | 0.251 |
| KXABRAHAMSA-27-JAN01 | 12 | 7.5¢ | 0.075 |
| KXLEADERSOUT-27JAN01-LJMKOR | 1 | 5.6¢ | 0.097 |
| KXUSAIRANAGREEMENT-27-26OCT | 10 | 5.5¢ | 0.132 |
| SENATEME-26-D | 7 | 4.2¢ | 0.676 |
| KXPRESNOMD-28-MK | 10 | 3.9¢ | 0.029 |
| SENATEME-26-R | 2 | 3.5¢ | 0.335 |
| KXRATECUTCOUNT-26DEC31-T1 | 21 | 3.3¢ | 0.070 |
| SENATESC-26-R | 3 | 3.0¢ | 0.900 |
| KXRATECUTCOUNT-26DEC31-T0 | 10 | 2.8¢ | 0.885 |
| GOVPARTYWI-26-D | 3 | 2.5¢ | 0.415 |
| KXVENEZUELALEADER-26DEC31-NMAD | 16 | 2.5¢ | 0.825 |
| SENATEMI-26-R | 10 | 2.3¢ | 0.403 |
| KXCBDECISIONJAPAN-26SEP17-H25 | 3 | 2.2¢ | 0.395 |
Positions abandoned at the max-age timeout rather than closed, so they realized nothing and pnl stays NULL. Two different questions: mark-to-market is what the position was worth when we walked away — known for every expired trade, since the exit price is always recorded. Settlement is what it would have paid had we held on — knowable only once the market actually resolves, which for markets running into 2027 is a long way off. A large gap between the two columns means the timeout itself is costing (or saving) money.
| All expired | Trades | Capital | Mark-to-Market | Settlement (known) |
|---|---|---|---|---|
| total | 1910 | $59654.59 | $-419.01 | $-4945.15 (848/1910) |
| Market Type | Expired | Capital | Mark-to-Market | Settlement |
|---|---|---|---|---|
| unclassified | 545 | $12296.40 | $-473.75 | $+797.25 (371) |
| us_policy | 509 | $26679.14 | $+1089.74 | $-15.00 (12) |
| intl_diplomatic_resolution | 481 | $9908.50 | $-1091.25 | $-6487.00 (397) |
| other | 316 | $9300.80 | $+68.50 | $+626.60 (55) |
| intl_political_removal | 46 | $302.75 | $+17.75 | — |
| us_corporate_legal | 13 | $1167.00 | $-30.00 | $+133.00 (13) |
Filters that are armed but not blocking. Each row is what the filter would have stopped, alongside the P&L of the trades those signals actually became — so a negative figure is money the filter would have saved. This measures a proposed rule against live data before it changes any behaviour. Enable one by flipping its constant in detector/propagation.py (e.g. NEAR_CLOSE_FILTER_ENABLED). Filters overlap — one candidate can trip several — so each row answers "what would this filter have done on its own?" and the rows do not sum to a total.
| Filter | Would Block | Became Trades | P&L If Allowed |
|---|---|---|---|
| low_gap_pct | 228 | 128 | $+396.25 |
| near_close | 8 | 2 | $-0.50 |
The live stop is a flat STOP_LOSS_CENTS = 10¢, which is ~68% of a 15¢ entry but ~13% of an 80¢ one — near-unreachable at the cheap end, a hair-trigger in the middle. This records where a SHADOW_STOP_PCT-of-entry stop would have exited instead. Exits can't be backtested (the replayer only re-decides entries against realized exits), so this is measured forward on live trades. Nothing here changes an exit.
| Flagged Trades | Capital | Actual P&L | If Stopped Early | Delta |
|---|---|---|---|---|
| 5 | $112.00 | $-57.50 | $-57.50 | $+0.00 |
A positive delta means the relative stop would have done better than what actually happened. Only finished trades count — an open position has no realized side to compare against.
A single backtest report can't justify a threshold change: the top candidate by validation P&L is exactly the config most likely to have been flattered by noise in that one window. This counts how often each config beat live on both train and validation while keeping ≥70% of live's trades. Read qualified as a fraction — 1/1 is noise, 4/4 is a finding — and check worst: a config that ever went negative is not a candidate, however good its average. Windows evaluated: 2026-07-12, 2026-07-19, 2026-07-26, 2026-08-06.
| Config | Qualified | Avg Val Delta | Worst Window |
|---|---|---|---|
| conc=8 wr=0.25 minclosed=10 | 3/3 | $+91.87 | $+1.77 |
| conc=8 wr=0.25 minclosed=8 | 3/3 | $+91.87 | $+1.77 |
| conc=8 wr=0.25 minclosed=5 | 3/3 | $+59.70 | $+18.18 |
| conc=10 wr=0.25 minclosed=5 | 3/3 | $+42.75 | $+28.25 |
| conc=4 wr=0.2 minclosed=10 | 2/3 | $+75.72 | $+13.29 |
| conc=4 wr=0.25 minclosed=10 | 2/3 | $+75.72 | $+13.29 |
| conc=4 wr=0.2 minclosed=8 | 2/3 | $+75.72 | $+13.29 |
| conc=4 wr=0.25 minclosed=8 | 2/3 | $+75.72 | $+13.29 |
| conc=6 wr=0.2 minclosed=10 | 2/3 | $+57.50 | $-5.41 |
| conc=6 wr=0.25 minclosed=10 | 2/3 | $+57.50 | $-5.41 |
Nothing here is applied automatically. Changing a threshold means editing the constants in detector/propagation.py by hand.
Every candidate that cleared the cheap structural checks (tracked pair, min trade price), regardless of whether it became a real trade. 'success' means it opened a paper trade. Not era-filtered — logging began when signal_candidates shipped.
| Stage | Count |
|---|---|
| gap_too_small | 11571 |
| gap_too_large | 2857 |
| concentration_cap | 728 |
| circuit_breaker | 701 |
| success | 600 |
| low_liquidity | 110 |
| duplicate | 59 |
| near_resolution | 38 |