{"slug":"how-many-puts-to-hedge-a-portfolio","qid":"beta_drift","label":"beta_drift","post_title":"how-many-puts-to-hedge-a-portfolio","post_url":"/blog/how-many-puts-to-hedge-a-portfolio#q-beta_drift","columns":["ticker","beta_last_12m","beta_prior_12m","beta_change"],"rows":[{"ticker":"NVDA","beta_last_12m":1.89,"beta_prior_12m":1.84,"beta_change":0.05},{"ticker":"MSFT","beta_last_12m":0.97,"beta_prior_12m":0.92,"beta_change":0.05},{"ticker":"AAPL","beta_last_12m":0.68,"beta_prior_12m":1.24,"beta_change":0.56},{"ticker":"JNJ","beta_last_12m":-0.17,"beta_prior_12m":0.05,"beta_change":0.22},{"ticker":"KO","beta_last_12m":-0.25,"beta_prior_12m":0.08,"beta_change":0.33},{"ticker":"XOM","beta_last_12m":-0.55,"beta_prior_12m":0.52,"beta_change":1.07}],"shape":"ranking","sql":"WITH closes AS\n(\n    SELECT\n        ticker,\n        date,\n        max(toFloat64(close)) AS px\n    FROM global_markets.stocks_daily_aggs\n    WHERE ticker IN ('AAPL', 'JNJ', 'KO', 'MSFT', 'NVDA', 'SPY', 'XOM')\n      AND date >= today() - 730\n      AND date <  today() - 2\n    GROUP BY ticker, date\n),\nrets AS\n(\n    SELECT\n        ticker,\n        date,\n        px / prev_px - 1 AS ret\n    FROM\n    (\n        SELECT\n            ticker,\n            date,\n            px,\n            lagInFrame(px) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_px\n        FROM closes\n    )\n    WHERE prev_px > 0\n)\nSELECT\n    ticker,\n    beta_last_12m,\n    beta_prior_12m,\n    round(abs(beta_last_12m - beta_prior_12m), 2) AS beta_change\nFROM\n(\n    SELECT\n        s.ticker AS ticker,\n        round(covarPopIf(s.ret, m.ret, s.date >= today() - 365) / varPopIf(m.ret, s.date >= today() - 365), 2) AS beta_last_12m,\n        round(covarPopIf(s.ret, m.ret, s.date <  today() - 365) / varPopIf(m.ret, s.date <  today() - 365), 2) AS beta_prior_12m\n    FROM rets AS s\n    INNER JOIN\n    (\n        SELECT date, ret\n        FROM rets\n        WHERE ticker = 'SPY'\n    ) AS m ON s.date = m.date\n    WHERE s.ticker != 'SPY'\n    GROUP BY s.ticker\n    HAVING countIf(s.date >= today() - 365) > 60\n       AND countIf(s.date <  today() - 365) > 60\n)\nORDER BY beta_last_12m DESC","computed_at":"2026-09-28T15:14:56.694741+00:00","elapsed":0.268451632}