Methodology
OptionIncomeTools uses standard Black-Scholes-Merton option pricing with the Abramowitz-Stegun normal CDF approximation. Probability of profit calculations use 5000-sample Monte Carlo simulation. Quote data is refreshed every 5 minutes via Polygon.io (delayed 15 minutes during market hours on the current data plan). All formulas — annualized yield, ROC, downside cushion, assignment risk score, wheel score, liquidity score — are documented on this page.
The exact formulas, data sources, scoring weights, and limitations behind every calculator, screener, and score on this site. This page is updated whenever methodology changes.
Most options-income websites hide their math behind a brand name. We don't. Below is the complete and current methodology for OptionIncomeTools. If you spot an error or have suggestions, email hello@optionincometools.com.
1. Data sources
Three refresh layers — do not conflate:
- Provider delay: Polygon.io Options Starter delivers quotes with an approximate 15-minute delay during US market hours. This is set by the data-provider licence; nothing we do at the application layer changes it.
- Server cache TTL: the Cloudflare Worker caches upstream responses in KV with per-endpoint TTLs of 30–60 seconds for chains and equity quotes, up to 24 hours for reference data (dividends, contract metadata). On upstream failure we serve the last-known-good value from a 30-day KV slot.
- Browser/UI refresh: individual pages request a new snapshot every 5 minutes during market hours. Some real-time-flavoured pages (ticker tape, opportunities cards) poll more frequently.
Example wording used across the site: “Polygon quotes are approximately 15 minutes delayed. The server cache refreshes every 30–60 seconds; this page requests a new snapshot every 5 minutes.”
| Data point | Primary source | Fallback | Provider delay | Server cache TTL |
|---|---|---|---|---|
| Option chains (strikes, bids, asks, last, IV, Greeks, OI, volume) | Polygon.io Options Starter | Tradier (BYO key) | ~15 min | 30–60 sec |
| Equity quote (spot price) | Polygon snapshot | Put-call parity from chain | ~15 min | 30 sec |
| Day-over-day change / prev close | Stooq CSV | — | End-of-day | End-of-day |
| Dividend schedule (ex-date, amount, frequency) | Polygon /v3/reference/dividends | — | End-of-day | 24 hr |
| Earnings calendar | Polygon | — | End-of-day | 24 hr |
2. Option pricing — Black-Scholes-Merton
All theoretical option values use the standard closed-form Black-Scholes-Merton model with a continuous-dividend yield. For a European call:
For a European put:
where:
d2 = d1 − σ · √T
- S = spot price · K = strike · T = time to expiration in years (days/365)
- r = risk-free rate (currently 4.5%, sourced from 3-month T-bill yield; configurable per Worker)
- q = continuous-dividend yield (annualized from upcoming declared dividends; 0 if no dividend)
- σ = implied volatility (sourced from Polygon's chain field; we do NOT recompute it on the client)
- N(·) = standard normal CDF, implemented via Abramowitz-Stegun rational approximation (max error < 1e-7)
Limitation: Black-Scholes-Merton is a European-style model. It does not value the early-exercise right embedded in American equity options. Because early exercise is an additional right (never a liability), an American option cannot be worth less than its European equivalent. The BSM formula therefore understates American-option value whenever early exercise is economically relevant — most notably for puts (deep ITM, high interest-rate environment) and for calls on dividend-paying stocks near ex-dividend dates. For income-selling strategies (CC, CSP), this approximation is acceptable because we care about expected value, not exercise-time alpha; but headline theoretical prices may sit below fair value in those specific regimes.
3. Greeks
Closed-form Greek derivatives, with the same r and q assumptions:
| Greek | Call | Put |
|---|---|---|
| Delta | exp(-q·T) · N(d1) | exp(-q·T) · (N(d1) − 1) |
| Gamma | exp(-q·T) · φ(d1) / (S · σ · √T) | same as call |
| Theta (per year) | −S · exp(-q·T) · φ(d1) · σ / (2√T) − r · K · exp(-r·T) · N(d2) + q · S · exp(-q·T) · N(d1) | −S · exp(-q·T) · φ(d1) · σ / (2√T) + r · K · exp(-r·T) · N(-d2) − q · S · exp(-q·T) · N(-d1) |
| Vega (per 1% IV change) | 0.01 · S · exp(-q·T) · φ(d1) · √T | same as call |
| Rho (per 1% rate change) | 0.01 · K · T · exp(-r·T) · N(d2) | −0.01 · K · T · exp(-r·T) · N(-d2) |
φ(·) is the standard normal PDF. Theta is reported per calendar day (divided by 365) in the Greeks calculator UI to match trader convention.
4. Annualized yield (covered calls, CSPs)
For a single-cycle annualized yield used everywhere on the site:
Where:
- premium = mid quote (or last if no quote), per contract × 100 shares
- collateral = strike × 100 for CSPs, or cost basis × 100 for CCs
- DTE = days to expiration
Honest caveat: annualized yield assumes you successfully repeat the cycle without ever getting assigned at a bad price or hit by an adverse IV move. Real-world net yields typically run 40-70% of the displayed annualized number after IV crush, assignment frequency, and gap moves. We display the cycle-arithmetic number because it's the industry convention; we don't claim it represents realized return.
5. Downside cushion
For a covered call:
For a cash-secured put:
Cushion represents how far the underlying can drop before the position turns negative — a simple proxy for downside risk before assignment.
6. Wheel Score (0-100 composite)
Used in the Wheel Strategy Screener to rank candidates:
- yield_norm = min(1, combined_yield / 1.5) — caps at 150% APY contribution
- liquidity_norm = liquidity_score / 100 (see #7)
- delta_quality = max(0, 1 − |delta_avg − 0.27| · 2) — peaks at 0.27 average delta
- iv_regime = max(0, 1 − max(0, iv − 0.80) / 0.5) — penalizes IV above 80%
Higher is better. We don't claim this is a backtested edge — it's a heuristic for surfacing candidates that combine income with manageable risk.
7. Risk Score (0-100, higher = riskier)
- cap_penalty = +10 for mid-cap, +20 for small-cap, 0 for large+/mega
- sector_penalty = +5 for Energy, Financial, Crypto-correlated
8. Liquidity Score (0-100)
This compresses raw volume + OI onto a log scale: 10K combined ≈ 50, 100K ≈ 75, 1M ≈ 100. Used to rank candidates and to surface "thin liquidity" warnings.
9. Income Goal Planner allocation
The planner solves a simple greedy allocation:
- Run the wheel screen at the user-selected risk band's filters (delta, DTE, market-cap, max price).
- For each candidate (in wheel-score order), allocate up to 20% of total capital (diversification cap).
- Stop when either expected monthly income reaches 120% of target, or 95% of capital is deployed.
- Compute expected monthly premium as (csp_premium + cc_premium) × 100 × contracts × (365 / cycle_DTE) / 12.
Probability of hitting target is a rough heuristic: (expected/target) · (1 − avg_delta·0.4) + diversification_bonus. It's not a Monte Carlo simulation.
10. Current Screened Setups ranking
The Current Screened Setups dashboard runs a parallel screen across the Core 54 universe (see universe table below) every ~5 minutes, picks the top single CC and top single CSP per ticker within the delta band, and ranks by annualized screen yield. The KV cache layer is described in the data sources section.
10a. Ticker universes across the site
Different modules scan different universes for different reasons: liquidity thresholds, sector coverage, options-chain depth, and Polygon API budget all vary. This is the canonical mapping — generated from /data/universe-registry.json. If a page anywhere on the site quotes a ticker count that disagrees with this table, that's a bug and should be reported.
| Module | Universe | Size | Review cadence | As of |
|---|---|---|---|---|
| Current Screened Setups | Core 54 | 54 | Quarterly | 2026-07-16 |
| Wheel Screener | Core 54 | 54 | Quarterly | 2026-07-16 |
| CSP Discovery Leaderboard | CSP Discovery | ~200 | Monthly | 2026-07-01 |
| LEAPS Opportunity Finder | Default: S&P 500 top-200 ∪ Nasdaq-100 (also supports NDX-100, DJIA, sector focus, custom) | 246 | Annual index reconstitution | 2026-07-15 |
| Technical Analysis Scanner | Nasdaq-100 or S&P 500 (user-selectable) | 100 / 500 | Annual index reconstitution | 2026-07-15 |
| Iron Condor / Butterfly Sweepers | Sweeper Broad (index ETFs + sector ETFs + international + bond + commodity + income) | ~200 | Quarterly | 2026-07-16 |
| Nasdaq-100 Double Calendar | Nasdaq-100 | 100 | Annual (NDX rebalance) | 2026-07-15 |
| Forward-Factor Universe | Earnings-rich Top 100 | 100 | Quarterly (earnings-cycle) | 2026-07-15 |
| Custom Multi-Strategy Screener | Custom Screener Full Universe | ~470 | Quarterly | 2026-07-15 |
| Earnings Volatility Screener | Dynamic — upcoming reporters with valid options chains in the target DTE window | varies | Daily | live |
Full machine-readable list including the exact ticker symbols per universe: /data/universe-registry.json.
11. Methodology changelog
- 2026-06-10 — Methodology page published. Added Wheel Score and Risk Score weights. Documented stale-while-revalidate caching layer.
- 2026-05-30 — Switched day-over-day change source from Yahoo to Stooq for Cloudflare egress compatibility.
12. Known limitations
Important things this site does NOT do:
- We do not model early-exercise risk for American options (we use European Black-Scholes).
- We do not Monte Carlo-simulate return distributions. All yield numbers are deterministic single-cycle math.
- We do not adjust for slippage, broker commissions, or assignment fees.
- We do not have access to historical IV — IV-rank computations are approximated from current IV only.
- The Polygon Options Starter plan provides 15-minute delayed quotes during market hours; live trading decisions should always be verified against your broker's order book.
13. Questions or corrections
If you spot a formula error or want to suggest a methodology improvement: hello@optionincometools.com. Substantive corrections are credited in the changelog.