BTC Entry Signals
Which BTC 15-minute entry signals carry their weight on KXBTC15M and which bleed? The saved bot stacks six entry families. Isolate each family as a standalone strategy with the collapsed exit logic the user would actually deploy — one take-profit tier at unrealized_pnl > 8 and one stop at unrealized_pnl < -15, both with position_size >= 21 and price guards — holding risk.max_position 60 and the 10s loop fixed, so per-signal PnL, trade count, win rate, and drawdown are directly comparable. Caveat: entries are size 30 in five families and size 5 in late_momentum, and late_momentum also carries a wider 0.03 spread gate, so it is not a like-for-like comparison on size or tradability gate.
Historical research only. Not investment advice.
Comparison results
BTC 15-Minute Entry Signals on Kalshi: Which Families Carry Their Weight?
Short disclaimer: This is historical simulation research on a 30-day window. It is not investment advice, not a live track record, and not a promise of future results. Treat everything below as a comparison exercise, not a signal to trade.
Intro / thesis
Most of the work in short-dated prediction markets is deciding which entries deserve to fire. On KXBTC15M — Kalshi's 15-minute BTC contract — a signal that looks reasonable in isolation can still bleed once you account for spread, the price band you enter at, and how often it triggers. This batch takes one saved bot that stacks six entry families and pulls each family out into its own standalone strategy, with the exit logic collapsed to what a user would actually deploy: one take-profit tier at unrealized_pnl > 8, one stop at unrealized_pnl < -15, both gated on position_size >= 21 with price guards, risk.max_position held at 60, and the loop fixed at 10 seconds. Same exits, same risk cap, different entries — so per-signal PnL, trade count, win rate, and drawdown line up cleanly.
The thesis worth testing: not all six entry families pull their weight, and the ones that don't may do so for reasons as mundane as entry price, spread gate, and trade frequency rather than any deep signal failure. By isolating each family we get a comparable read on which signals earn their place in a stack and which ones just add churn.
Variant and strategy explanation
Every candidate shares the same skeleton. Custom rules are evaluated top-to-bottom each tick, and the first matching rule fires and ends that tick. At the top sit the two exits:
- Rule 1 fires when
position_size >= 21andunrealized_pnl > 8andpriceis between 0.10 and 0.90 — sells all. - Rule 2 fires when
position_size >= 21andunrealized_pnl < -15andpriceis between 0.15 and 0.85 — sells all.
Below the exits is one entry family per variant, always with position_size == 0 and time_to_expiry <= 5m, then a mix of price bands, spread caps, and edge fields. The entry families in this batch:
- early_entry. Price 0.40–0.60,
btc.change_5m > 0,btc.velocity_1m > 0,btc.price > btc.vwap_1h,btc.ema_12_1m > btc.sma_20_1m, spread ≤ 0.015.buy_yesat size 30, with a mirroredbuy_noon the negative side. - triple_confirm. Price 0.35–0.65,
btc/eth/solchange_5mall > 0.001,btc.priceabove bothvwap_1handema_12_1m, spread ≤ 0.015.buy_yesat size 30, mirroredbuy_no. - above/below_vwap. Price 0.35–0.65,
btc.priceabovevwap_1handema_12_1m,btc.change_5m > 0.001,btc.velocity_1m > 0, spread ≤ 0.015.buy_yesat size 30, mirroredbuy_no. - accel_momentum. Price 0.20–0.80,
btc.change_5m > 0.0015,btc.velocity_1m > 0, spread ≤ 0.015.buy_yesat size 30, mirroredbuy_no. - triple_accel. Price 0.20–0.80,
btc/eth/solchange_5mall > 0.0015, all threechange_15m> 0, spread ≤ 0.015.buy_yesat size 30, mirroredbuy_no. - late_momentum. Price ≥ 0.87, spread ≤ 0.03.
buy_yesat size 5, mirroredbuy_noat price ≤ 0.13.
One caveat that matters for reading the table: five families enter at size 30, but late_momentum enters at size 5. late_momentum also uses a wider 0.03 spread gate. So its comparison to the others is not like-for-like on size or tradability, and any conclusion about it has to be held loosely. Each successful variant is saved as a runnable Turbine strategy, so any of the six can be pulled up and run as-is.
Top results
| Rank | Variant | Total PnL | ROI % | Sharpe | Max DD | Trades | Win rate |
|---|---|---|---|---|---|---|---|
| 1 | early_entry only | 1166.40 | 1944.00 | 1.29 | -70.50 | 367 | 66.9% |
| 2 | above/below_vwap only | 864.08 | 1440.13 | 0.91 | -66.28 | 252 | 70.2% |
| 3 | accel_momentum only | 735.09 | 1225.15 | 0.91 | -44.44 | 219 | 68.5% |
| 4 | triple_confirm only | 700.00 | 1166.67 | 0.89 | -44.71 | 194 | 72.6% |
| 5 | triple_accel only | 579.39 | 965.65 | 0.81 | -21.90 | 119 | 84.7% |
early_entry takes the top spot by a wide margin — 1166 in total PnL, 367 trades, 66.9% win rate, and the only Sharpe above 1.0 in the batch. It fires the most often of any of the profitable families, and the results suggest the four-condition stack (change_5m, velocity_1m, VWAP, EMA/SMA) at a narrow 0.40–0.60 price band is doing real filtering work. The -70.5 drawdown is the highest in the top five, though, which is the tradeoff for the higher trade count and larger gross PnL.
above/below_vwap lands second at 1440% ROI and a 70.2% win rate on 252 trades. It looks like a slightly lower-conviction version of early_entry — no velocity_1m requirement on the no-side, no EMA/SMA requirement, and a wider 0.35–0.65 band. Fewer trades, lower PnL, similar drawdown profile.
accel_momentum and triple_confirm are close together at ranks 3 and 4 — 735 and 700 PnL respectively — but they get there differently. accel_momentum is the simpler signal (BTC 5m momentum plus velocity, no cross-asset confirmation) with a wider 0.20–0.80 price band and 219 trades. triple_confirm adds the ETH and SOL change_5m > 0.001 requirements and tightens the band to 0.35–0.65, dropping trade count to 194 but pushing win rate to 72.6%. Both have essentially the same drawdown, around -44.5.
triple_accel is the interesting one at rank 5. Lowest total PnL in the top group (579), lowest ROI (965%), but also the lowest drawdown by a wide margin (-21.9) and by far the highest win rate (84.7%) on the fewest trades (119). The heavy filtering — BTC, ETH, and SOL all needing change_5m > 0.0015 and change_15m > 0 — means it fires rarely and apparently selects for high-probability setups.
Bottom results
| Rank | Variant | Total PnL | ROI % | Sharpe | Max DD | Trades | Win rate |
|---|---|---|---|---|---|---|---|
| 6 | late_momentum only | -39.52 | -65.87 | -0.13 | -77.41 | 1896 | 85.0% |
late_momentum is the only losing variant in the batch — and it's a strange loser. It fires 1896 times, roughly five times as often as early_entry, at a size of 5, and the win rate of 85.0% is the highest in the entire batch. Despite that, total PnL is -39.52 and max drawdown is the worst at -77.41. The pattern is consistent with a strategy that wins small and often but gives it all back on the tail — except that I can't verify that from the data alone. The reason a high win rate coexists with negative PnL and the deepest drawdown is unresolved here. It could be a payoff distribution issue, a price-band effect (yes entries only at ≥ 0.87 and no entries only at ≤ 0.13 means thin premiums on the losing side), or something about the wider 0.03 spread gate letting through fills that the tighter-gated families avoid. I'm flagging the discrepancy rather than picking an explanation, because the batch doesn't isolate which of these it is.
There's also the size mismatch to be honest about: late_momentum enters at size 5 while every other variant enters at size 30. So its contribution to the -39.52 total was generated on one-sixth the per-trade notional. Scaling it toward the other variants' size would make the loss larger, not smaller. This isn't a why-did-it-lose report — it's a
This report is generated from historical simulations. Backtests can be wrong or incomplete, and live trading can differ materially because of liquidity, fees, slippage, latency, market resolution, outages, and data quality. Do your own review before running any strategy.