{"slug":"portfolio-delta-and-beta-weighting","qid":"book_delta","label":"A three-leg book, raw delta against beta weighted delta","post_title":"Portfolio Delta and Beta Weighting Explained","post_url":"/blog/portfolio-delta-and-beta-weighting#q-book_delta","columns":["position","raw_share_delta","beta_vs_spy","beta_weighted_delta","running_book_delta","dollars_per_1pct_spy"],"rows":[{"position":"Long 300 AAPL","raw_share_delta":300,"beta_vs_spy":0.88,"beta_weighted_delta":103,"running_book_delta":103,"dollars_per_1pct_spy":767},{"position":"Short 3 AAPL calls","raw_share_delta":-98,"beta_vs_spy":0.88,"beta_weighted_delta":-34,"running_book_delta":69,"dollars_per_1pct_spy":516},{"position":"Long 5 KO puts","raw_share_delta":-217,"beta_vs_spy":-0.27,"beta_weighted_delta":6,"running_book_delta":76,"dollars_per_1pct_spy":565}],"shape":"table","sql":"WITH\n    sessions AS\n    (\n        SELECT\n            ticker                                               AS ticker,\n            toDate(toTimeZone(window_start, 'America/New_York')) AS d,\n            toFloat64(argMax(close, window_start))               AS px\n        FROM global_markets.delayed_stocks_minute_aggs\n        WHERE ticker IN ('SPY', 'AAPL', 'KO')\n          AND window_start >= toDateTime('2025-07-01 04:00:00')\n          AND window_start <  toDateTime('2026-07-01 04:00:00')\n          AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n             + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570\n          AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n             + toMinute(toTimeZone(window_start, 'America/New_York'))) <  960\n        GROUP BY ticker, d\n    ),\n    steps AS\n    (\n        SELECT\n            ticker,\n            d,\n            px,\n            any(px) OVER (PARTITION BY ticker ORDER BY d ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_px\n        FROM sessions\n    ),\n    daily_ret AS\n    (\n        SELECT ticker, d, (px / prev_px) - 1 AS r\n        FROM steps\n        WHERE prev_px > 0\n    ),\n    bench AS\n    (\n        SELECT d, r AS spy_r\n        FROM daily_ret\n        WHERE ticker = 'SPY'\n    ),\n    betas AS\n    (\n        SELECT\n            s.ticker                                 AS ticker,\n            covarPop(s.r, b.spy_r) / varPop(b.spy_r) AS beta_vs_spy\n        FROM daily_ret AS s\n        INNER JOIN bench AS b ON b.d = s.d\n        GROUP BY s.ticker\n    ),\n    prices AS\n    (\n        SELECT ticker, argMax(px, d) AS close_px, 1 AS k\n        FROM sessions\n        GROUP BY ticker\n    ),\n    spy_price AS\n    (\n        SELECT argMax(px, d) AS spy_close, 1 AS k\n        FROM sessions\n        WHERE ticker = 'SPY'\n    ),\n    opt_delta AS\n    (\n        SELECT\n            underlying_symbol                       AS ticker,\n            if(toFloat64(delta) > 0, 'call', 'put') AS kind,\n            avg(toFloat64(delta))                   AS per_share_delta\n        FROM global_markets.options_greeks\n        WHERE date >= toDate('2026-06-30')\n          AND date <  toDate('2026-07-01')\n          AND iv_converged = 1\n          AND volume > 0\n          AND days_to_expiry BETWEEN 25 AND 40\n          AND (\n                (underlying_symbol = 'AAPL' AND toFloat64(delta) > 0\n                 AND toFloat64(strike_price) / toFloat64(underlying_close) BETWEEN 1.03 AND 1.07)\n             OR (underlying_symbol = 'KO' AND toFloat64(delta) < 0\n                 AND toFloat64(strike_price) / toFloat64(underlying_close) BETWEEN 0.97 AND 1.03)\n          )\n        GROUP BY ticker, kind\n    ),\n    legs AS\n    (\n        SELECT\n            tupleElement(leg, 1) AS leg_no,\n            tupleElement(leg, 2) AS position,\n            tupleElement(leg, 3) AS ticker,\n            tupleElement(leg, 4) AS kind,\n            tupleElement(leg, 5) AS qty,\n            tupleElement(leg, 6) AS multiplier\n        FROM\n        (\n            SELECT arrayJoin([\n                (1, 'Long 300 AAPL',      'AAPL', 'stock', 300., 1.),\n                (2, 'Short 3 AAPL calls', 'AAPL', 'call',   -3., 100.),\n                (3, 'Long 5 KO puts',     'KO',   'put',     5., 100.)\n            ]) AS leg\n        )\n    )\nSELECT\n    position                                                                                          AS position,\n    round(raw_share_delta)                                                                            AS raw_share_delta,\n    round(beta_vs_spy, 2)                                                                             AS beta_vs_spy,\n    round(bw_delta)                                                                                   AS beta_weighted_delta,\n    round(sum(bw_delta) OVER (ORDER BY leg_no ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW))       AS running_book_delta,\n    round(sum(bw_delta) OVER (ORDER BY leg_no ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) * spy_close / 100.) AS dollars_per_1pct_spy\nFROM\n(\n    SELECT\n        l.leg_no                                                            AS leg_no,\n        l.position                                                          AS position,\n        l.qty * l.multiplier * if(l.kind = 'stock', 1., o.per_share_delta)  AS raw_share_delta,\n        bt.beta_vs_spy                                                      AS beta_vs_spy,\n        sp.spy_close                                                        AS spy_close,\n        raw_share_delta * bt.beta_vs_spy * pr.close_px / sp.spy_close       AS bw_delta\n    FROM legs AS l\n    LEFT  JOIN opt_delta AS o  ON o.ticker = l.ticker AND o.kind = l.kind\n    INNER JOIN betas     AS bt ON bt.ticker = l.ticker\n    INNER JOIN prices    AS pr ON pr.ticker = l.ticker\n    INNER JOIN spy_price AS sp ON sp.k = pr.k\n)\nORDER BY leg_no","computed_at":"2026-08-06T05:02:10.270299+00:00","elapsed":8.629331432}