Strasmore Research
Deep Dives Matt ConnorBy Matt Connor

How to Pick an Option Strike Price by Delta

How to pick an option strike price: what each delta band actually pays, and how often delta matched the realized share of contracts that finished ITM.

Picking an option strike price is a single trade-off: strikes near the current share price collect more premium and finish in the money more often, while strikes far out collect little and usually expire worthless. The shortcut nearly every guide reaches for is delta, the number printed beside each strike in the chain, described as the probability that the option expires in the money. The panels below measure that shortcut against the recorded outcome of every expired contract on eight liquid underlyings since January 2024, and mark the places where it stops being good enough to plan with.

What picking an option strike price actually decides

On a short call the strike is the price you have agreed to sell at. On a short put it is the price you have agreed to buy at. The strike decides which closing prices leave you holding stock instead of cash.

Every strike on the board sits somewhere on one curve, running from pays well and gets assigned often at the near end to pays almost nothing and is almost never assigned at the far end. The market sets each premium against the chance of that strike being crossed. Picking a strike is picking a coordinate on that curve, and delta is how traders name the coordinate. This page assumes the mechanics are familiar; if they are not, what option delta measures and how to read an option chain cover them first.

Is delta the probability of expiring in the money?

Delta is not defined as a probability. For a plain vanilla contract it sits near the risk neutral chance of finishing in the money, and the distance between sits near and is equal to is the whole question.

The panel takes every contract on AAPL, MSFT, NVDA, AMZN, SPY, KO, JPM and XOM that traded with a priced delta about 30 days before expiration, sorts it into bands five delta points wide, then looks up where the underlying closed on the expiration date. Puts are bucketed by absolute delta.

QueryDelta band versus the share of contracts that finished in the money, 30 days out
delta_bandimplied_pctcall_itm_pctput_itm_pctcontract_count
5 to 107.28.62.97543
10 to 1512.416.26.64865
15 to 2017.421.49.53824
20 to 2522.529.314.13249
25 to 3027.534.917.52863
30 to 3532.537.722.32685
35 to 4037.545.227.42531
40 to 4542.550.131.72444
45 to 5047.554.637.12385
The exact SQL behind every number
WITH
px AS
(
    SELECT
        underlying_symbol     AS sym,
        toDate(date)          AS d,
        any(underlying_close) AS close_at_expiry
    FROM global_markets.options_greeks
    WHERE date >= '2024-01-01'
      AND date <  '2026-09-01'
      AND underlying_close > 0
      AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'SPY', 'KO', 'JPM', 'XOM')
    GROUP BY sym, d
),
snaps AS
(
    SELECT
        ticker                                                AS contract,
        any(underlying_symbol)                                AS sym,
        any(if(upper(substring(toString(option_type), 1, 1)) = 'C', 'call', 'put')) AS opt,
        any(strike_price)                                     AS strike,
        toDate(any(expiration_date))                          AS expiry,
        argMin(abs(delta), abs(toInt32(days_to_expiry) - 30)) AS abs_delta
    FROM global_markets.options_greeks
    WHERE date >= '2024-01-01'
      AND date <  '2026-09-01'
      AND days_to_expiry BETWEEN 27 AND 33
      AND delta != 0
      AND volume > 0
      AND toDate(expiration_date) < '2026-09-01'
      AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'SPY', 'KO', 'JPM', 'XOM')
    GROUP BY contract
    HAVING abs_delta >= 0.05 AND abs_delta < 0.50
),
banded AS
(
    SELECT
        toUInt16(floor(s.abs_delta * 20)) AS band,
        s.abs_delta                       AS abs_delta,
        s.opt                             AS opt,
        if(s.opt = 'call',
           p.close_at_expiry > s.strike,
           p.close_at_expiry < s.strike)  AS finished_itm
    FROM snaps AS s
    INNER JOIN px AS p ON p.sym = s.sym AND p.d = s.expiry
)
SELECT
    concat(toString(band * 5), ' to ', toString(band * 5 + 5))                    AS delta_band,
    round(100 * avg(abs_delta), 1)                                                AS implied_pct,
    round(100 * countIf(finished_itm AND opt = 'call') / countIf(opt = 'call'), 1) AS call_itm_pct,
    round(100 * countIf(finished_itm AND opt = 'put') / countIf(opt = 'put'), 1)   AS put_itm_pct,
    count()                                                                       AS contract_count
FROM banded
GROUP BY band
HAVING countIf(opt = 'call') > 0 AND countIf(opt = 'put') > 0
ORDER BY band
Run this yourself

Read the implied line against the two realized lines. In the 5 to 10 delta band the model implied 7.2%, calls finished in the money 8.6% of the time, and puts 2.9%. At the near the money end, the 45 to 50 band implied 47.5% against a realized 54.6% for calls and 37.1% for puts, over 2385 expired contracts in that band alone.

Two readings come out of the shape. As a ranking, delta works: the realized share climbs across the bands alongside the implied line, so a 10 delta strike was crossed far less often than a 40 delta strike. As a level it is looser, and the call and put lines do not lie on top of each other. A 20 delta call and a 20 delta put are symmetric in the model and were not symmetric in the result.

What a lower delta costs in premium

The other half of the trade-off is money. The next panel prices each band as a percentage of the share price at the same 30 days to expiration, which puts contracts on a $40 stock and a $600 stock on one axis. It reports the median rather than the average, keeping a few event priced contracts from dragging a whole band.

QueryMedian premium collected per delta band, as a percent of the share price
delta_bandcall_premium_pctput_premium_pctcontract_count
5 to 100.210.267543
10 to 150.380.454875
15 to 200.570.643829
20 to 250.780.893248
25 to 300.981.122865
30 to 351.251.42688
35 to 401.491.72531
40 to 451.842.052447
45 to 502.132.432394
The exact SQL behind every number
WITH
snaps AS
(
    SELECT
        ticker                                                AS contract,
        any(if(upper(substring(toString(option_type), 1, 1)) = 'C', 'call', 'put')) AS opt,
        argMin(abs(delta), abs(toInt32(days_to_expiry) - 30)) AS abs_delta,
        argMin(100 * toFloat64(option_close) / toFloat64(underlying_close),
               abs(toInt32(days_to_expiry) - 30))             AS premium_pct
    FROM global_markets.options_greeks
    WHERE date >= '2024-01-01'
      AND date <  '2026-09-01'
      AND days_to_expiry BETWEEN 27 AND 33
      AND delta != 0
      AND volume > 0
      AND option_close > 0
      AND underlying_close > 0
      AND toDate(expiration_date) < '2026-09-01'
      AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'SPY', 'KO', 'JPM', 'XOM')
    GROUP BY contract
    HAVING abs_delta >= 0.05 AND abs_delta < 0.50
),
banded AS
(
    SELECT
        toUInt16(floor(abs_delta * 20)) AS band,
        contract,
        opt,
        premium_pct
    FROM snaps
)
SELECT
    concat(toString(band * 5), ' to ', toString(band * 5 + 5))                              AS delta_band,
    round(quantileDeterministicIf(0.5)(premium_pct, cityHash64(contract), opt = 'call'), 2) AS call_premium_pct,
    round(quantileDeterministicIf(0.5)(premium_pct, cityHash64(contract), opt = 'put'), 2)  AS put_premium_pct,
    count()                                                                                 AS contract_count
FROM banded
GROUP BY band
HAVING countIf(opt = 'call') > 0 AND countIf(opt = 'put') > 0
ORDER BY band
Run this yourself

The premium curve is far steeper than the probability curve. Stepping from the 45 to 50 delta band down to 5 to 10 takes the median call from 2.13% of the share price to 0.21%. The put side runs from 2.43% to 0.26% across the same span. Most of the premium on the board sits in the bands nearest the money, which are also the bands that get assigned.

Does delta still work close to expiration?

Strike choice gets hardest in the last two weeks, where the greeks move fastest. The next panel holds the band fixed at 15 to 25 delta and re-runs the same test at three horizons: about 30 days out, about 14, and about 7. Each horizon uses the contracts that sat in the band at that horizon, which is not one set of contracts followed forward.

QueryThe 15 to 25 delta band at three horizons: implied versus realized in the money share
snapshotimplied_pctcall_itm_pctput_itm_pctcontract_count
30 days out19.72511.67075
14 days out19.725.910.812822
7 days out19.724.412.99970
The exact SQL behind every number
WITH
px AS
(
    SELECT
        underlying_symbol     AS sym,
        toDate(date)          AS d,
        any(underlying_close) AS close_at_expiry
    FROM global_markets.options_greeks
    WHERE date >= '2024-01-01'
      AND date <  '2026-09-01'
      AND underlying_close > 0
      AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'SPY', 'KO', 'JPM', 'XOM')
    GROUP BY sym, d
),
obs AS
(
    SELECT
        ticker                  AS contract,
        underlying_symbol       AS sym,
        if(upper(substring(toString(option_type), 1, 1)) = 'C', 'call', 'put') AS opt,
        strike_price            AS strike,
        toDate(expiration_date) AS expiry,
        abs(delta)              AS abs_delta,
        toInt32(days_to_expiry) AS dte,
        multiIf(days_to_expiry BETWEEN 27 AND 33, 30,
                days_to_expiry BETWEEN 12 AND 16, 14,
                7)              AS horizon
    FROM global_markets.options_greeks
    WHERE date >= '2024-01-01'
      AND date <  '2026-09-01'
      AND delta != 0
      AND volume > 0
      AND toDate(expiration_date) < '2026-09-01'
      AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'SPY', 'KO', 'JPM', 'XOM')
      AND (days_to_expiry BETWEEN 5 AND 9
           OR days_to_expiry BETWEEN 12 AND 16
           OR days_to_expiry BETWEEN 27 AND 33)
),
snaps AS
(
    SELECT
        contract,
        horizon,
        any(sym)                              AS sym,
        any(opt)                              AS opt,
        any(strike)                           AS strike,
        any(expiry)                           AS expiry,
        argMin(abs_delta, abs(dte - horizon)) AS abs_delta
    FROM obs
    GROUP BY contract, horizon
    HAVING abs_delta >= 0.15 AND abs_delta < 0.25
),
joined AS
(
    SELECT
        s.horizon   AS horizon,
        s.opt       AS opt,
        s.abs_delta AS abs_delta,
        if(s.opt = 'call',
           p.close_at_expiry > s.strike,
           p.close_at_expiry < s.strike) AS finished_itm
    FROM snaps AS s
    INNER JOIN px AS p ON p.sym = s.sym AND p.d = s.expiry
)
SELECT
    concat(toString(horizon), ' days out')                                        AS snapshot,
    round(100 * avg(abs_delta), 1)                                                AS implied_pct,
    round(100 * countIf(finished_itm AND opt = 'call') / countIf(opt = 'call'), 1) AS call_itm_pct,
    round(100 * countIf(finished_itm AND opt = 'put') / countIf(opt = 'put'), 1)   AS put_itm_pct,
    count()                                                                       AS contract_count
FROM joined
GROUP BY horizon
HAVING countIf(opt = 'call') > 0 AND countIf(opt = 'put') > 0
ORDER BY horizon DESC
Run this yourself

At 30 days out the band implied 19.7% and realized 25% on calls with 11.6% on puts. At 7 days out, against an implied 19.7%, the realized shares measured 24.4% and 12.9%. A 20 delta strike a week from expiry and a 20 delta strike a month out are not the same decision, even though the chain prints the same number for both. For a fixed delta the short dated strike sits closer to the money in dollars, and one large session can cover that distance.

Does it hold on high volatility names?

Implied volatility sets the width of the distribution the model prices, so it is the obvious place to look for the proxy coming apart. The last panel groups the same 30 day snapshots by each contract's own implied volatility in ten point bands, with delta held between 10 and 30.

QueryImplied versus realized in the money share by the contract's own implied volatility
iv_bandimplied_pctcall_itm_pctput_itm_pctcontract_count
10% to 20%19.526.39.25342
20% to 30%18.323.111.34735
30% to 40%18.221.810.91730
40% to 50%18.624.417.11309
50% to 60%18.7119.2813
60% to 70%18.951.215.1435
70% to 80%18.84.510137
The exact SQL behind every number
WITH
px AS
(
    SELECT
        underlying_symbol     AS sym,
        toDate(date)          AS d,
        any(underlying_close) AS close_at_expiry
    FROM global_markets.options_greeks
    WHERE date >= '2024-01-01'
      AND date <  '2026-09-01'
      AND underlying_close > 0
      AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'SPY', 'KO', 'JPM', 'XOM')
    GROUP BY sym, d
),
snaps AS
(
    SELECT
        ticker                                                          AS contract,
        any(underlying_symbol)                                          AS sym,
        any(if(upper(substring(toString(option_type), 1, 1)) = 'C', 'call', 'put')) AS opt,
        any(strike_price)                                               AS strike,
        toDate(any(expiration_date))                                    AS expiry,
        argMin(abs(delta), abs(toInt32(days_to_expiry) - 30))           AS abs_delta,
        argMin(implied_volatility, abs(toInt32(days_to_expiry) - 30))   AS iv
    FROM global_markets.options_greeks
    WHERE date >= '2024-01-01'
      AND date <  '2026-09-01'
      AND days_to_expiry BETWEEN 27 AND 33
      AND delta != 0
      AND volume > 0
      AND toDate(expiration_date) < '2026-09-01'
      AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'SPY', 'KO', 'JPM', 'XOM')
    GROUP BY contract
    HAVING abs_delta >= 0.10 AND abs_delta < 0.30
       AND iv >= 0.10 AND iv < 1.00
),
banded AS
(
    SELECT
        toUInt16(floor(s.iv * 10)) * 10 AS iv_floor,
        s.abs_delta                     AS abs_delta,
        s.opt                           AS opt,
        if(s.opt = 'call',
           p.close_at_expiry > s.strike,
           p.close_at_expiry < s.strike) AS finished_itm
    FROM snaps AS s
    INNER JOIN px AS p ON p.sym = s.sym AND p.d = s.expiry
)
SELECT
    concat(toString(iv_floor), '% to ', toString(iv_floor + 10), '%')             AS iv_band,
    round(100 * avg(abs_delta), 1)                                                AS implied_pct,
    round(100 * countIf(finished_itm AND opt = 'call') / countIf(opt = 'call'), 1) AS call_itm_pct,
    round(100 * countIf(finished_itm AND opt = 'put') / countIf(opt = 'put'), 1)   AS put_itm_pct,
    count()                                                                       AS contract_count
FROM banded
GROUP BY iv_floor
HAVING countIf(opt = 'call') > 20 AND countIf(opt = 'put') > 20
ORDER BY iv_floor
Run this yourself

In the 10% to 20% volatility band, an implied 19.5% met a realized 26.3% on calls and 9.2% on puts. In the 70% to 80% band, an implied 18.8% met 4.5% and 10%. Take the pattern as a caution rather than a correction factor: a 20 delta strike on a quiet name and a 20 delta strike on a fast one carry the same model number over very different dollar distances, and they did not land at the same rate here.

Three strike decisions and the band each implies

A covered call above your cost basis

The constraint here is the basis. Holding 100 shares bought at a known price, any strike above that price plus the premium turns assignment into a sale at a gain, and the choice is how much premium to trade for the chance of losing the shares. Holders who want to keep the stock work the low delta end, where the premium panel shows the smallest figures on the page. Holders content to sell at the strike work nearer the 30 to 40 delta band, where the same panel pays a multiple of that and the realized assignment share rises to match. A strike below basis is a different decision, since assignment there locks a loss on the shares that the premium only partly offsets. The covered call versus cash secured put comparison sets the two payoffs side by side.

A cash secured put you would be happy to own

When assignment is the outcome you want, the ranking inverts. A higher delta put sits closer to the money, pays more, is assigned more often, and lowers the effective purchase price of the shares. When assignment is the outcome to avoid, the low delta end applies, with one caveat to price in: the chance of the strike being touched at some point before expiration runs well above the chance of finishing in the money, roughly double under the textbook approximation. Probability of touch versus probability of ITM separates the two, and that gap is why a 15 delta put can feel far closer during its life than the number suggests.

How wide to set a debit spread

A spread splits strike choice in two. The long strike sets the cost and the delta you own; the distance to the short strike caps the payoff. The usual anchor for that distance is the expected move over the life of the contract, which implied volatility gives directly, as expected move from implied volatility shows. A width set inside the expected move needs only a move the market already prices as ordinary. A width beyond it needs more than that, and prices cheaply for the same reason. Credit spread versus debit spread covers which side of that structure collects the premium.

How these numbers were measured

The in the money test reads the underlying close on the expiration date from the same daily options record that supplied the delta, so strike and settlement price share one convention. Every snapshot row required traded volume above zero and a priced, nonzero delta that day. Delta bands are labelled in whole delta points, where 15 to 20 covers 0.15 up to 0.20 in absolute value. Outcomes are measured at expiration only; early exercise on an American style contract is not counted. Expirations that landed on a non trading day drop out of the join. The window runs from January 2024 through August 2026, with every expiration in it resolved.

FAQ

Is delta the same as the probability of expiring in the money?

No. Delta measures price sensitivity to a one dollar move in the underlying and sits near the risk neutral chance of finishing in the money, which makes it an estimate rather than a fact. In the 45 to 50 delta band, contracts implied 47.5% while calls realized 54.6% and puts 37.1%.

What delta do covered call sellers usually pick?

There is no single answer, and the band follows the goal. Sellers who want to keep the shares tend to work 10 to 20 delta calls for a small premium, and sellers happy to be assigned tend to work 30 to 40 delta for several times that. The premium panel above measures the size of the gap between those two choices.

Which option strike price has the most premium?

The strike nearest the current share price. Premium per contract declines steeply as the strike moves away from the money, as the median figures in the premium panel show.

Does the same delta mean the same thing at every expiration?

No. The panels above re-run one band at about 30, 14 and 7 days to expiration, and the realized in the money share was not constant across them. For a fixed delta a shorter dated strike sits closer to the money in dollars, which shortens the distance a single session has to cover.


Every panel here ships with the SQL that produced it, so you can expand one and see exactly which contracts were counted. To run the same delta bands on a ticker you follow, ask for it in plain English on the Strasmore terminal.

#options#delta#strike selection#probability#implied volatility