Methodology

The bot is fully autonomous: nothing is hand-picked per run. Every decision — which stocks, which direction, which strike and expiration, and whether to fire at all — comes out of the layered analysis below. It runs once each trading morning, about 15 minutes after the open, and posts up to three signals to Discord.

The scoring layers

  1. 1

    Universe scan

    Every ~180-name seed list is filtered each morning by price, dollar-volume liquidity, 20-day realized volatility (stable low-vol names are dropped), and short-term momentum. The bot decides what to look at rather than working a fixed watchlist.

  2. 2

    Technical analysis

    A multi-timeframe conviction score from EMA structure, the 200-EMA trend filter, RSI, MACD, Supertrend, ATR, and candlestick patterns. Its sign sets the candidate direction; a weak absolute score means 'no clear read' and the name is skipped.

  3. 3

    Options flow

    Pulls the live chain, screens strikes for open interest, volume, and bid/ask spread, estimates an IV-vs-realized percentile (true historical IV isn't available on free data, so current ATM IV is compared to the stock's own trailing realized-vol distribution), and flags volume that dwarfs open interest.

  4. 4

    News & sentiment

    Headline tone over recent news, analyst-rating skew, and a hard exclusion if an earnings report falls inside the option's life. A same-day move in the trade's direction is treated as mild confirming evidence.

  5. 5

    ML model

    An XGBoost classifier trained on ~4 years of labelled history estimates the probability of a decisive (>3%) move within a week. It nudges confidence up or down and, when it disagrees with the technical read, applies a penalty. The bot runs without it too, falling back to a transparent momentum heuristic.

  6. 6

    Market regime

    SPY trend and VIX level. A call idea in a confirmed SPY downtrend, or any idea during an extreme-VIX tape, is down-weighted or stood down entirely.

From score to contract

The five layers are combined into a 0–100 confidence score using fixed weights, with a bonus when the ML model and technicals agree. Only candidates above the confidence threshold, with an affordable estimated premium and an acceptable risk:reward, survive. For each survivor the bot picks the expiration closest to its preferred days-to-expiry and the strike nearest a target delta (slightly out-of-the-money, for leverage). Target and stop are projected from an ATR multiple of the underlying; risk:reward is estimated with a delta-plus-gamma (convexity-aware) approximation of the option’s P&L at those levels.

How outcomes are graded

A tracking job checks every open signal daily against the underlying’s real high/low. The first level touched wins: hit the target → WIN, hit the stop → LOSS. A single day’s bar that spans both is scored conservatively as a loss (daily data can’t tell us which came first intraday). A signal that reaches expiration having touched neither is EXPIRED and is reported separately — never folded into the loss column. Win rate = wins ÷ (wins + losses).

What the P&L numbers are — and aren’t

  • Estimated, not filled. Free historical options data (real bid/ask, IV, open interest through time) does not exist. Every P&L figure on this site is the Black-Scholes value of the contract at the underlying’s exit price versus the estimated entry premium.
  • Gross. No commissions, no slippage, no early assignment, no partial fills.
  • The live record is young and small. Durable signal persistence began on 27 August 2026; anything before that was not reliably stored. A few dozen signals is not a track record — treat the backtest as the primary evidence for now, and even that is a test of the technical core only.
  • This is a research project. It is not investment advice, not a recommendation, and not a solicitation. Options frequently expire worthless. Past performance — live or simulated — does not predict future results.

The bot’s source lives in a private repository. This site reads its database and published backtest directly and adds nothing.