The Days My Engine Sat Out — An Audit
Suneet Malhotra
Apr 30, 2026
For the last 60 trading sessions I have run a systematic options engine on a paper account, gated by a directional bias score that has to clear 65 out of 100 before any entry is allowed. On 47 of those 60 days, the score did not clear the gate on any of the 19 tickers in the universe. On those days the engine logged a one-line "no trade" entry and went home.
That is a lot of sitting out. Almost four out of every five sessions ended with no new position. For a long time my read on this was that the gate was correctly conservative and the empty days were the cost of avoiding bad trades. Last week I went back and asked whether that read was right. I did not love the answer.
What I checked
For each of the 47 no-trade days I pulled three things:
- The highest bias score the engine produced that day, across all 19 tickers
- The intraday move of the highest-scoring ticker, measured close-to-close from the next morning open
- What the matching strategy would have paid, simulated against the chain that was available at the score time
I measured the third one by walking the same selection logic forward as if the gate had let it through, and computing the result against the actual fill quotes the next session.
Two notes on methodology before the numbers. First, this is paper-account data, so all fills are optimistic. Second, the simulation is one-shot per skipped day, not a full backtest re-run; it does not account for portfolio constraints or daily loss caps that would have applied if a trade had actually opened. Treat the numbers as directional, not as a P&L line you could have actually captured.
The aggregate
Across the 47 skipped days, the simulated P&L of the trades the gate refused was negative $612.
The gate paid. Sitting out was, on net, the right call.
That is the satisfying number. The unsatisfying number is the dispersion. Of the 47 skipped days, 19 would have been winners, 22 would have been losers, and 6 would have been within $20 of breakeven. The gate did not refuse only bad trades. It refused some good trades too, and the good ones it refused were on average larger in magnitude than the bad ones it refused.
Net negative $612 across 47 trades is real. But the win rate of the refused universe was 40 percent, which is roughly the same as the win rate of the trades that did pass the gate. The gate was not separating winners from losers. It was reducing the number of trades.
Where the edge actually lives
When I sliced the same data by bias score band, the picture sharpened.
- Top score 60 to 64 (just under the gate): 23 days, simulated P&L negative $94, win rate 43 percent
- Top score 50 to 59: 17 days, simulated P&L negative $311, win rate 41 percent
- Top score below 50: 7 days, simulated P&L negative $207, win rate 29 percent
The 60 to 64 band is the interesting one. The engine refused 23 trades that were one or two points below the threshold, and as a group they cost almost nothing. The variance was lower, the win rate was no worse than the through-the-gate population, and the loss was within a normal week of slippage.
Below 60 the cost climbs and the win rate drops, which is the shape I would have expected from the gate everywhere. It only shows up below 60.
What this changes
I am not lowering the gate. The reason is that the 23 trades just under the threshold cost almost nothing as a group, but within the group they had higher per-trade variance than the trades that passed. Net-zero on average is not the same as safe-to-take. The gate is doing two jobs: filtering out negative-expected-value setups, and keeping daily P&L variance bounded so the loss cap rarely fires. The 60 to 64 band fails the second job even when it does not fail the first.
What I am changing is the language I use about it. The gate is not a directional-bias filter, despite what the variable name says. It is a variance filter that happens to correlate with directional bias. That is a different statement, and it has consequences for the next two things I want to test.
The first is whether a separate variance-based gate, decoupled from the bias score, would let me take a few of the 60 to 64 setups on quiet days when overall portfolio variance is below target. The second is whether the score thresholds are even right at all, or whether I picked 65 because it is a round-ish number that produced a comfortable count of trades when I was first calibrating.
I do not know the answer to either question yet. The point of the audit was to make me admit that I do not know, after running this gate for 60 sessions and never going back to check.
The general lesson
A rule that produces an empty result feels free. There is no trade, no fill, no slippage, no P&L line item. The cost is invisible because it is a counterfactual. You only see it if you go back and compute what would have happened.
It is the same trap as the slippage line buried in a column without a chart. The thing you are not measuring is the thing that is quietly compounding. For a system that makes most of its decisions by saying no, the audit of the no-decisions is where the next round of edge has to come from.
Share this post
You Might Also Like
The Check That Passes Until the Day It Does Not
Every day my engine reconciles its own record of open positions against the broker's. Almost every day the two lists match. I do not run the check for those days.
OpenClaw TutorialsThe Three-Percent Daily Stop That Freezes at $3,000
My engine has two daily loss limits: three percent of equity and a flat $3,000. They are the same number on exactly one day, the day the account opened. After that they quietly diverge.
Quantitative TradingA Retry Is Not a Trading Decision
A rejected order is a decision. Retrying it without preserving the reason can turn a risk control into a duplicate trade.
Agentic AIThe Log Is Part of the Agent's Interface
An agent that can act but cannot leave a useful decision record is not autonomous. It is an opaque process with write access.
Latest Blog Posts
A Retry Is Not a Trading Decision
A rejected order is a decision. Retrying it without preserving the reason can turn a risk control into a duplicate trade.
The Log Is Part of the Agent's Interface
An agent that can act but cannot leave a useful decision record is not autonomous. It is an opaque process with write access.
The Market Is Closed Is Not a Trading Rule
A backtest can know the exchange hours and still schedule a trade into a holiday, an early close, or a stale session. Calendar state is market data.
Related Tools & Demos
The QA Field Manual to Language Models
A free 24-chapter book. Start at “what is AI, really?” and finish with a small language model you built yourself — one that reads a failing Playwright test and proposes a fix you can run. Read it in your browser, or download the PDF or the Mac app.
View Source Code →Multi-Model LLM Harness
One interface to call any AI model — capability routing, fallback chains, budgets, circuit breakers, and a quality feedback loop. A practical architecture pattern write-up.
Automated Trading System
Multi-engine trading platform with real-time risk management, regime-based strategy selection, and automated order execution.
View Source Code →
Stay in the Loop
Get weekly insights on AI-driven QA, engineering leadership, and automation strategies.
No spam, ever. Unsubscribe anytime.