← ~/logs LOG-003

>Why Accuracy Is a Terrible Metric for Trading Bots

A 90% win rate sounds incredible until you do the math. How building a binary options bot taught me that being right and being profitable are completely different problems.

If someone told you their trading bot wins 9 out of every 10 trades, you would probably assume it prints money. I would have assumed the same thing before I actually built one.

I put together an automated system that connects to three live data feeds over WebSocket, processes order book data in real time, calculates volume weighted microprices every second, and executes trades on binary prediction markets with zero human intervention. The whole thing runs in Docker, has a real time dashboard, JWT auth, the works.

Over an 11 hour dry run it won 29 out of 32 trades. A 90.6% win rate. And mathematically, it was still underwater.

Let me explain how that is even possible, because the answer completely reframed how I think about trading systems.

What the Bot Actually Does

The market I was trading works like this: every 15 minutes, a new contract opens asking “Will BTC go up or down in the next 15 minutes?” There are two tokens you can buy, Up and Down, each priced between $0.00 and $1.00. When the market closes, the winning side pays out $1.00 per contract and the losing side pays $0.00.

So if you buy an Up contract at $0.60 and BTC goes up, you get $1.00 back. That is $0.40 profit on a $0.60 bet. If BTC goes down, you lose your $0.60 entirely.

My bot’s strategy was simple and, I thought, clever: wait until the last 2 minutes of each 15 minute cycle, when the market direction is most obvious. By then, one side is usually trading at $0.90 or higher because the direction is already clear. The bot calculates a microprice (a volume weighted midpoint from the best bid and ask) for each side, picks whichever is the favorite, and buys it with a Fill or Kill market order if the confidence is above 90%.

The logic felt bulletproof. Why bet early when you can wait for near certainty? Let the market tell you who is winning, then pile on.

The Dry Run

I ran it overnight on April 13th, 2026. No real money, just logging what it would have done. Here is what happened across 45 market cycles:

32 trades placed. 29 wins. 3 losses.

Sounds incredible right? Except the total profit from those 29 wins was $5.53. And the total cost of those 3 losses was $15.00.

Net result: negative $9.47 on paper.

That number forced me to rethink the entire approach.

The Math That Broke My Brain

Here is the thing I completely missed when I designed this strategy. When you buy a binary contract at $0.96, your upside if you win is $0.04 per contract. Your downside if you lose is $0.96 per contract. That is a reward to risk ratio of roughly 1:24.

Let that sink in. For every dollar you could gain, you are risking twenty four dollars.

At that ratio, you need to win 96% of the time just to break even. My bot was winning 90.6% of the time. Exceptional by any normal standard. Completely insufficient for the math it was up against.

Here is the table that tells the whole story:

Entry PriceWin Profit (per $5 bet)LossBreak Even Win Rate
$0.91+$0.49$5.0091.1%
$0.93+$0.38$5.0093.0%
$0.96+$0.21$5.0096.0%
$0.98+$0.10$5.0098.0%
$0.99+$0.05$5.0099.0%

My average entry price was $0.961. That means I needed a 96.3% win rate to break even. I had 90.6%. I was six percentage points short of profitability despite being right nine times out of ten.

Where the Money Actually Went

Breaking down the trades by entry price range makes it painfully clear:

$0.94 to $0.96 entries: 9 trades, 9 wins, +$2.16 profit. This was the sweet spot. Decent confidence, still some upside per contract.

$0.97 to $0.99 entries: 12 trades, 11 wins (91.7% accuracy!), and yet negative $4.40. That single loss at $0.98 erased the profits of every other trade in the bracket and then some.

$0.99+ entries: 4 trades, 4 wins, +$0.03 total. Four perfect trades. Three cents. I risked $20 in total capital exposure for a return that would not buy a piece of gum.

The three losing trades at $5.00 each wiped out all 29 winning trades and then kept going. Trade #11 (lost at $0.98 entry) single handedly erased the profits from the previous 10 trades combined.

The Trap of “Obvious” Bets

This is the counterintuitive lesson. The strategy of “wait until it is obvious and then bet on the favorite” sounds smart. And the prediction accuracy is genuinely impressive. The bot reads order book data, calculates microprices, checks multiple data sources. It knows which way BTC is going with about 91% reliability in the last two minutes.

But the market knows too. That is why the price is $0.96 and not $0.60. You are buying certainty, and certainty is expensive. The entire edge has already been priced in by the time you show up.

Think of it this way. If the market says something is 96% likely to happen, and you agree and buy at that price, you have no edge. You are paying fair value. The only way to profit consistently at $0.96 entries is to be right more often than the market expects. Not 90% of the time. Not 95%. More than 96%.

And when you are wrong? The punishment is catastrophic relative to your wins. Each loss costs you as much as 25 or 50 winning trades.

What I Got Right (and What Did Not Matter)

The engineering was solid. Three concurrent WebSocket feeds (spot price, oracle price, and the order book) all piping into a shared state object protected by a threading lock. An async strategy loop evaluating signals every second. Adaptive resolution intervals for checking trade outcomes. Fill or Kill orders to avoid partial fills. A consecutive loss circuit breaker.

None of that mattered because the core assumption was wrong. I was optimizing accuracy when I should have been optimizing expected value. A system that wins 70% of the time at $0.60 entries absolutely demolishes a system that wins 91% of the time at $0.96 entries. Let me show you:

70% win rate at $0.60 entry (per 100 trades of $5 each): 70 wins × $3.33 profit = $233.10 gained. 30 losses × $5.00 = $150.00 lost. Net: +$83.10

91% win rate at $0.96 entry (per 100 trades of $5 each): 91 wins × $0.21 profit = $19.11 gained. 9 losses × $5.00 = $45.00 lost. Net: negative $25.89

The “worse” predictor makes $83. The “better” predictor loses $26. Because expected value is not about being right. It is about what you gain when you are right versus what you lose when you are wrong.

The Flat Bet Problem

There is a second issue compounding all of this. Every single trade was a flat $5.00 regardless of the entry price. A trade at $0.91 (where there is a plausible mathematical edge) got the same $5.00 as a trade at $0.999 (where there is literally no edge at all and you are risking $5.00 for half a penny of upside).

No professional operation works this way. Position sizing should scale with your edge. If you have no edge, you should not trade at all. If you have a small edge, bet small. If you have a large edge, bet larger. The bot treated every opportunity identically, which meant it was throwing full stakes at trades where the math said it should be sitting on its hands.

What Comes Next

So where does this leave the project? The signal generation is genuinely good. Predicting short term BTC direction with 90%+ accuracy is not nothing. The infrastructure is solid. The execution pipeline works.

What is broken is the decision layer on top of it. The bot needs to understand when it has an actual mathematical edge versus when it is just confirming what the market already knows. It needs to size positions based on that edge instead of throwing flat bets. And there are structural opportunities in these markets that do not require predicting direction at all.

That is where the project is heading. Away from “predict the winner and bet on it” and toward quantitative strategies that exploit the actual mechanics of how these markets work. Edge based position sizing, structural inefficiency scanning, and a complete rethinking of when and why a trade should be placed.

The 90% win rate proved the signal works. The expected value math showed exactly where to take it next.

Key Takeaways

Expected value is not accuracy. A trade is only profitable if your win rate exceeds the break even rate implied by your entry price. At $0.96, you need 96%+ accuracy. At $0.80, you only need 80%+. Lower confidence entries can be far more profitable.

The market prices in certainty. If something is “obviously” going to happen, the price already reflects that. Buying at $0.96 means the market agrees with you. There is no edge in consensus.

Position sizing is not optional. Flat betting with no regard for edge is a slow bleed. The size of each bet should be a function of how much edge you actually have on that specific trade.

Asymmetric risk will eat you alive. When your average win is $0.19 and your average loss is $5.00, you cannot afford to be wrong even once out of twenty six times. Three losses in 32 trades sounds like nothing. It was everything.

Accuracy got me to 90%. Expected value is what will get me to profitability.