Methodology
Everything below is what the product actually computes — no hidden factors, no discretionary overrides. The same formulas are covered by pinned unit tests in the codebase.
Universe & data
S&P 500 constituents plus a small ETF whitelist — 500+ tickers. Each trading morning (8:45 ET) we take a pre-market snapshot of full option chains from licensed data vendors. Public pages always show this delayed snapshot; nothing here is real-time.
Cleaning filters (before anything is scored)
Bid ≥ $0.05 · bid–ask spread ≤ 15% of mid · open interest ≥ 100 or day volume ≥ 20 · 7 ≤ DTE ≤ selected horizon. Contracts failing any test are dropped, not repaired. Contracts with earnings inside the expiry window are excluded from the daily board by default — earnings IV is the single biggest risk to a put seller, and we refuse to rank it as "yield".
Yields — two honest denominators
Margin yield = premium ÷ Reg-T initial margin × 365/DTE,
where margin = max(20%·spot − OTM amount, 10%·strike)×100 + premium. Capital-efficiency
view; brokers may require more (≈3× for leveraged ETFs).
CSP yield = premium ÷ (strike×100 − premium) × 365/DTE. The conservative
cash-secured view — the number we headline on public pages.
Assignment probability
Implied volatility is solved from the bid/ask mid (Brent's method), then risk-neutral N(−d2) with T = DTE/365, r = 4%, q = 0.8%. It is a model probability under lognormal assumptions — read it as an order of magnitude, especially on leveraged ETFs.
The score
Score = 1000 × cross-sectional percentile of (annualized yield × price gap ÷ assignment probabilityγ). One symbol keeps only its best contract on the board, so a single high-IV name cannot flood the list. The exponent γ is being calibrated against our own settled results — we store two variants per pick and let realized P&L decide.
The ledger
Each day's board is serialized in canonical field order and hashed with SHA-256 at publication; storage is append-only. At expiry every contract is settled against the expiry-day close: P&L = premium − max(strike − settle, 0)×100. Results are published on the track record page, losses included.
All analytics are informational only and do not constitute investment advice.