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:

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 pointPrimary sourceFallbackProvider delayServer cache TTL
Option chains (strikes, bids, asks, last, IV, Greeks, OI, volume)Polygon.io Options StarterTradier (BYO key)~15 min30–60 sec
Equity quote (spot price)Polygon snapshotPut-call parity from chain~15 min30 sec
Day-over-day change / prev closeStooq CSVEnd-of-dayEnd-of-day
Dividend schedule (ex-date, amount, frequency)Polygon /v3/reference/dividendsEnd-of-day24 hr
Earnings calendarPolygonEnd-of-day24 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:

C = S · exp(-q·T) · N(d1) − K · exp(-r·T) · N(d2)

For a European put:

P = K · exp(-r·T) · N(-d2) − S · exp(-q·T) · N(-d1)

where:

d1 = ( ln(S/K) + (r − q + σ²/2)·T ) / (σ · √T)
d2 = d1 − σ · √T

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:

GreekCallPut
Deltaexp(-q·T) · N(d1)exp(-q·T) · (N(d1) − 1)
Gammaexp(-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) · √Tsame 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:

Annual yield = (premium / collateral) · (365 / DTE)

Where:

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:

Cushion = (spot − breakeven) / spot, where breakeven = cost basis − premium

For a cash-secured put:

Cushion = (spot − strike + premium) / spot

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:

wheelScore = 0.40 · yield_norm + 0.25 · liquidity_norm + 0.20 · delta_quality + 0.15 · iv_regime

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)

riskScore = min(50, iv·60) + min(25, |delta_avg − 0.20|·80) + cap_penalty + sector_penalty

8. Liquidity Score (0-100)

liquidity = min(100, round( log10(1 + volume + open_interest) / 6 · 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:

  1. Run the wheel screen at the user-selected risk band's filters (delta, DTE, market-cap, max price).
  2. For each candidate (in wheel-score order), allocate up to 20% of total capital (diversification cap).
  3. Stop when either expected monthly income reaches 120% of target, or 95% of capital is deployed.
  4. 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

12. Known limitations

Important things this site does NOT do:

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.

Related