Famous strategy

Bull call spread

The same breakout, but with a capped, defined-risk options trade. Run it below, free, no signup.

Our engine’s read

SHELF

Our engine's read: the edge didn't survive our honest test. That's our read — what you do with it is yours.

The engine’s own wordswalk-forward OOS EV -12.6% non-positive (overfit)

  1. Kept per trade−7.9%Once the real spread was paid both ways, the average trade gave back 7.9%.
  2. On unseen data−12.6%On the stretch of history the rules never saw it made −12.6%, against −3.3% on the stretch it was tuned on. That whole gap was fitting, not edge.
  3. Trades graded652652 trades fired across the window, which is enough evidence to actually judge it.

That is our engine’s read of one stretch of history — our opinion, not a verdict on you and not advice. Run it yourself below and check every number.

The benchNo signup · a few seconds

The same breakout, but with a capped, defined-risk options trade.

The rule we’ll testAt a new 52-week high, buy a call and sell a higher one against it. Hold 15 days.

Simulation for learning. Paper money, real data, not investment advice.

What the engine tests

The rule, condition by condition, exactly as the engine reads it. Both have to be true on the same day for a trade to fire.

  • Price hits a new 52-week high
  • Price is above its 200-day average (a healthy trend)
  • Buy a call 2% in the money, about 35 days to expiry.
  • Sell a call 4% out of the money, about 35 days to expiry.
  • Hold 15 trading days, then close.

The exact list of stocks

NVDA · AMD · AVGO · TSM · MU · MSFT · GOOGL · AMZN · META · AAPL · ORCL · CRWD · NOW · PLTR · NFLX · TSLA

16 liquid US names, every one with real option chains, over 2024-02-12 to 2026-05-20 on 1 day bars. That window is where real option fills exist — outside it there is nothing honest to grade, so we do not pretend there is.

How it is graded

  • It never sees tomorrow. A signal on any day reads only that day and the days before it, and the trade is entered at the NEXT day’s open.
  • It buys the ask and sells the bid. Never the midpoint — nobody fills you there. Contracts too thin to trade are skipped, not imagined into the results.
  • Half the history is held back. The rules are graded on the stretch they were not tuned on, and you see both numbers side by side.
  • Take-profit is left out of the score. A profit target flatters a curve without earning it, so our grade leaves it out. You can still trade one.

The receipt

Where those numbers came from. Anything we did not measure is simply not listed — a blank is not a zero.

  • Graded window2024-02-12 → 2026-05-13
  • Stocks graded16
  • Trades graded652
  • Best stop (take-profit excluded)none
  • Signals we could fill honestly80.2%
  • Average spread paid17.97%
  • Round-trip cost drag8.70%
  • Data planerig
  • Engine version54e646123378
  • Graded on2026-07-30

The engine’s own notes

  • SPREAD REGIME — real NBBO vs synthetic 5%: option NBBO in options_chains_alpaca is REAL from 2026-06-09 onward (spreads vary, avg ~32%); fills dated BEFORE that priced on a SYNTHETIC flat-5% spread (ask=last*1.025, bid=last*0.975) and are OPTIMISTIC by ~6× on the option leg (the spread paid is understated). This result priced real_spread_share=0.00 of its fills on REAL spreads — i.e. it is MOSTLY pre-2026-06-09 and thus OPTIMISTIC: rank by skip-rate (real fillability) + held-to-exit EV, NOT cost_drag/avg_spread, and for an honest-spread grade restrict the window to 2026-06-09+ (n will be small until more real-NBBO data accumulates). | REAL-NBBO SEAM (WIRED): live OPRA NBBO snapshots (real bid/ask/last) are ingested into vega_option_quotes and the fill path now PREFERS them — buy @ real ask (never mid), no look-ahead (ts <= fill date) — falling back to the modeled real-LAST ± 2.5% spread only when no real quote exists. real_nbbo_fill_share=n/a of this result's fills priced on a REAL measured NBBO; the rest priced on the modeled spread. So avg_spread_pct/cost_drag_pct is a MEASURED spread on the real_nbbo_fill_share portion and a model constant on the remainder — still rank by skip-rate + held-to-exit. | REAL-NBBO EXIT MARKS (WIRED, SEAM #1): the realized-exit mark now also PREFERS a measured same-session NBBO — SELL @ the real bid (never mid, no stale carry, no look-ahead) — falling back to the daily-store sell when none exists. real_nbbo_exit_share=n/a of this result's settles sold on a REAL measured NBBO. 1-Min real-option-bar exit fills (get_option_minute_bars) are wired for the intraday option context; the daily path stays byte-identical.
  • A–H realized-exit metrics (ev_pct/net_ev_pct, win_rate, avg_win/loss, payoff, worst, std, variance_pct2, longest_losing_streak, max_drawdown, gave_it_back, gross/cost_drag) are ALL pinned to the single walk-forward bracket 'none' (best non-TP bracket on the IS half). net_ev_pct == ev_pct by construction; gross is read on this SAME bracket so cost_drag_pct ≥ 0. This is the metrics' own full-sample basis; walk_forward.wf_ev (OOS-slice verdict number) is a separate labeled field and is NOT overwritten.
  • variance_pct2 is std_pct**2 → unit is PERCENT-SQUARED (not a decimal variance). risk_adjusted_ev (ev_pct/std_pct) is unit-consistent.
  • equity_points is the cumulative return-points series on the SAME date-ordered wf-bracket net vector that produces max_drawdown — the chart's underwater band-bottom EQUALS max_drawdown by construction (one basis, not the scorecard's full-sample equity_curve).
  • exit_grid is the single-run bracket sweep; hold-grid and structure-grid are multi-run sweeps triggered separately by the report/UI (not computed here).
  • E1–E7 report analytics (per_symbol, outlier_dependence, mae_mfe, timing, calendar, drawdown_anatomy, ratios) are ALL computed on the walk-forward bracket 'none' net pnl vector / its equity series — the SAME basis as ev_pct/win_rate/max_drawdown, so no number spans a different bracket world. Aggregates are PERCENT; shares/ratios/r-multiples unitless.
  • timing.time_to_peak_days is null: the per-trade PEAK DATE is not retained (only peak_pct magnitude), so entry→peak days is not derivable without a per-bar path timestamp — the hold-days curve is the honest substitute (Fix: not fabricated).
  • ratios.r_multiples null: wf bracket 'none' has no stop → R undefined (R = SL30→30% / SL50→50% stop distance).
  • pnl_correlation null: fewer than 3 overlapping trading dates with the book (or a constant pnl series) — too thin to correlate.
  • fees_drag_pct=0.51: net_ev_pct is AFTER a modeled round-trip fee of $0.65/contract commission + ~$0.02685 ORF/exchange + SEC (env VEGA_FEE_PER_CONTRACT / VEGA_ORF_PER_CONTRACT / VEGA_SEC_RATE). gross → −cost_drag (spread) → −fees_drag → net. Shares pay $0.
  • stop_slippage_pct null: the deployable (walk-forward) bracket is not a stop, so there is no stop to gap through (A2 applies only to SL brackets).
  • skip ledger — 813 signals = 652 fills + 161 skips (no_volume=0, missing_quote=161, cap=0, other=0, error=0). Conservation HOLDS (A5 — no signal vanishes silently).
  • entry-time sensitivity (A6) null: options have no intraday chain quotes to reprice a 10:35 entry — DATA-GATED (same wall as entry_time_match).
  • combo coverage: 652 structures filled of 813 firings; combo_skip_rate_pct=19.8 (could-not-construct: 161 no-quote + 0 no-path), combo_thin_struct_pct=0.0 (0 structures dropped ≥1 thin bar where a leg-you-must-sell had bid<=0; 0 thin leg-bars total). This is the honest fillability of the multi-leg structure on real chains — thin wings / defensive names show here, never papered over.
  • combo cost_drag_pct is EXIT-side-only (the gross/mid path re-marks only the close at `last`, holding the entry basis at the sacred net_entry) — ≈ half the single-leg buy-and-sell spread convention. Combined with the spread-regime caveat above (synthetic flat-5% before REAL_NBBO_FROM, real ~32% NBBO after), combo cost_drag is NOT comparable to single-leg cost_drag, nor a measured spread on the pre-boundary portion — informational only.
  • entry_iv_rank null (C3): backtest chains carry no historical per-contract IV → no entry-day IV percentile on historical fills; live reads carry iv_rank once 60 daily observations accumulate; historical backtests remain null (no IV history). accumulating live-only (count via the live desk).
  • entry_time_match null: needs intraday option quotes to confirm the fill is reachable at the signal's intraday timestamp — DATA-GATED (the Databento item).
  • path-shape flags / spread / gross-vs-net are degenerate for non-option runs (single-point daily path, no bid/ask width).
  • monte_carlo (B1): 1000 sims × 3 methods (order_shuffle / trade_drop w.p.0.1 / slippage_perturb ±50% of the modeled spread), seed=424242 (+1/+2 for the drop/slippage streams). On the date-ordered wf-bracket net vector — the SAME basis as max_drawdown. EV is order-invariant so ev_p50 tracks the point estimate while dd/ruin capture sequencing luck; ruin_prob = P(cum path ever <= -100.0 return points). The pooled EV band here is dominated by the SEQUENCING null (order_shuffle is EV-invariant, so its EV never moves and pins ev_p50 to the point estimate); EV *uncertainty* is the bootstrap CI's job (ev_ci95, B5), NOT this band.
  • ev_ci95 / wr_ci95 (B5): 2000-resample percentile bootstrap (2.5/97.5), seed=271828, on the wf-bracket per-trade vector. PERCENT units. The win-rate CI agrees with the binomial Wald approximation p±1.96·sqrt(p(1-p)/n) to within a few points (percentile-bootstrap vs normal-approx).
  • random_baseline (B3): random_baseline null: underlying-proxy control is defined for single-direction option/equity runs only, not asset_class='combo' (a multi-leg structure has no single directional underlying proxy).
  • benchmark (B6): SPY buy-hold 51.98% over 2024-02-12..2026-05-20 (enter at first-bar OPEN, exit at last-bar CLOSE), risk-free≈0. This is a TOTAL buy-hold return over the whole window; the strategy's ev_pct is a PER-TRADE average — the two are different bases and are shown side by side, not differenced into a single 'alpha'.
  • regime_report (C1): regime_report: per-regime EV/WR on the walk-forward bracket (none) per-trade vector; cells keyed by each trade's OWN-underlying trend×vol regime at entry (backward-looking; no look-ahead). current_regime is the MARKET (SPY) regime as of the last bar — a context stamp on a different basis than the per-trade cells. Trend: close vs sma200 + sma50 slope; vol: 20-day realized-vol trailing-252 percentile (>=0.5 = high). WEAK EVIDENCE — cell(s) ['chop/high', 'chop/low'] have n<20: a single outlier can flip that regime's EV; do not read a thin cell as a real per-regime edge.
  • event_exposure (C2): event_exposure: a trade is 'held_through_event' when an event falls in (entry, exit] — FOMC is market-wide ('*'); earnings are per-symbol. ev_through / ev_clear are PERCENT EV on the walk-forward bracket (none). Calendar carries 24 event(s) (24 FOMC seeded, 0 earnings). Earnings feed NOT yet wired (null-until-data) — the pipeline exists and populates when an earnings source lands; today this measures FOMC exposure only. Small-n caveat: with few through-event trades a single outlier can dominate ev_through — weak evidence until n grows.
  • greeks_exposure (C4): greeks_exposure null: greeks are modeled for single-leg option runs only (asset_class='combo' has no single-contract path). MODELED.
  • concentration (D2): top theme 'internet_media' is 33% of trades (by count). Below the 50% single-theme alarm on both bases — reasonably spread across 4 themes. per-theme pnl_pct is summed return-points.
  • capacity (D3): capacity null: no trade carried a real daily contract volume (652 of 652 fills had no volume) — nothing to size against. A real volume feed (options_chains_alpaca daily_volume / bar volume) is required; never estimated.
  • slippage_stress (E9): net EV re-charged at 1×/2×/3× the modeled round-trip spread (17.97% mean) on the wf-bracket 'none' net vector → -7.9% / -25.9% / -43.8%. If the edge dies by 2×, it lives on optimistic fills. The base spread is itself synthetic before REAL_NBBO_FROM, so 1× is already optimistic on that portion — read 2×/3× as the honest floor.
  • sizing (E10) null: no positive edge to size (wf-bracket EV or the Kelly fraction f* = W − (1−W)/R is non-positive) — honest Kelly refuses to size a losing edge, rather than printing a confident bet.
  • data_quality (E11): DATA-QUALITY 60/100 (Moderate) — a TRANSPARENCY summary, NOT a lie detector or a quality grade. Equal-weight mean of spread_realism/fillability/sample: spread_realism = share of fills on REAL option NBBO (the rest priced on the optimistic synthetic 5% spread); fillability = % of fired signals that filled on real chains; sample = n vs the 80-fill verdict floor. A high score means the numbers are mostly real-measured on a healthy sample; it says nothing about whether the edge is good.
  • rolling_edge (E12): rolling_edge: trailing-60-trade EV, 593 overlapping windows on the date-ordered wf-bracket net vector (the SAME basis as ev_pct). A downward drift late in the series is edge DECAY — the recent trades are earning less than the early ones.
  • beta_spy (E13): beta_spy = 10.705 (r²=0.209, n=652): the OLS slope of each trade's wf-bracket P&L on the SPY move over that trade's OWN holding window (entry→exit close). beta≈1 tracks the market; ~0 is market-neutral; >1 amplifies it. This is NOT a daily mark-to-market beta (options carry no daily marks here) — it measures OUTCOME co-movement over the hold, not path co-movement.
  • This universe is stocks you named, and none are delisted/historical-only. If real-world peers failed or were delisted in this window, they are absent — so results may be optimistic (survivorship bias). You CAN add delisted names (e.g. SIVB, FRC) to test against real failures.
  • DATA-QUALITY 60/100 (Moderate) — a TRANSPARENCY summary, NOT a lie detector or a quality grade. Equal-weight mean of spread_realism/fillability/sample: spread_realism = share of fills on REAL option NBBO (the rest priced on the optimistic synthetic 5% spread); fillability = % of fired signals that filled on real chains; sample = n vs the 80-fill verdict floor. A high score means the numbers are mostly real-measured on a healthy sample; it says nothing about whether the edge is good.
  • promising but unproven — robust sample (652 fills), 1/5 OOS cycles positive, metric -13.6% from the SHADOW_EV (shelf bar).
  • Only 0.0% of fills priced on real NBBO spreads; the rest used a synthetic flat-5% spread (optimistic ~6× on the option leg) — the edge (and this confidence) rides partly on modeled fill costs.
  • SPY buy-hold 51.98% over 2024-02-12..2026-05-20 (enter at first-bar OPEN, exit at last-bar CLOSE), risk-free≈0. This is a TOTAL buy-hold return over the whole window; the strategy's ev_pct is a PER-TRADE average — the two are different bases and are shown side by side, not differenced into a single 'alpha'.

The first 12 of 652 trades

Per-trade result, after the spread both ways
StockSignalExitResultFill priced on
AAPL2024-06-112024-07-03+60.6%a real close ± 2.5%
AVGO2024-06-112024-07-03+103.2%a real close ± 2.5%
CRWD2024-06-112024-07-03−13.7%a real close ± 2.5%
MSFT2024-06-112024-07-03+73.1%a real close ± 2.5%
MU2024-06-112024-07-03−5.2%a real close ± 2.5%
AAPL2024-06-122024-07-05+90.0%a real close ± 2.5%
AVGO2024-06-122024-07-05+139.4%a real close ± 2.5%
CRWD2024-06-122024-07-05−7.5%a real close ± 2.5%
GOOGL2024-06-122024-07-05+75.8%a real close ± 2.5%
MSFT2024-06-122024-07-05+66.2%a real close ± 2.5%
MU2024-06-122024-07-05−77.9%a real close ± 2.5%
NVDA2024-06-122024-07-05−23.4%a real close ± 2.5%

Disclosures

  • Early assignment is not simulated: short option legs are carried to expiry and settled there (in-the-money by at least $0.01 pays its intrinsic value, otherwise it expires worthless). In the real market an American short leg can be exercised against you any day — most often a deep in-the-money short call the day before a dividend, which also leaves the rest of a spread unhedged. Treat a short-leg result as the favourable case on that one point. This strategy has 1: the short call leg.

Simulation for learning. Paper money, real data, not investment advice.

Test another one

  • Buy the dipA strong stock falls hard for a few days. You buy the bounce.
  • Golden crossThe 50-day average crosses up through the 200-day. The oldest signal there is.
  • RSI oversoldRSI drops under 30 — the textbook says the selling is overdone.
  • Buy new highsA leader pushes to a fresh 52-week high. You buy strength, not weakness.
  • Fade the gap upIt jumps 3% higher at the open on hype. You bet the pop fades.
  • Covered callOwn the stock on a dip and sell a call against it to collect premium.

Or see all seven, learn the craft in the lessons, or write your own rule in the builder.