Consulting Work Blog Contact
← Back to blog

The Strategy That Could Never Say Sell

The Strategy That Could Never Say Sell

For about two months, a trading bot I run never once told me to sell. Buy ideas arrived all the time, dozens on some days. Sell ideas: none. I assumed the market was simply rising and the bot was reading it correctly. It turned out the bot was mathematically incapable of recommending a sale, and I had built it that way myself without noticing.

TL;DR

  • For a pre-registered “sell when confident” test, the bar was a confidence score of 75. For weeks the test came back completely empty.
  • Two hidden inputs quietly tilted every score upward, so a sell case could approach the line but never reach it.
  • After I neutralised both, sell signals clearing the bar went from 3 to 13 on the very same history. The market had not changed; only the rigged scoring had.

The test that kept coming back empty

The setup is plain. The bot reads news, turns each story into a trade idea, and attaches a confidence score from 0 to 100. I pay attention only when confidence crosses a threshold picked ahead of time.

Before trusting it with anything that mattered, I pre-registered a small test: watch every sell signal that crosses 75 confidence and see how it would have played out. Pre-registering just means the rule was written down before any results existed, so I could not quietly move the goalposts.

The test sat there for weeks and produced nothing. Zero qualifying sell signals. My first instinct was the lazy one: the market is up, sells are naturally rare, the bot is fine. Comfortable, because it requires no work and blames nobody. Also completely wrong.

The wall at 74.8

When I finally pulled the raw scores instead of trusting the empty summary, one number jumped out. The strongest sell signal the bot had ever generated scored 74.8. And not 74.8 once by chance: the entire top edge of the sell distribution pressed up against 75 and stopped dead.

A set of scores that hugs a line and never crosses it is not a natural shape. Real numbers overshoot sometimes. When a value gets close to a limit again and again but never passes it, something is physically holding it there.

Every sell signal stopped at 74.8 against a gate of 75, until two hidden inputs were neutralised

Two inputs were doing the holding, neither visible from the outside. First, a fallback rule: a stock with no news of its own borrowed the general market mood, which sat slightly optimistic, around 53 on the same scale. A quiet stock began life leaning “buy” for a reason that had nothing to do with the stock. Second, an old adjustment added during a long rally, a small thumb on the scale toward buying. Both were sensible the day I wrote them. Together they meant every sell case started in a hole, and the climb always ran out of road just under the gate.

What changed when I let go of the thumb

The fix was not clever, which is slightly embarrassing to admit. I set the no-news fallback to genuinely neutral, 50 instead of 53, and retired the rally adjustment. That is the entire change.

On the exact same history, sell signals clearing the gate went from 3 to 13. An independent re-run over a separate slice of data said 3 to 12. Buy signals barely flinched, their top scores fell by a single point, which is what you hope for, because the buys were never the problem. The bot had been spotting sell-worthy situations the whole time and swallowing them.

The bot was not quiet because nothing qualified. It was quiet because the one number it needed could not legally exist.

This is the same side project that once flattered me with a +158% gain it never actually earned, so I have learned to distrust its happiest-looking outputs. A number that only ever points one direction is telling you about its own wiring, not about the world.

Why “no results” is the most dangerous result

An empty result feels like information. But “nothing qualified” and “nothing could possibly have qualified” produce the identical blank screen, and they mean opposite things. One says the world is quiet. The other says your gate was welded shut before the test even started.

The same shape plays out far away from any code. A hiring funnel where no candidate ever clears the bar, because the bar was copied from a job description nobody on the team actually does. A safety log with zero reported incidents, because the form to file one is buried four clicks deep. Each time the absence gets read as a finding, and the finding is fiction: the measurement was built to return nothing else.

The cheap habit that catches it: before you trust a “no results”, ask what the maximum possible result was. Not what came back, but what could have come back at its very best. My sell test’s best possible answer sat two tenths of a point below the bar, so its real message was never “nothing sells” but “this gate cannot open”. If I were starting over, I would log one extra number beside every threshold: the best score that actually showed up underneath it. The near-misses are the tell, and a clean dashboard throws them away first.

Somewhere in your work there is a number that has read zero for a suspiciously long time, and everyone has agreed to call it good news. Have you checked whether anything was ever allowed to make it move?

Stack: Python · Claude API · SQLite

Need something like this for your own business? See how I can help →