The viral 5-minute BTC bot: the market already prices the favourite correctly
Subject: an open-source Polymarket bot for BTC Up/Down 5-minute markets (Novals83/5min-btc-polymarket) that circulated widely in September 2026 alongside a claim of $250 turned into $13,000. The idea: late in the 5-minute window, buy the side that is already winning at 0.80–0.99. We tested the idea as described in posts and the rule as actually written in the repository.
Across 7,120 markets the late favourite wins almost exactly as often as its price says it should. What is left is smaller than the taker fee. Holding to settlement loses 0.3% to 1.3% per dollar risked out of sample. The rule as coded in the repository, which sells 20 seconds before the end, loses about 3%. The $250 to $13,000 claim cannot be verified and is not supported by the data.
1 — What the code actually does
The posts describe a momentum filter: enter about two minutes before the close when BTC has moved $70–100 from the open, buy the leading side at 0.80–0.99, and hedge at a 95/5 skew. The repository is different, and says so itself.
| Element | As described in posts | As written in the repository |
|---|---|---|
| Entry | Leading side at 0.80–0.99, about 120 s before close | Whichever side has an ask ≥ 0.70, with at least 60 s left, fill-and-kill order |
| Momentum filter | BTC moved $70–100 from the open | Documentation only. Not implemented in the strategy code |
| Exit | Hold to settlement, small hedge at 95/5 | Sell at best bid 20 s before the end, stop-loss at 25–30% below entry. Never held to settlement |
We therefore registered both versions: four variants of the described idea, a no-filter control, a larger-move variant, the repository rule as written, and the repository entry held to settlement.
2 — Data and rules of the test
| Item | Choice |
|---|---|
| Quotes | Best bid, best ask and top-of-book size for both outcomes from the public market WebSocket, 0.1 s timestamps |
| Outcome | The official resolution of each market, not a price feed of our own |
| Fees | Taker fee of 0.07 × p × (1 − p) per share on every fill, as charged on these markets |
| Split | First 20 days for discovery, last 8 days held out and read once |
| Statistics | Bootstrap confidence intervals clustered by calendar day, Benjamini–Hochberg at q = 0.10 over the 8 variants, minimum 30 trades per cell |
| Pre-registration | Hypotheses, variants and decision rule hashed before any outcome was computed: sha256 95a8a299…c6b7984b |
| Excluded | 8 days with known collector defects, listed in the pre-registration |
3 — Results, net of fees, per dollar risked
| Variant | Holdout n | Win rate | Avg price | Net | 95% CI |
|---|---|---|---|---|---|
| T−120 s, move ≥ $70, 0.80–0.99, hold | 262 | 95.4% | 0.953 | −0.26% | −4.62 to +3.23 |
| T−90 s, same | 166 | 97.6% | 0.967 | +0.76% | −1.92 to +2.90 |
| T−60 s, same | 54 | 96.3% | — | +1.78% | −3.09 to +6.17 |
| T−120 s, no filter (control) | 1,166 | 91.5% | 0.916 | −0.66% | −1.96 to +0.68 |
| T−120 s, move ≥ $100 | 113 | 94.7% | — | −1.59% | −7.64 to +2.77 |
| Repository entry (ask ≥ 0.70), hold | 1,966 | 85.8% | 0.860 | −1.26% | −2.43 to −0.07 |
| Repository rule as written (exit T−20 s, stop-loss) | 6,435* | 87.4% | — | −2.80% | −3.30 to −2.28 |
* Full period, exit at the last known bid before T−20 s. Read literally with a fresh quote required at T−20 s, the same rule shows −35.8%, but that number is inflated by a selection effect described in finding F-03. We report the corrected figure.
The two small positive rows do not survive the registered break test: with the five best days removed, T−90 s falls to −2.10% and T−60 s to −2.02%. No variant passes the multiple-testing correction.
4 — Why it fails: the favourite is priced correctly
| Ask price band at T−120 s | Markets | Avg ask | Favourite won | Net after fee |
|---|---|---|---|---|
| 0.80 – 0.85 | 591 | 0.820 | 81.6% | −1.75% |
| 0.85 – 0.90 | 751 | 0.871 | 87.6% | −0.30% |
| 0.90 – 0.95 | 1,037 | 0.922 | 91.3% | −1.47% |
| 0.95 – 0.99 | 1,541 | 0.972 | 97.1% | −0.36% |
A 0.972 favourite needs to win 97.4% of the time to break even after the fee. It won 97.1%. A high win rate is what a correctly priced favourite looks like. It is not evidence of an edge.
5 — Findings
The advertised filter is not in the code
- Evidence
- The $70–100 move condition appears only as reference text in the strategy profile. The entry test is a price threshold on the ask.
- Effect
- Anyone running the repository is not running the strategy described in the posts. In our data the filter adds nothing either way: net results by move size do not separate winners from losers.
The early exit costs about two points and protects nothing
- Evidence
- Selling at the bid 20 s before the close pays a second taker fee and the spread. Same entries held to settlement: −1.26%. With the exit and stop-loss: −2.8% to −3.2%.
A trap for anyone backtesting this
- Evidence
- Book snapshots on this feed arrive with trades. Once a market is decided, trading stops and snapshots thin out: a quote fresher than 3 s exists for 91% of markets at T−120 s but only 15% at T−20 s.
- Effect
- Requiring a fresh quote near the close selects the undecided, volatile markets and overstates reversals. It turned −2.8% into −35.8% in our first pass. The opposite mistake, filling stale quotes, overstates profit.
Size is not the constraint
- Evidence
- Median size at the best ask was 180–500 shares. The strategy fails on expectancy, not on liquidity.
6 — Limits of this audit
BTC 5-minute markets only. Twenty-eight valid days, one of which was a Federal Reserve decision day. Fills are assumed at the quoted ask with no queueing or latency, which favours the strategy. We did not run the bot with money and did not inspect anyone’s account. The profit claim in circulation is unverifiable from public information, so we make no statement about how it was produced.
Appendix — Method
Rule variants, fee model, split and decision rule were written and hashed before outcomes were joined. Outcomes come from the venue’s official resolutions. Confidence intervals by bootstrap clustered on calendar day. Break tests: drop the five best days, fees × 1.5, reprice at the next snapshot, exclude the central-bank day. Sensitivity analyses run after the fact are labelled as such and carry no decision weight.
Want the same treatment for your own bot? Request an audit or read a full sample report.