Covered Calls on AAPL: A Worked Example
Covered calls on AAPL, worked end to end with real option data: premium, static return, return if called, breakeven, and how often the call finished ITM.
Covered calls on AAPL are a two part position: 100 shares of Apple held outright, and one call option sold against those shares. The premium is cash the writer keeps whatever happens next. The strike is the price at which the shares can be taken away. Everything else is arithmetic on those two numbers, and the arithmetic below runs on real per contract option prices.
This post writes one contract against 100 shares at roughly 0.30 delta and roughly 30 days out, reports the premium, the static return, the return if called and the breakeven, then repeats that write on the first session of every month in the options record. For the mechanics, start with how covered calls work. For the formulas, see how to calculate covered call returns.
How much do covered calls on AAPL pay?
Delta measures how much an option's price moves for a one dollar move in the shares, running from 0 to 1 on a call, and traders read it as a rough stand in for the chance the option finishes above the strike. A 0.30 delta call is the common income choice: far enough out of the money that most expiries pass quietly, close enough to pay something worth collecting.
The panel picks the listed expiry closest to 30 days out on the most recent Apple chain and walks six delta targets across it, with the covered call math applied to each real contract.
| delta_target | strike | call_delta | premium | premium_per_contract | static_return_pct | if_called_pct | breakeven | days_to_expiry | as_of |
|---|---|---|---|---|---|---|---|---|---|
| 0.15 | 360 | 0.141 | 1.53 | 153 | 0.46 | 8.37 | 332.07 | 28 | October 2, 2026 |
| 0.20 | 355 | 0.196 | 2.33 | 233 | 0.7 | 7.11 | 331.27 | 28 | October 2, 2026 |
| 0.25 | 350 | 0.264 | 3.48 | 348 | 1.04 | 5.96 | 330.12 | 28 | October 2, 2026 |
| 0.30 | 350 | 0.264 | 3.48 | 348 | 1.04 | 5.96 | 330.12 | 28 | October 2, 2026 |
| 0.35 | 345 | 0.336 | 4.79 | 479 | 1.44 | 4.85 | 328.81 | 28 | October 2, 2026 |
| 0.40 | 340 | 0.424 | 6.95 | 695 | 2.08 | 4 | 326.65 | 28 | October 2, 2026 |
The exact SQL behind every number
WITH
(
SELECT max(date)
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND lower(toString(option_type)) IN ('call', 'c')
AND toFloat64(option_close) > 0
) AS snap_date,
(
SELECT argMin(expiration_date, abs(toInt32(days_to_expiry) - 30))
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND lower(toString(option_type)) IN ('call', 'c')
AND toFloat64(option_close) > 0
AND date = snap_date
AND toInt32(days_to_expiry) BETWEEN 21 AND 45
) AS write_expiry
SELECT
delta_target,
toString(round(argMin(strike_usd, gap), 1)) AS strike,
round(argMin(delta_measured, gap), 3) AS call_delta,
round(argMin(premium_usd, gap), 2) AS premium,
toString(round(argMin(premium_usd, gap) * 100, 0)) AS premium_per_contract,
round(argMin(static_pct, gap), 2) AS static_return_pct,
round(argMin(called_pct, gap), 2) AS if_called_pct,
toString(round(argMin(breakeven_usd, gap), 2)) AS breakeven,
toString(argMin(dte, gap)) AS days_to_expiry,
argMin(as_of, gap) AS as_of
FROM
(
SELECT
tg.delta_target AS delta_target,
abs(toFloat64(g.delta) - toFloat64(tg.delta_target)) AS gap,
toFloat64(g.strike_price) AS strike_usd,
toFloat64(g.delta) AS delta_measured,
toFloat64(g.option_close) AS premium_usd,
100 * toFloat64(g.option_close) / toFloat64(g.underlying_close) AS static_pct,
100 * (toFloat64(g.option_close) + toFloat64(g.strike_price) - toFloat64(g.underlying_close))
/ toFloat64(g.underlying_close) AS called_pct,
toFloat64(g.underlying_close) - toFloat64(g.option_close) AS breakeven_usd,
toInt32(g.days_to_expiry) AS dte,
concat(monthName(toDate(g.date)), ' ', toString(toDayOfMonth(toDate(g.date))), ', ', toString(toYear(toDate(g.date)))) AS as_of
FROM global_markets.options_greeks AS g
CROSS JOIN
(
SELECT arrayJoin(['0.15', '0.20', '0.25', '0.30', '0.35', '0.40']) AS delta_target
) AS tg
WHERE g.underlying_symbol = 'AAPL'
AND lower(toString(g.option_type)) IN ('call', 'c')
AND g.date = snap_date
AND g.expiration_date = write_expiry
AND toFloat64(g.option_close) > 0
AND toFloat64(g.delta) BETWEEN 0.05 AND 0.60
)
GROUP BY delta_target
ORDER BY delta_targetAs of October 2, 2026, the contract nearest the 0.30 target measured a delta of 0.264 at a $350 strike, 28 days from expiry. Its closing premium was $3.48 per share, and one contract covers 100 shares, so the cash collected was $348.
Three figures follow from that row. The static return, what the position earns if AAPL finishes where it started, is 1.04%. The return if called, premium plus the climb from the share price to the strike, is 5.96%. The breakeven, where the combined position stops making money, is $330.12.
The 0.15 delta call sits well out of the money at a $360 strike and pays 0.46%. The 0.40 delta call, struck nearer the money at $340, pays 2.08% and gives up any rally sooner. Every extra cent of premium is bought with a lower cap on the shares.
What the annualised number hides
A 1.04% static return over 28 days is the figure that gets annualised into a headline yield, and annualising assumes the same month repeating all year. The panel below is that assumption tested: the identical write, placed on the first session of every month, held to expiry.
| month | month_label | strike | premium | premium_pct | move_to_expiry_pct | outcome |
|---|---|---|---|---|---|---|
| 2021-09 | September 2021 | 160 | 1.4 | 0.91 | -6.86 | kept |
| 2021-10 | October 2021 | 149 | 1.79 | 1.26 | 5.06 | called away |
| 2021-11 | November 2021 | 155 | 1.37 | 0.92 | 9.03 | called away |
| 2021-12 | December 2021 | 175 | 2.15 | 1.3 | 7.12 | called away |
| 2022-01 | January 2022 | 190 | 2.99 | 1.64 | -5.23 | kept |
| 2022-02 | February 2022 | 180 | 2.72 | 1.56 | -6.39 | kept |
| 2022-03 | March 2022 | 170 | 3 | 1.83 | 6.47 | called away |
| 2022-04 | April 2022 | 180 | 2.65 | 1.52 | -9.4 | kept |
| 2022-05 | May 2022 | 165 | 3.2 | 2.03 | -7.93 | kept |
| 2022-06 | June 2022 | 155 | 3 | 2.03 | -6.13 | kept |
| 2022-07 | July 2022 | 145 | 3.15 | 2.27 | 16.9 | called away |
| 2022-08 | August 2022 | 167.5 | 2.41 | 1.49 | -3.46 | kept |
| 2022-09 | September 2022 | 165 | 2.55 | 1.61 | -12.87 | kept |
| 2022-10 | October 2022 | 152.5 | 2.68 | 1.87 | -3.21 | kept |
| 2022-11 | November 2022 | 160 | 2.08 | 1.38 | -1.73 | kept |
| 2022-12 | December 2022 | 155 | 2.16 | 1.46 | -12.22 | kept |
| 2023-01 | January 2023 | 134 | 2.6 | 2.08 | 23.64 | called away |
| 2023-02 | February 2023 | 152.5 | 2.19 | 1.5 | 3.45 | kept |
| 2023-03 | March 2023 | 152.5 | 1.9 | 1.31 | 13.47 | called away |
| 2023-04 | April 2023 | 172.5 | 2.7 | 1.63 | 4.55 | called away |
The exact SQL behind every number
WITH month_open AS
(
SELECT min(date) AS write_date
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND lower(toString(option_type)) IN ('call', 'c')
AND toFloat64(option_close) > 0
AND date >= '2021-09-01'
GROUP BY toStartOfMonth(date)
),
picked AS
(
SELECT
write_month,
argMin(strike_usd, gap) AS strike_usd,
argMin(expiry, gap) AS expiry,
argMin(premium_usd, gap) AS premium_usd,
argMin(spot_usd, gap) AS spot_usd
FROM
(
SELECT
toStartOfMonth(date) AS write_month,
(abs(toInt32(days_to_expiry) - 30), abs(toFloat64(delta) - 0.30)) AS gap,
toFloat64(strike_price) AS strike_usd,
expiration_date AS expiry,
toFloat64(option_close) AS premium_usd,
toFloat64(underlying_close) AS spot_usd
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND lower(toString(option_type)) IN ('call', 'c')
AND toFloat64(option_close) > 0
AND toInt32(days_to_expiry) BETWEEN 21 AND 45
AND toFloat64(delta) BETWEEN 0.10 AND 0.50
AND expiration_date <= today() - 3
AND date IN (SELECT write_date FROM month_open)
)
GROUP BY write_month
)
SELECT
formatDateTime(p.write_month, '%Y-%m') AS month,
concat(monthName(p.write_month), ' ', toString(toYear(p.write_month))) AS month_label,
toString(round(p.strike_usd, 1)) AS strike,
round(p.premium_usd, 2) AS premium,
round(100 * p.premium_usd / p.spot_usd, 2) AS premium_pct,
round(100 * (toFloat64(s.close) / p.spot_usd - 1), 2) AS move_to_expiry_pct,
if(toFloat64(s.close) > p.strike_usd, 'called away', 'kept') AS outcome
FROM picked AS p
INNER JOIN
(
SELECT date, close
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'AAPL'
AND date >= '2021-09-01'
) AS s ON s.date = p.expiry
ORDER BY p.write_month61 completed monthly writes sit in that series, from September 2021 through September 2026. The premium line is the point of the chart. It widens in nervous months and thins in quiet ones, and anyone annualising a single month is stretching one reading across eleven that looked nothing like it.
In September 2026, the most recent write whose expiry has settled, the 0.30 delta call struck at $340 paid 1.19% of the share price. AAPL moved 2.63% between the write and that expiry, and the shares were kept.
How often does the call finish in the money?
Premium collected is only half the account. The other half is how often the shares get taken, and at what cost to the upside. All six delta targets run through the same monthly schedule below.
| delta_target | write_count | avg_premium_pct | finished_itm_pct | avg_write_return_pct | avg_hold_return_pct |
|---|---|---|---|---|---|
| 0.15 | 61 | 0.51 | 18 | 1.22 | 1.59 |
| 0.20 | 61 | 0.81 | 26.2 | 1.09 | 1.59 |
| 0.25 | 61 | 1.01 | 27.9 | 1.15 | 1.59 |
| 0.30 | 61 | 1.41 | 34.4 | 1.02 | 1.59 |
| 0.35 | 61 | 1.71 | 41 | 0.9 | 1.59 |
| 0.40 | 61 | 1.98 | 45.9 | 0.82 | 1.59 |
The exact SQL behind every number
WITH month_open AS
(
SELECT min(date) AS write_date
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND lower(toString(option_type)) IN ('call', 'c')
AND toFloat64(option_close) > 0
AND date >= '2021-09-01'
GROUP BY toStartOfMonth(date)
),
picks AS
(
SELECT
delta_target,
write_month,
argMin(strike_usd, gap) AS strike_usd,
argMin(expiry, gap) AS expiry,
argMin(premium_usd, gap) AS premium_usd,
argMin(spot_usd, gap) AS spot_usd
FROM
(
SELECT
tg.delta_target AS delta_target,
toStartOfMonth(g.date) AS write_month,
(abs(toInt32(g.days_to_expiry) - 30),
abs(toFloat64(g.delta) - toFloat64(tg.delta_target))) AS gap,
toFloat64(g.strike_price) AS strike_usd,
g.expiration_date AS expiry,
toFloat64(g.option_close) AS premium_usd,
toFloat64(g.underlying_close) AS spot_usd
FROM global_markets.options_greeks AS g
CROSS JOIN
(
SELECT arrayJoin(['0.15', '0.20', '0.25', '0.30', '0.35', '0.40']) AS delta_target
) AS tg
WHERE g.underlying_symbol = 'AAPL'
AND lower(toString(g.option_type)) IN ('call', 'c')
AND toFloat64(g.option_close) > 0
AND toInt32(g.days_to_expiry) BETWEEN 21 AND 45
AND toFloat64(g.delta) BETWEEN 0.05 AND 0.55
AND g.expiration_date <= today() - 3
AND g.date IN (SELECT write_date FROM month_open)
)
GROUP BY delta_target, write_month
)
SELECT
p.delta_target AS delta_target,
count() AS write_count,
round(avg(100 * p.premium_usd / p.spot_usd), 2) AS avg_premium_pct,
round(100 * countIf(toFloat64(s.close) > p.strike_usd) / count(), 1) AS finished_itm_pct,
round(avg(100 * (least(toFloat64(s.close), p.strike_usd) + p.premium_usd - p.spot_usd) / p.spot_usd), 2) AS avg_write_return_pct,
round(avg(100 * (toFloat64(s.close) - p.spot_usd) / p.spot_usd), 2) AS avg_hold_return_pct
FROM picks AS p
INNER JOIN
(
SELECT date, close
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'AAPL'
AND date >= '2021-09-01'
) AS s ON s.date = p.expiry
GROUP BY p.delta_target
ORDER BY p.delta_targetAt the 0.30 target, 61 monthly writes finished above the strike 34.4% of the time. The rest lapsed, and the premium stayed with the writer. The outer rows mark the range: the 0.15 target finished in the money 18% of the time, the 0.40 target 45.9%. Average premium at the 0.30 target measured 1.41% per cycle.
The last two columns are the comparison a yield figure never shows. Averaged over those cycles, the 0.30 delta covered write returned 1.02% per roughly 30 day window, alongside 1.59% for holding the 100 shares alone over the identical windows. Both count price and premium only, dividends excluded, and both are period figures rather than annual ones. The gap between them measures one stretch of Apple's history, not the next.
Does the AAPL dividend change the trade?
Apple pays a quarterly dividend, and a writer who still owns the shares on the ex dividend date, the first date the stock trades without the right to the payment, collects it. The wrinkle is early assignment: a listed US equity call is American style, so the holder may exercise on any business day. A holder of an in the money call who exercises the day before the ex date owns the shares in time for the dividend, giving up the option's remaining time value in exchange.
| ex_date_iso | ex_pretty | dividend_usd | time_value_usd | strike | days_to_expiry | exercise_edge |
|---|---|---|---|---|---|---|
| 2021-11-05 | November 5, 2021 | 0.22 | 1.27 | 150 | 8 | the time value was larger |
| 2022-02-04 | February 4, 2022 | 0.22 | 1.6 | 172.5 | 8 | the time value was larger |
| 2022-05-06 | May 6, 2022 | 0.23 | 3.24 | 157.5 | 8 | the time value was larger |
| 2022-08-05 | August 5, 2022 | 0.23 | 2.06 | 165 | 8 | the time value was larger |
| 2022-11-04 | November 4, 2022 | 0.23 | 3.67 | 137 | 8 | the time value was larger |
| 2023-02-10 | February 10, 2023 | 0.23 | 2.44 | 150 | 8 | the time value was larger |
| 2023-05-12 | May 12, 2023 | 0.24 | 1.37 | 172.5 | 8 | the time value was larger |
| 2023-08-11 | August 11, 2023 | 0.24 | 1.52 | 177.5 | 8 | the time value was larger |
| 2023-11-10 | November 10, 2023 | 0.24 | 1.2 | 180 | 8 | the time value was larger |
| 2024-02-09 | February 9, 2024 | 0.24 | 1.79 | 187.5 | 8 | the time value was larger |
| 2024-05-10 | May 10, 2024 | 0.25 | 0.86 | 182.5 | 8 | the time value was larger |
| 2024-08-12 | August 12, 2024 | 0.25 | 2.29 | 215 | 7 | the time value was larger |
| 2024-11-08 | November 8, 2024 | 0.25 | 1.77 | 225 | 8 | the time value was larger |
| 2025-02-10 | February 10, 2025 | 0.25 | 2.43 | 225 | 7 | the time value was larger |
| 2025-05-12 | May 12, 2025 | 0.26 | 3.22 | 197.5 | 7 | the time value was larger |
| 2025-08-11 | August 11, 2025 | 0.26 | 2.12 | 227.5 | 7 | the time value was larger |
| 2025-11-10 | November 10, 2025 | 0.26 | 2.72 | 267.5 | 7 | the time value was larger |
| 2026-02-09 | February 9, 2026 | 0.26 | 2.87 | 275 | 5 | the time value was larger |
| 2026-05-11 | May 11, 2026 | 0.27 | 1.87 | 292.5 | 5 | the time value was larger |
| 2026-08-10 | August 10, 2026 | 0.27 | 2.85 | 312.5 | 5 | the time value was larger |
The exact SQL behind every number
WITH ex_dates AS
(
SELECT
toDate(ex_dividend_date) AS ex_date,
max(toFloat64(cash_amount)) AS dividend
FROM global_markets.stocks_dividends
WHERE ticker = 'AAPL'
AND toDate(ex_dividend_date) >= toDate('2021-09-01')
AND toDate(ex_dividend_date) < today()
GROUP BY ex_date
),
option_sessions AS
(
SELECT DISTINCT toDate(date) AS session_date
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date >= '2021-08-01'
),
cutoffs AS
(
SELECT
e.ex_date AS ex_date,
e.dividend AS dividend,
max(o.session_date) AS last_session_before
FROM ex_dates AS e
CROSS JOIN option_sessions AS o
WHERE o.session_date < e.ex_date
GROUP BY e.ex_date, e.dividend
),
picked AS
(
SELECT
ex_date,
dividend,
argMin(time_value, gap) AS time_value,
argMin(strike_usd, gap) AS strike_usd,
argMin(dte, gap) AS dte
FROM
(
SELECT
c.ex_date AS ex_date,
c.dividend AS dividend,
(toInt32(g.days_to_expiry),
toFloat64(g.underlying_close) - toFloat64(g.strike_price)) AS gap,
toFloat64(g.option_close)
- (toFloat64(g.underlying_close) - toFloat64(g.strike_price)) AS time_value,
toFloat64(g.strike_price) AS strike_usd,
toInt32(g.days_to_expiry) AS dte
FROM global_markets.options_greeks AS g
INNER JOIN cutoffs AS c ON toDate(g.date) = c.last_session_before
WHERE g.underlying_symbol = 'AAPL'
AND lower(toString(g.option_type)) IN ('call', 'c')
AND toFloat64(g.option_close) > 0
AND toDate(g.expiration_date) > c.ex_date
AND toInt32(g.days_to_expiry) <= 45
AND toFloat64(g.strike_price) < toFloat64(g.underlying_close)
AND toFloat64(g.strike_price) > toFloat64(g.underlying_close) * 0.97
)
GROUP BY ex_date, dividend
)
SELECT
toString(ex_date) AS ex_date_iso,
concat(monthName(ex_date), ' ', toString(toDayOfMonth(ex_date)), ', ', toString(toYear(ex_date))) AS ex_pretty,
round(dividend, 2) AS dividend_usd,
round(time_value, 2) AS time_value_usd,
toString(round(strike_usd, 1)) AS strike,
toString(dte) AS days_to_expiry,
if(time_value < dividend, 'the dividend was larger', 'the time value was larger') AS exercise_edge
FROM picked
ORDER BY ex_dateEach of the 20 rows takes the last session before an ex date, finds the nearest in the money call expiring after it, and splits that call's price into the part already covered by the share price and the time value that remains. At August 10, 2026, the most recent ex date in the panel, the dividend was $0.27 per share against $2.85 of time value, and the time value was larger. The earliest row in view, November 5, 2021, paid $0.22.
A 0.30 delta call written out of the money holds no intrinsic value, so its entire price is time value, and exercising it early would hand money back. The exposure arrives after a rally has pushed the call in the money with an ex date still inside its life, which makes the payment calendar worth checking before the write. That is what the AAPL dividend schedule is for, alongside the rules on selling around the ex dividend date.
Why is AAPL option premium smaller than on high volatility names?
Implied volatility is the annualised move the option market has priced into a contract. A higher reading means a fatter premium at the same delta and the same days to expiry. The panel holds delta and days roughly fixed and lets the name vary.
| symbol | iv_pct | premium_pct |
|---|---|---|
| AAPL | 23.4 | 1.23 |
| TSLA | 42.7 | 2.21 |
| MSFT | 30.6 | 1.71 |
| NVDA | 28 | 1.45 |
| KO | 19.7 | 1.05 |
| SPY | 11.5 | 0.65 |
The exact SQL behind every number
WITH
(
SELECT max(date)
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND lower(toString(option_type)) IN ('call', 'c')
AND toFloat64(option_close) > 0
) AS snap_date
SELECT
underlying_symbol AS symbol,
round(100 * avg(toFloat64(implied_volatility)), 1) AS iv_pct,
round(100 * avg(toFloat64(option_close) / toFloat64(underlying_close)), 2) AS premium_pct
FROM global_markets.options_greeks
WHERE date = snap_date
AND lower(toString(option_type)) IN ('call', 'c')
AND toFloat64(option_close) > 0
AND toFloat64(implied_volatility) > 0
AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'TSLA', 'SPY', 'KO')
AND underlying_symbol NOT IN ('SPCX')
AND toInt32(days_to_expiry) BETWEEN 21 AND 45
AND toFloat64(delta) BETWEEN 0.25 AND 0.35
GROUP BY symbol
ORDER BY symbol = 'AAPL' DESC, iv_pct DESCOn that snapshot, Apple calls in the 0.25 to 0.35 delta band with 21 to 45 days left priced an implied volatility of 23.4%, and their premium measured 1.23% of the share price. Among the comparison names, the highest reading was TSLA at 42.7%, with premium at 2.21% of its own share price. The lowest in the group, SPY, priced 11.5%.
Premium moves with implied volatility, and Apple's option market prices smaller moves than the names volatility shoppers gather around. A premium percentage quoted from one of those names is a reading from a different volatility regime, not a figure Apple's chain can match at the same delta. AAPL implied volatility tracks that reading over time.
What happens at expiry?
Four things can happen at the end of a covered call's life. The writer picks between the last two while the contract is still alive.
- The shares finish under the strike. The call expires worthless and the premium is kept.
- The shares finish above the strike and are assigned. The writer delivers 100 shares at the strike and keeps the premium, which together is the return if called.
- Buy the call back. Closing the short call at its market price ends the obligation, and a call that has moved in the money costs more to close than it brought in.
- Roll it. Buying back the current call and writing a later one, usually in a single order, resets the cap, and the net cash can land either way.
The same four outcomes exist in mirror image on the cash side of this structure, which covered call vs cash secured put walks through.
How these numbers were built
Every option figure comes from daily per contract records carrying a positive closing mark that day. The monthly write uses each month's first session with data, picks the expiry closest to 30 days out, then the contract closest to the delta target, and counts only writes whose option has expired. Settlement is Apple's close on the expiry date; a cycle whose expiry fell on a session free day is left out. Returns count price change and premium with dividends excluded from both columns, every figure is a closing mark rather than a fill, and no commissions, spread or margin interest are applied.
FAQ
How much premium does a covered call on AAPL pay?
As of October 2, 2026, one Apple call at the 0.30 delta target about 28 days from expiry closed at $3.48 per share, or $348 for the contract covering 100 shares. That is a static return of 1.04% for the cycle, and it moves with implied volatility.
How often do AAPL covered calls get called away?
Across 61 monthly writes at the 0.30 delta target, measured from September 2021 onward, Apple finished above the strike 34.4% of the time. At the 0.40 delta target that figure was 45.9%.
What is the breakeven on an AAPL covered call?
It is the share price paid less the premium collected. On the October 2, 2026 chain that came to $330.12 for the 0.30 delta write, against a $350 strike on the upside.
Every panel here ships with the SQL that produced it, so the strike selection and the filters are there to read. To run the same arithmetic on another ticker, delta or expiry, ask in plain English on the Strasmore terminal.