We shipped a daily AI trade ideas feed. Here is how we stopped it from making numbers up.

AutoQuant v0.9.11 publishes swing trade ideas every weekday before the open, with real option strikes picked from the live chain. The hard part was not generating ideas. It was making sure the AI never invents a number. This is the architecture, and the bug that proved it.

AutoQuant now publishes trade ideas every weekday before the open. Real tickers, real levels, real option strikes from the live chain. This post is about the part that took actual engineering: making sure none of those numbers are hallucinated.

The problem with asking an LLM for a trade idea

Ask any large language model for a swing trade and it will happily give you one. It will also happily invent the strike, the expiry, the delta, and a price that never existed. The output looks exactly as confident either way. That’s disqualifying for a research feed people open every morning.

So we split the job in two.

The LLM picks setups. Code picks numbers.

How a batch gets built

Every weekday at 9am ET, a job on our research box runs this pipeline:

  1. Pull 4h bars for a curated universe of 103 liquid names (S&P heavyweights, sector ETFs, large caps with active options).
  2. Mechanically pre-tag every chart: trend vs the 50-day, RSI extremes, MACD crosses, 40-bar breakouts, volume surges, and a volatility regime from ATR percentiles.
  3. Shortlist the ~18 strongest setups. Both directions.
  4. Make ONE model call. The model ranks the shortlist and writes the research notes: direction, entry zone, invalidation level, a named structure (credit spread, iron condor, cash-secured put, and so on), and the reasoning.
  5. Validate everything. Tickers must come from the shortlist. Entry zones must sit near the last close. Invalidation must be on the losing side of the trade. And a regex rejects the batch if the prose contains anything that looks like a strike, an expiry, or a DTE.

That last rule sounds paranoid until you watch a model work. In our smoke tests the model once returned direction: "neutral", which isn’t a thing in our schema. The validation layer caught it, sent the errors back for one repair attempt, and the second pass came back clean. If repair fails, nothing publishes and we get a Discord alert. An empty feed beats a wrong one.

The Trade Ideas page in AutoQuant. A UPS long idea with its 4h chart, entry zone, invalidation level, the illustrative payoff shape, and the FOMC decision flagged in the calendar strip up top.

So where do the strikes come from?

From the actual options chain, picked by code that cannot hallucinate.

After the model commits to a setup, a deterministic resolver takes over. It pulls the ticker’s real chain, finds the expiry nearest 45 days out, and selects listed strikes by delta target: roughly 20 delta for short strikes on credit spreads and condors, 25 for cash-secured puts and covered calls, at-the-money for debit spread longs.

One wrinkle: the market data feed we use doesn’t include greeks. So we compute approximate deltas ourselves, backing implied volatility out of the quoted mid prices with Black-Scholes and a bisection solver. About forty lines of math, no dependencies. Those deltas are selection logic only. They never get published as facts, just as the ~20Δ tags you see next to each leg.

What we deliberately do NOT publish is prices. Option quotes move too fast for a daily note to quote honestly. You get the structure, the real strikes, the expiry, and the levels that anchor the whole thesis. You price your own entry.

An ISRG short idea with a suggested call credit spread. Sell the $390 call at roughly 20 delta, buy the $395 call. Both strikes came from the live listed chain, picked by the resolver, not the model.

The bug that proved the design

A few hours after launch, our own feed showed an AAPL debit spread that bought the $335 call and sold the $330 call. If you trade spreads you just winced. Selling the lower strike against a higher long turns a debit spread into something else entirely.

The resolver had picked the long leg by delta, then anchored the short leg to a key level that happened to sit below it. Both numbers were real. The combination was wrong.

Here’s the point: because every leg was structured data instead of prose, the bug was visible in one glance at the feed, reproducible in a unit test, and fixed with a strict ordering rule (the short leg must sit strictly beyond the long leg in the trade direction) within the hour. If those strikes had been buried in LLM-generated text, we might have shipped inverted spreads for a week.

The macro layer

Ideas also carry context now. The generator knows the FOMC calendar (transcribed from the Fed’s own schedule, through 2027), computes jobs report and monthly OPEX dates, checks earnings dates for every shortlisted ticker, and reads recent headlines. The model is only allowed to cite events we hand it. Today’s batch flagged AAPL’s July 30 earnings on the AAPL idea and shows an FOMC banner for the July 29 decision.

What you get

Full plans receive the complete batch every weekday, currently 8 to 10 ideas. Light plans get the day’s top idea. Each one ships with a 4h chart, entry zone, invalidation level, the payoff shape, suggested contracts where a structure calls for them, and the risk note.

They’re research examples, not investment advice. But every number in them is real, and that’s the whole point.

AutoQuant v0.9.11 is live now at autoquant.ai/download.