Reading Earnings Scans — Pre-Earnings Options Strategy Ranker

Earnings Scans runs every Sunday across every US-listed company reporting earnings in the upcoming work week. For each ticker that has liquid options (total chain OI ≥ 5,000), it computes four strategy scores and — for Straddle and Condor — runs a real 6-cycle backtest against Polygon's historical option chains. The result is a per-strategy ranked list with real win-rate data on two of the four strategies and V1 heuristic scores on the other two.

The four strategies in one paragraph each

Earnings Rush — long IV before the report

IV typically expands into earnings as uncertainty builds, then crushes the morning after the report. Rush plays the expansion: enter a long ATM straddle ~10 trading days pre-EE, close BEFORE the announcement. Wins on vega regardless of which way the underlying moves; loses when IV doesn't rise (already pricing in the event) or theta exceeds vega. The V3.4 backtest uses a longer-dated expiry (first Friday ≥21 days post-EE) because short weeklies have tiny vega and theta wipes out any IV gain. Exit is the close BEFORE the announcement: EE-day close for AMC reporters, prior-day close for BMO.

Iron Condor — short premium through the event

Sell an OTM put spread + an OTM call spread, held through the report. Wins on IV crush plus stock staying inside the inner strikes. The V1 score scales with (implied move − historical |move|) — bigger gap = more juice to harvest, less risk of the wings being tested. The V3.2 backtest replaces that guess with: did this exact 1.0×/1.5× condor structure actually make money across the last 6 earnings? Win %, Avg ROI, sparkline — straight from Polygon contract aggregates.

Straddle — long premium through the event

Buy ATM call + ATM put, hold through the report, exit after the IV crush. Wins when the stock moves further than the straddle cost. The V1 score is the inverse of Condor: high when historical |move| has reliably EXCEEDED implied move. The V3.1 backtest checks: simulating this exact ATM-straddle trade on the last 6 earnings cycles using real Polygon prices, what was the actual Win % and Avg ROI?

Breakout — directional bet on follow-through

Some stocks have a strong post-EE directional bias — they consistently rip in one direction after earnings (or consistently dump). Breakout buys a single-leg ATM call or put pre-EE aligned with that bias. The V3.3 backtest is rolling-window — at each past cycle, direction is decided by the mean of OLDER cycles only (no look-ahead). That keeps the simulation honest: if a ticker truly has a persistent directional bias, the rolling signal catches it; if the bias is just noise from the latest few quarters, the backtest will show low win rate or negative ROI and rank low.

How sort order works

On Straddle, Condor, and Breakout tabs, rows are sorted by:

  1. Confidence tier descending — STRONG before WEAK before THIN before none. A 60% win rate on 5 cycles ranks above a 100% win rate on 1 cycle, every time.
  2. Avg ROI descending — within tier, the trade that made more money historically ranks first.
  3. V1 heuristic score descending — final tie-breaker when backtest data is sparse.

On Rush and Breakout tabs (pending V3.3 / V3.4), rows are filtered to V1 score ≥ 50 and sorted by score descending. The ≥50 floor exists because the V1 heuristic is noisy at the low end and showing every 0-49 row would drown the signal.

The banner state machine

The top of every backtested tab shows one of three banners:

  • Emerald — ✓ N STRONG PICKS: N tickers cleared the ≥4-cycle bar. Those are the actionable rows — focus there.
  • Amber — ⚠ NO STRONG PICKS:No row hit ≥4 cycles, but at least one returned 2-3 (WEAK). Treat the WEAK rows as a watchlist worth monitoring; don't commit capital based on a 2-3 cycle sample alone.
  • Gray — NO QUALIFIED CANDIDATES:Zero rows have enough priceable historical option cycles to produce a reliable backtest. This is common in slow earnings weeks or for weeks dominated by recent IPOs. The absence of edge is itself information — there's nothing this scanner finds tradeable, so go work on something else.

Common confusion: V1 score vs V3 backtest

Important distinction: the 0-100 Strategy Score is V1 heuristic — a smart guess based on comparing implied move to historical |move|. The Win % / Avg ROI / sparkline cell on Straddle and Condor tabs is V3 backtest — actual P&L from simulating the strategy on real historical Polygon prices. They can disagree:

  • A V1 score of 76 with WEAK or THIN backtest tier means “the setup looks favorable on paper, but we don't have enough historical data to confirm it actually works for this ticker.”
  • A V1 score of 30 with STRONG +40% Avg ROI backtest means the heuristic underrates this setup — the real history says the trade has worked. Trust the backtest.
  • When both agree (high V1 + STRONG positive backtest), that's the highest-conviction pick of the week.

Mechanics under the hood

The backtest engine for one ticker:

  1. Fetch the last 6 earnings dates from Finnhub.
  2. Fetch underlying daily bars for the full date range (one Polygon call per ticker).
  3. Fetch the current option chain once to determine the ticker's expiry cadence (weekly / monthly / both).
  4. For each past earnings cycle:
    • Compute entry date (4 trading days pre-EE) and exit date (1 trading day post-EE, accounting for BMO/AMC timing).
    • Pick strikes — ATM-rounded for Straddle, 1.0×/1.5× implied move for Condor (sized by current implied move applied to entry-day spot).
    • Build OPRA contract tickers (e.g. O:AAPL250117C00150000).
    • Fetch per-contract aggregates for the entry-to-exit window (Polygon /v2/aggs/ticker/O:.../range/1/day/...).
    • Compute entry price, exit price, per-cycle P&L, ROI.
  5. Aggregate the cycles into Win %, Avg ROI, cyclesUsed (cycles that produced priceable bars), totalCycles (cycles attempted).

Cycles can fail to price for legit reasons: thinly-traded historical strikes, weekly expiries that weren't listed back then, holiday gaps, contract tickers that don't exist for low-priced names with wide strike grids. Those failures show up as the cyclesUsed < totalCycles gap and drive the confidence tier down accordingly.

What to do with this every week

  1. Sunday night / Monday morning: open the page, check the banner state on Straddle and Condor.
  2. If STRONG picks exist: open the top 2-3 rows. Read the Win %, Avg ROI, and sparkline. Cross-check the V1 rationale. Hit BUILD to drop the structure into Risk Graph.
  3. If only WEAK / THIN / none:skip the backtested tabs. Glance at Rush and Breakout for directional ideas. If nothing there either, go work on something else — there's no edge this week.
  4. Cross-reference: Options Edge anomalies + GEX dealer-positioning often line up with the same names this scanner flags. A trade with backtest confirmation + IV anomaly + GEX alignment is much higher conviction than backtest alone.

Frequently asked questions

What are the four strategies?

(1) Earnings Rush — long IV before the earnings event, exit before the report. Bets on IV expansion into earnings. (2) Iron Condor — short an OTM put spread and OTM call spread through earnings. Bets on IV crush and a bounded move. (3) Straddle — buy ATM call + ATM put through earnings. Bets that the move exceeds what options are pricing in. (4) Breakout — directional pre-EE bet aligned with the ticker's historical post-EE move bias.

What does the 0-100 strategy score mean?

It's a V1 heuristic confidence number. For Straddle: scales linearly with historical |move| / implied move — higher when stocks have historically moved MORE than options are pricing in. For Condor: the inverse — higher when historical |move| is LESS than implied. For Breakout: scales with how often past EEs moved in the same direction. For Rush: scales with implied move magnitude and historical reliability. The badge is emerald at ≥60 (favorable setup), amber 40-59 (neutral), rose <40 (disfavored). Hovering or clicking shows the rationale string explaining the math.

What's the 'V3 BACKTEST' label on Straddle and Condor?

Those two tabs replace the V1 guess with HISTORICAL FACT. For each ticker reporting next week, the engine pulls the last 6 earnings cycles, reconstructs what the actual options chain looked like at each entry date, fetches real Polygon contract bars, simulates entry 4 trading days before EE and exit 1 trading day after, and computes per-cycle P&L using real prices. The result: Win %, Avg ROI, Wins:Losses, and a sparkline of every cycle's outcome — emerald bar up for wins, rose bar down for losses.

What do STRONG / WEAK / THIN confidence chips mean?

Sample-size tiers for backtest reliability. STRONG (emerald) = ≥4 of the 6 attempted cycles produced priceable data — trust the win-rate. WEAK (amber, 80% opacity) = 2-3 cycles only — directional read, sample too small to commit capital. THIN (gray, 55% opacity) = 1 cycle — informational. A 100% win on 1 cycle is statistically meaningless, so the tier-first sort ensures it never outranks a 60% on 5 cycles.

Why does the top of the tab sometimes say 'No qualified candidates'?

That banner appears when zero tickers reporting this week have ≥4 priceable historical cycles for the strategy. Common causes: a slow earnings week (few liquid names reporting), recent IPOs that don't have 6 quarters of earnings history yet, or thinly-traded names where Polygon's historical contract aggregates are sparse. It's the signal working, not the page breaking. The same banner has three tones: emerald when there ARE strong picks (showing the count), amber when only WEAK picks exist (watchlist only), gray when nothing qualifies.

Why are Rush and Breakout still on V1 heuristic scores?

V3.1 shipped the Straddle backtest. V3.2 shipped the Condor backtest. V3.3 (Breakout) and V3.4 (Rush) are next — each strategy needs its own price-simulation logic since the leg structure and ROI calculation differ. Until then, use Rush and Breakout as DIRECTIONAL screens — high-conviction setups worth investigating in your broker's tools — not as backtest-confirmed picks. The score and rationale tell you the V1 logic; verify the actual option prices and earnings dates against your broker before trading.

How do I tell a real backtest signal from noise?

Trust the row when: (1) tier is STRONG (≥4 cycles), (2) win rate is decisive — ≥60% or ≤30%, not random-looking 45-55%, (3) Avg ROI is materially positive or negative, not near zero, (4) the sparkline shows mostly one color rather than alternating wildly. Ignore the row when: tier is THIN or WEAK, win rate is near 50% with low avg ROI, or the sparkline is 50/50 noise. The Strategy Score column (the 0-100 number) is V1 heuristic only — it doesn't tell you whether the backtest is reliable. Always cross-check it with the backtest tier.

How is the Rush backtest different from Straddle?

Two key differences. (1) Holding window: Rush enters 10 trading days pre-EE and EXITS BEFORE the announcement — close of EE day for AMC reporters, prior-day close for BMO. Straddle holds through EE and exits 1 day post-EE. Rush bets on the IV ramp into earnings; Straddle bets on the realized move exceeding implied. (2) Expiry: Rush uses a longer-dated contract — the first Friday at least 21 calendar days after EE — because 5-DTE weeklies have tiny vega and theta wipes any IV gain. Straddle uses the next-Friday weekly, which is fine because Straddle profits from the actual stock move (delta) rather than vega expansion. Practical implication: Rush wins more often when IV rank is low going into earnings (room to ramp); loses when IV is already elevated (priced in) or when theta exceeds the vega gain.

How does the Breakout backtest pick call vs. put?

Rolling-window directional bias with no look-ahead leakage. For each past cycle the backtest simulates, the trade direction is decided by the mean post-EE move of the OLDER cycles only — the current cycle's outcome isn't peeked at. If the prior mean is > +0.5%, buy an ATM call; if < -0.5%, buy an ATM put; if it falls in the ±0.5% neutral band, skip the cycle (no clear bias). This avoids the classic backtest bug where using full-period stats to decide direction makes the strategy look profitable just because it's secretly trading the answer. We need at least 2 prior cycles before a cycle can be backtested, so the first 2 (oldest) cycles always skip.

What's the analyst note next to each backtest row?

A deterministic one-liner that translates the raw stats into a human read. Examples: ✓ Decisive wins, positive edge — N% × +R% avg. ⚠ Strong win rate but thin edge — single loss erases multiple wins. ⚠ Asymmetric — typical loss wipes 3+ wins. ✗ Negative edge — strategy lost money historically. The categories are: best-of-week, reasonable-setup, thin-edge, asymmetric-tails, high-variance, mixed-signal, negative-edge, small-sample, single-cycle. Same inputs always produce the same note — no model calls, no randomness.

What are the 'Trade' lines under STRONG-tier rows?

Black-Scholes-estimated trade structures for the upcoming earnings — strikes, expiry, and per-spread debit/credit. The strike-picking mirrors what the backtest simulated historically: ATM call+put for Straddle, 1.0×/1.5× implied-move iron condor, ATM call OR put for Breakout (direction from the backtest's same rolling-bias logic). Strikes snap to a price-tier-aware grid ($0.50 under $25, $1 under $100, $2.50 under $250, $5 above). The expiry is the first Friday strictly after the earnings date. Prices are estimates — they use current ATM IV and the BS pricing model, not real bid/ask. Use them to plan position size; verify the actual quotes in your broker before sending an order.

Why are the trade prices labeled as estimates?

Because they're Black-Scholes outputs, not real broker quotes. BS assumes lognormal returns and constant vol; real options chains have skew, term-structure, and a bid/ask spread that BS doesn't model. For high-IV names reporting earnings, the actual ATM straddle can trade 5-15% richer than the BS estimate (vol-of-vol premium). For low-IV liquid names (large caps with daily/weekly expiries), the estimate is usually within a couple percent. Click BUILD to load the structure into Risk Graph, which pulls live option chains and shows real prices.

What is the 'This week's read' hero box?

A 1-3 sentence top-of-tab summary that names the highest-conviction Straddle or Condor setup, a second pick if one stands out (pickScore ≥ 50% of the leader), and any deceptive-looking STRONG row to skip (thin-edge, asymmetric-tails, or negative-edge classifier hits). The 'best of week' pick is chosen by compositeScore = winRate × avgRoi × √cyclesUsed, rewarding both quality and sample size. If no STRONG-tier rows have both positive win rate AND positive avg ROI, the box stays hidden — the empty-state banner takes over.

What's the difference between 'Hist |move|' and 'Hist max'?

Hist |move| is the median absolute % move over the available history (typically 6-12 cycles). It's the 'typical' move — the half-and-half line. Hist max is the worst single move (max-magnitude in either direction) — the tail. Both matter: median tells you what's likely; max tells you what's possible. A condor with hist max far past implied move is risky even if hist |move| looks tame, because one tail event blows the whole structure.

What does the Implied Move column mean?

The ATM straddle priced as a percentage of spot — i.e. what options are pricing as the expected move through expiration. It's roughly equivalent to 1 standard deviation of the post-EE move distribution. If implied move is 8% and historical |move| has averaged 4%, options are 'rich' (Straddle disfavored, Condor favored). If implied is 4% and historical is 8%, options are 'cheap' (Straddle favored, Condor disfavored).

How are Condor strikes sized?

Short strikes at 1.0× implied move OTM (both put-side and call-side), long-wing strikes at 1.5× implied move OTM. Wing width = 0.5× implied move. Strikes are snapped to a price-tier-aware grid: $0.50 below $25, $1 below $100, $2.50 below $250, $5 above. The backtest ROI denominator is MAX LOSS (= wing width − net credit), not entry credit — because credit goes INTO your account, so the true 'return on risk' uses capital actually at stake.

What does the BUILD button do?

Drops the ticker into the Risk Graph builder with the suggested strategy structure pre-populated (ATM straddle for Straddle, 4-leg condor for Condor, single-leg directional for Breakout/Rush). You can then tweak strikes, IV, DTE, and quote-state, save it as a trade idea, and track P&L through the actual earnings event. It's the bridge from 'this row looks interesting' to 'here's what the actual position looks like.'

Why isn't every ticker in the universe shown?

The scan starts from Finnhub's full earnings calendar for the work week (typically 100-200 tickers in earnings season), then filters to names with total option chain OI ≥ 5,000. Sub-5k-OI tickers are dropped because the strategies would fill terribly — the bid/ask spread on illiquid options is wider than the expected edge. The 'computed' count in the header is what survived the filter. In a slow week, that can drop to 30-40; in peak earnings season (late January, late April, late July, late October), it's 80-120.

When does the scan run? Can I trigger it manually?

Scheduled for Sunday 22:00 UTC (5/6 PM ET), so the data is ready for Monday open. Total runtime is currently 5-8 minutes for ~40-tier universe (chain fetch + 6-cycle backtest per ticker for Straddle + Condor). The scan is idempotent — the upcoming-week's Monday is the key, so re-running just overwrites the same row. Manual triggers go through the bearer-token cron endpoint at /api/cron/earnings-scan; that's how we ran V3.2 mid-week for verification.

Keep reading