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
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
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
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
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
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
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.