Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

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.

QueryOne AAPL call per delta target, about 30 days out, with the covered call math applied
delta_targetstrikecall_deltapremiumpremium_per_contractstatic_return_pctif_called_pctbreakevendays_to_expiryas_of
0.153600.1411.531530.468.37332.0728October 2, 2026
0.203550.1962.332330.77.11331.2728October 2, 2026
0.253500.2643.483481.045.96330.1228October 2, 2026
0.303500.2643.483481.045.96330.1228October 2, 2026
0.353450.3364.794791.444.85328.8128October 2, 2026
0.403400.4246.956952.084326.6528October 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_target
Run this yourself

As 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.

QueryThe same 0.30 delta AAPL write, repeated on the first session of every month
61 rows (showing 20)
monthmonth_labelstrikepremiumpremium_pctmove_to_expiry_pctoutcome
2021-09September 20211601.40.91-6.86kept
2021-10October 20211491.791.265.06called away
2021-11November 20211551.370.929.03called away
2021-12December 20211752.151.37.12called away
2022-01January 20221902.991.64-5.23kept
2022-02February 20221802.721.56-6.39kept
2022-03March 202217031.836.47called away
2022-04April 20221802.651.52-9.4kept
2022-05May 20221653.22.03-7.93kept
2022-06June 202215532.03-6.13kept
2022-07July 20221453.152.2716.9called away
2022-08August 2022167.52.411.49-3.46kept
2022-09September 20221652.551.61-12.87kept
2022-10October 2022152.52.681.87-3.21kept
2022-11November 20221602.081.38-1.73kept
2022-12December 20221552.161.46-12.22kept
2023-01January 20231342.62.0823.64called away
2023-02February 2023152.52.191.53.45kept
2023-03March 2023152.51.91.3113.47called away
2023-04April 2023172.52.71.634.55called 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_month
Run this yourself

61 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.

QueryOutcomes of the repeated monthly AAPL write, by delta target
delta_targetwrite_countavg_premium_pctfinished_itm_pctavg_write_return_pctavg_hold_return_pct
0.15610.51181.221.59
0.20610.8126.21.091.59
0.25611.0127.91.151.59
0.30611.4134.41.021.59
0.35611.71410.91.59
0.40611.9845.90.821.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_target
Run this yourself

At 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.

QueryAAPL dividend versus the time value left in the nearest in-the-money call, the day before each ex date
ex_date_isoex_prettydividend_usdtime_value_usdstrikedays_to_expiryexercise_edge
2021-11-05November 5, 20210.221.271508the time value was larger
2022-02-04February 4, 20220.221.6172.58the time value was larger
2022-05-06May 6, 20220.233.24157.58the time value was larger
2022-08-05August 5, 20220.232.061658the time value was larger
2022-11-04November 4, 20220.233.671378the time value was larger
2023-02-10February 10, 20230.232.441508the time value was larger
2023-05-12May 12, 20230.241.37172.58the time value was larger
2023-08-11August 11, 20230.241.52177.58the time value was larger
2023-11-10November 10, 20230.241.21808the time value was larger
2024-02-09February 9, 20240.241.79187.58the time value was larger
2024-05-10May 10, 20240.250.86182.58the time value was larger
2024-08-12August 12, 20240.252.292157the time value was larger
2024-11-08November 8, 20240.251.772258the time value was larger
2025-02-10February 10, 20250.252.432257the time value was larger
2025-05-12May 12, 20250.263.22197.57the time value was larger
2025-08-11August 11, 20250.262.12227.57the time value was larger
2025-11-10November 10, 20250.262.72267.57the time value was larger
2026-02-09February 9, 20260.262.872755the time value was larger
2026-05-11May 11, 20260.271.87292.55the time value was larger
2026-08-10August 10, 20260.272.85312.55the 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_date
Run this yourself

Each 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.

QueryImplied volatility and premium on 0.25 to 0.35 delta calls, AAPL against comparison names
symboliv_pctpremium_pct
AAPL23.41.23
TSLA42.72.21
MSFT30.61.71
NVDA281.45
KO19.71.05
SPY11.50.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 DESC
Run this yourself

On 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.