Strasmore Research
Learn am Matt ConnorBy Matt Connor

Portfolio Delta and Beta Weighting: Wetin E Mean

Raw option deltas no dey add up across tickers. Beta weighting dey convert portfolio delta into equivalent SPY shares, with one small book worked by hand.

Portfolio delta na the one number wey answer one question: if broad market move 1%, roughly how much the whole book go move? If you add the delta of every position, you go get one number, but e no be the correct one. Beta weighting na the adjustment wey make the sum meaningful. E restate every holding as equivalent number of SPY shares.

Why portfolio delta no dey add up across tickers

Delta dey measure how much a position value go change when the underlying move one dollar. One stock share get delta of 1. One option contract cover 100 shares, so call wey show 0.30 delta carry 30 deltas of exposure. Na this single-position view wetin option delta dey measure.

The problem dey show when second ticker enter. One hundred deltas for high-priced, high-beta name and one hundred deltas for cheap defensive name na the same count, but their exposure no near the same. One represent tens of thousands of dollars in stock wey historically dey swing pass the index. The other represent only few thousand dollars in stock wey historically dey swing less. If you add dem, you get 200, but na figure for units wey nobody fit use take act.

Wetin be beta weighted delta?

Beta weighting dey restate every delta for the book as delta of one selected benchmark, usually SPY for US equity book. Two multipliers dey do the work.

The first one na beta: how sensitive stock don historically be to the benchmark. Dem measure am as the slope of the stock daily returns against the index daily returns over selected period. Beta of 1.4 mean say stock move about 1.4% on average for every 1% move for the index during that period.

The second one na price ratio: stock price divided by benchmark price. Delta dey count shares, and shares wey get different prices represent different money amounts. The ratio dey put dem for one scale.

Multiply position raw delta by both, and result na the beta weighted delta: number of SPY shares wey for don behave the same way during the measurement period. The panel below measure each name beta from daily closing returns for the year wey end June 30, 2026. E then show the name price against SPY price and the product of both. SPY dey the list as the anchor, with beta of 1 and price ratio of 1. This make one SPY share exactly one beta weighted delta.

QueryBeta, price ratio, and SPY-share equivalent wey each share hold
The exact SQL behind every number
WITH
    sessions AS
    (
        SELECT
            ticker                                               AS ticker,
            toDate(toTimeZone(window_start, 'America/New_York')) AS d,
            toFloat64(argMax(close, window_start))               AS px
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker IN ('SPY', 'NVDA', 'AAPL', 'MSFT', 'XOM', 'JNJ', 'KO')
          AND window_start >= toDateTime('2025-07-01 04:00:00')
          AND window_start <  toDateTime('2026-07-01 04:00:00')
          AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
             + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570
          AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
             + toMinute(toTimeZone(window_start, 'America/New_York'))) <  960
        GROUP BY ticker, d
    ),
    steps AS
    (
        SELECT
            ticker,
            d,
            px,
            any(px) OVER (PARTITION BY ticker ORDER BY d ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_px
        FROM sessions
    ),
    daily_ret AS
    (
        SELECT ticker, d, (px / prev_px) - 1 AS r
        FROM steps
        WHERE prev_px > 0
    ),
    bench AS
    (
        SELECT d, r AS spy_r
        FROM daily_ret
        WHERE ticker = 'SPY'
    ),
    betas AS
    (
        SELECT
            s.ticker                                 AS ticker,
            covarPop(s.r, b.spy_r) / varPop(b.spy_r) AS beta_vs_spy,
            1                                        AS k
        FROM daily_ret AS s
        INNER JOIN bench AS b ON b.d = s.d
        GROUP BY s.ticker
    ),
    prices AS
    (
        SELECT ticker, argMax(px, d) AS close_px
        FROM sessions
        GROUP BY ticker
    ),
    spy_price AS
    (
        SELECT argMax(px, d) AS spy_close, 1 AS k
        FROM sessions
        WHERE ticker = 'SPY'
    )
SELECT
    betas.ticker                                                        AS ticker,
    round(betas.beta_vs_spy, 2)                                         AS beta_vs_spy,
    round(prices.close_px / spy_price.spy_close, 3)                     AS price_vs_spy,
    round(betas.beta_vs_spy * prices.close_px / spy_price.spy_close, 3) AS spy_shares_per_share
FROM betas
INNER JOIN prices ON prices.ticker = betas.ticker
INNER JOIN spy_price ON spy_price.k = betas.k
ORDER BY beta_vs_spy DESC
Run this yourself

NVDA top the list with beta of 1.86, as e dey trade at 0.268 times SPY price. Multiply the two: one share of am carry index exposure of 0.498 SPY shares. The other end of the 7 names dey below zero. XOM record beta of -0.36 during this period. Na mild inverse slope against the index, no be just a weaker version of the index. One share convert to -0.067 SPY shares. One delta dey the books for both cases. But the exposure wey that delta get fit differ widely. This also show early say beta wey dem print to two decimal places na estimate wey depend on the period used, and we go discuss that point for the end of this post.

Where option deltas dey come from

Delta for one stock na fixed at 1 per share. Option delta no fixed like that. E dey change based on strike, time wey remain before expiry, price of the underlying, and implied volatility. The panel below show delta for every AAPL contract wey trade on June 30, 2026, with 20 to 45 days remaining. E group dem into 2% buckets based on how far strike dey from closing price.

QueryAAPL call and put delta across the strike ladder, 20 to 45 days to expiry
The exact SQL behind every number
SELECT
    concat(if(bucket_pct > 0, '+', ''), toString(bucket_pct), '%') AS strike_vs_spot,
    round(avgIf(contract_delta, contract_delta > 0), 3)            AS call_delta,
    round(avgIf(contract_delta, contract_delta < 0), 3)            AS put_delta,
    count()                                                        AS contract_count
FROM
(
    SELECT
        toInt32(round((toFloat64(strike_price) / toFloat64(underlying_close) - 1) * 50)) * 2 AS bucket_pct,
        toFloat64(delta)                                                                     AS contract_delta
    FROM global_markets.options_greeks
    WHERE underlying_symbol = 'AAPL'
      AND date >= toDate('2026-06-30')
      AND date <  toDate('2026-07-01')
      AND iv_converged = 1
      AND volume > 0
      AND days_to_expiry BETWEEN 20 AND 45
      AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) <= 0.12
)
GROUP BY bucket_pct
HAVING countIf(contract_delta > 0) > 0 AND countIf(contract_delta < 0) > 0
ORDER BY bucket_pct
Run this yourself

For -12% bucket, calls get average delta of 0.924 across 4 contracts wey trade, while puts get average delta of -0.084. For +10%, calls get average delta of 0.106 and puts get -0.834. Call and put wey get the same strike carry deltas with opposite signs. Na why short call and long put both fit offset long stock position. how option greeks dey change over time explain how the whole curve dey shift as expiry dey near.

Working one small book turn to one number

Take one book wey get three positions, size by hand. Long 300 shares of AAPL. Short 3 AAPL calls wey dey about 5% above the money, with roughly one month to expiry — na the standard covered-call overlay. Long 5 KO puts near the money with similar expiry, as hedge for another name. The share and contract counts na hypothetical. Dem measure every delta and beta for the panel.

QueryA three-leg book, raw delta against beta weighted delta
The exact SQL behind every number
WITH
    sessions AS
    (
        SELECT
            ticker                                               AS ticker,
            toDate(toTimeZone(window_start, 'America/New_York')) AS d,
            toFloat64(argMax(close, window_start))               AS px
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker IN ('SPY', 'AAPL', 'KO')
          AND window_start >= toDateTime('2025-07-01 04:00:00')
          AND window_start <  toDateTime('2026-07-01 04:00:00')
          AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
             + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570
          AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
             + toMinute(toTimeZone(window_start, 'America/New_York'))) <  960
        GROUP BY ticker, d
    ),
    steps AS
    (
        SELECT
            ticker,
            d,
            px,
            any(px) OVER (PARTITION BY ticker ORDER BY d ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_px
        FROM sessions
    ),
    daily_ret AS
    (
        SELECT ticker, d, (px / prev_px) - 1 AS r
        FROM steps
        WHERE prev_px > 0
    ),
    bench AS
    (
        SELECT d, r AS spy_r
        FROM daily_ret
        WHERE ticker = 'SPY'
    ),
    betas AS
    (
        SELECT
            s.ticker                                 AS ticker,
            covarPop(s.r, b.spy_r) / varPop(b.spy_r) AS beta_vs_spy
        FROM daily_ret AS s
        INNER JOIN bench AS b ON b.d = s.d
        GROUP BY s.ticker
    ),
    prices AS
    (
        SELECT ticker, argMax(px, d) AS close_px, 1 AS k
        FROM sessions
        GROUP BY ticker
    ),
    spy_price AS
    (
        SELECT argMax(px, d) AS spy_close, 1 AS k
        FROM sessions
        WHERE ticker = 'SPY'
    ),
    opt_delta AS
    (
        SELECT
            underlying_symbol                       AS ticker,
            if(toFloat64(delta) > 0, 'call', 'put') AS kind,
            avg(toFloat64(delta))                   AS per_share_delta
        FROM global_markets.options_greeks
        WHERE date >= toDate('2026-06-30')
          AND date <  toDate('2026-07-01')
          AND iv_converged = 1
          AND volume > 0
          AND days_to_expiry BETWEEN 25 AND 40
          AND (
                (underlying_symbol = 'AAPL' AND toFloat64(delta) > 0
                 AND toFloat64(strike_price) / toFloat64(underlying_close) BETWEEN 1.03 AND 1.07)
             OR (underlying_symbol = 'KO' AND toFloat64(delta) < 0
                 AND toFloat64(strike_price) / toFloat64(underlying_close) BETWEEN 0.97 AND 1.03)
          )
        GROUP BY ticker, kind
    ),
    legs AS
    (
        SELECT
            tupleElement(leg, 1) AS leg_no,
            tupleElement(leg, 2) AS position,
            tupleElement(leg, 3) AS ticker,
            tupleElement(leg, 4) AS kind,
            tupleElement(leg, 5) AS qty,
            tupleElement(leg, 6) AS multiplier
        FROM
        (
            SELECT arrayJoin([
                (1, 'Long 300 AAPL',      'AAPL', 'stock', 300., 1.),
                (2, 'Short 3 AAPL calls', 'AAPL', 'call',   -3., 100.),
                (3, 'Long 5 KO puts',     'KO',   'put',     5., 100.)
            ]) AS leg
        )
    )
SELECT
    position                                                                                          AS position,
    round(raw_share_delta)                                                                            AS raw_share_delta,
    round(beta_vs_spy, 2)                                                                             AS beta_vs_spy,
    round(bw_delta)                                                                                   AS beta_weighted_delta,
    round(sum(bw_delta) OVER (ORDER BY leg_no ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW))       AS running_book_delta,
    round(sum(bw_delta) OVER (ORDER BY leg_no ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) * spy_close / 100.) AS dollars_per_1pct_spy
FROM
(
    SELECT
        l.leg_no                                                            AS leg_no,
        l.position                                                          AS position,
        l.qty * l.multiplier * if(l.kind = 'stock', 1., o.per_share_delta)  AS raw_share_delta,
        bt.beta_vs_spy                                                      AS beta_vs_spy,
        sp.spy_close                                                        AS spy_close,
        raw_share_delta * bt.beta_vs_spy * pr.close_px / sp.spy_close       AS bw_delta
    FROM legs AS l
    LEFT  JOIN opt_delta AS o  ON o.ticker = l.ticker AND o.kind = l.kind
    INNER JOIN betas     AS bt ON bt.ticker = l.ticker
    INNER JOIN prices    AS pr ON pr.ticker = l.ticker
    INNER JOIN spy_price AS sp ON sp.k = pr.k
)
ORDER BY leg_no
Run this yourself

The stock leg bring 300 raw deltas, one for each share. The short calls bring -98, while the long puts bring -217. If you add the three figures, you get one number. Beta weighting go give you another one.

AAPL get beta of 0.88 for the period, while KO get -0.27, meaning say e move with negative slope against the index across those twelve months. After dem scale each leg with its beta and its price against SPY, the stock leg turn to 103 SPY shares, the short calls turn to -34, and the puts turn to 6. Na the put leg you need look well. Its raw count of -217 deltas mean say the position dey short KO, and when you multiply short exposure by negative beta, e enter the positive side of the ledger as 6 SPY shares — small long-index reading. Forget the sign, na the size matter: hedge wey look big for raw delta terms fit turn to small part of that count for index terms, and e dey hedge KO, no be the whole market. The running total column carry the legs in order, and the book finish with 76 beta weighted deltas.

Wetín beta weighted delta of that size actually mean

A book wey get 76 beta weighted deltas don behave, during the measurement window, like say e hold that number of SPY shares. Positive figure mean say book dey long the index. Negative figure mean say e dey short am. Na wetin traders mean when dem say dem dey tilt delta short. The last column convert the running total to money. If SPY move 1%, and nothing else change, the book go move by 565 dollars.

To flatten the figure, add beta weighted delta wey get the same size but opposite sign. Shorting SPY shares go do am one-for-one: one SPY share na one beta weighted delta by construction. SPY options go do am in fractions, based on the delta wey the selected contract get. Reducing the underlying stock position go do am according to that stock own conversion rate from the first panel. Each method get its own costs and greeks.

Wey beta weighting dey break down

Beta na regression estimate, and the period wey dem use measure am fit change the answer. The panel below calculate the same two betas again across six lookback periods, and all of dem end for the same date.

QueryThe same two betas, measured across six different lookback windows
The exact SQL behind every number
WITH
    sessions AS
    (
        SELECT
            ticker                                               AS ticker,
            toDate(toTimeZone(window_start, 'America/New_York')) AS d,
            toFloat64(argMax(close, window_start))               AS px
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker IN ('SPY', 'AAPL', 'KO')
          AND window_start >= toDateTime('2024-04-01 04:00:00')
          AND window_start <  toDateTime('2026-07-01 04:00:00')
          AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
             + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570
          AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
             + toMinute(toTimeZone(window_start, 'America/New_York'))) <  960
        GROUP BY ticker, d
    ),
    steps AS
    (
        SELECT
            ticker,
            d,
            px,
            any(px) OVER (PARTITION BY ticker ORDER BY d ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_px
        FROM sessions
    ),
    daily_ret AS
    (
        SELECT ticker, d, (px / prev_px) - 1 AS r
        FROM steps
        WHERE prev_px > 0
    ),
    bench AS
    (
        SELECT d, r AS spy_r
        FROM daily_ret
        WHERE ticker = 'SPY'
    ),
    paired AS
    (
        SELECT
            s.ticker                                                 AS ticker,
            s.r                                                      AS r,
            b.spy_r                                                  AS spy_r,
            row_number() OVER (PARTITION BY s.ticker ORDER BY s.d DESC) AS rn
        FROM daily_ret AS s
        INNER JOIN bench AS b ON b.d = s.d
        WHERE s.ticker IN ('AAPL', 'KO')
    ),
    windows AS
    (
        SELECT arrayJoin([30, 60, 90, 180, 252, 504]) AS lookback
    )
SELECT
    w.lookback                                                                                       AS lookback_sessions,
    round(covarPopIf(p.r, p.spy_r, p.ticker = 'AAPL') / varPopIf(p.spy_r, p.ticker = 'AAPL'), 2)     AS aapl_beta,
    round(covarPopIf(p.r, p.spy_r, p.ticker = 'KO')   / varPopIf(p.spy_r, p.ticker = 'KO'), 2)       AS ko_beta
FROM paired AS p
CROSS JOIN windows AS w
WHERE p.rn <= w.lookback
GROUP BY w.lookback
HAVING countIf(p.ticker = 'AAPL') > 0 AND countIf(p.ticker = 'KO') > 0
ORDER BY lookback_sessions
Run this yourself

For the most recent 30 sessions, AAPL measure 0.54, compared with 1.14 across 504 sessions. KO measure -1.04 for the short window and -0.03 for the long one. All 6 estimates correct by arithmetic. But dem answer different questions, and beta weighted book delta go inherit whichever window the platform choose. Defensive name wey print slightly negative beta for one window and slightly positive beta for the next one na the normal case, no be anomaly. Every sign for the worked book above depend on that choice.

Correlation behaviour na the second limit. Beta na average of ordinary sessions. During broad selloff, names wey normally move at their own pace dey tend to move together, and measured betas dey cluster near 1. Book wey look balanced based on beta for quiet market fit dey far from balanced for the session wey the hedge matter. Concentration risk describe the same blind spot from the other side: summary statistic tell you about the middle of the distribution, no be the tail.

Third, the calculation na first order, and e no know anything about gamma. Beta weighted delta na the slope of the book value at today’s prices, and e assume say that slope go remain the same. Gamma, wey be the rate at which delta itself dey change, no dey appear inside am. Book wey carry short options fit show modest beta weighted delta and still change character quickly when index move 3%. The deltas wey enter the calculation no longer describe those positions at those prices. Treat the figure as description of small moves. Positions wey dem build for the tail, like the ones for protective puts, look small in beta weighted terms, and dem no dey do their work within that range anyway.

The benchmark too na a choice. Book of small caps wey dem weight against SPY dey hide the part of its movement wey come from company size instead of broad market. Delta na one greek among several, and dem explain the rest of the set for how option greeks work.

FAQ

Beta weighted delta na wetin?

Beta weighted delta dey restate every position for portfolio as equivalent number of shares for one benchmark, usually SPY. E multiply each position raw delta by the underlying beta against that benchmark, plus ratio of the two prices. Then e add all the results together into one figure for the book.

How you fit calculate beta weighted delta by hand?

Start with the position delta in shares: 1 for each stock share, or 100 times the option delta for each contract. Multiply am by the underlying beta against the benchmark. Then multiply am again by underlying price divided by benchmark price. Add the results for every position.

Negative beta weighted delta mean wetin?

E mean say the book position dey gain value when benchmark fall and lose value when benchmark rise. The movement go roughly match being short that number of benchmark shares. Traders dey call am tilting delta short. The figure only hold for small moves.

Stock fit get negative beta?

Yes, for one particular window. Beta na the measured slope of a stock daily returns against the index returns. Defensive stock fit show slightly below zero for one twelve-month period, then slightly above zero for the next one. Negative beta dey reverse the sign of that position beta weighted delta. Na why people dey read the metric together with the window wey dem use measure am.

Which lookback window get the correct beta?

No be one window dey always correct. 30-session beta dey track recent behaviour and fit change plenty. One-year or two-year beta dey more stable and slower to show change for the underlying business. The stability panel above dey show how different two windows fit be for the same stock on the same date.

Beta weighting dey account for gamma or volatility?

No. Na first-order measure wey use current deltas and historical beta. Gamma, vega, theta, and rho no change because of am. So book of short options fit look flat for beta weighted delta terms and still carry serious risk when market make big move.


Every panel above come with the SQL wey produce am. Open any one, change the tickers or measurement window, and the same beta weighted arithmetic go run against any book wey you fit describe on the Strasmore terminal.

#beta weighting#portfolio greeks#delta#hedging#options