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.
| delta_band | implied_pct | call_itm_pct | put_itm_pct | contract_count |
|---|---|---|---|---|
| 5 to 10 | 7.2 | 8.6 | 2.9 | 7543 |
| 10 to 15 | 12.4 | 16.2 | 6.6 | 4865 |
| 15 to 20 | 17.4 | 21.4 | 9.5 | 3824 |
| 20 to 25 | 22.5 | 29.3 | 14.1 | 3249 |
| 25 to 30 | 27.5 | 34.9 | 17.5 | 2863 |
| 30 to 35 | 32.5 | 37.7 | 22.3 | 2685 |
| 35 to 40 | 37.5 | 45.2 | 27.4 | 2531 |
| 40 to 45 | 42.5 | 50.1 | 31.7 | 2444 |
| 45 to 50 | 47.5 | 54.6 | 37.1 | 2385 |
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 bandRead 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.
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.
| snapshot | implied_pct | call_itm_pct | put_itm_pct | contract_count |
|---|---|---|---|---|
| 30 days out | 19.7 | 25 | 11.6 | 7075 |
| 14 days out | 19.7 | 25.9 | 10.8 | 12822 |
| 7 days out | 19.7 | 24.4 | 12.9 | 9970 |
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 DESCAt 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.
| iv_band | implied_pct | call_itm_pct | put_itm_pct | contract_count |
|---|---|---|---|---|
| 10% to 20% | 19.5 | 26.3 | 9.2 | 5342 |
| 20% to 30% | 18.3 | 23.1 | 11.3 | 4735 |
| 30% to 40% | 18.2 | 21.8 | 10.9 | 1730 |
| 40% to 50% | 18.6 | 24.4 | 17.1 | 1309 |
| 50% to 60% | 18.7 | 11 | 9.2 | 813 |
| 60% to 70% | 18.9 | 51.2 | 15.1 | 435 |
| 70% to 80% | 18.8 | 4.5 | 10 | 137 |
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_floorIn 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.