{"slug":"why-stocks-drop-on-the-ex-dividend-date","qid":"dividend_vs_overnight_noise","label":"Quarterly dividend against ordinary overnight moves, 2021 to 2025","post_title":"Why stocks drop on the ex-dividend date","post_url":"/blog/why-stocks-drop-on-the-ex-dividend-date#q-dividend_vs_overnight_noise","columns":["ticker","dividend_bps","median_gap_bps","sessions_over_dividend_pct"],"rows":[{"ticker":"HD","dividend_bps":60.7,"median_gap_bps":40.5,"sessions_over_dividend_pct":33.2},{"ticker":"XOM","dividend_bps":100.3,"median_gap_bps":51.6,"sessions_over_dividend_pct":23.5},{"ticker":"CVX","dividend_bps":105.7,"median_gap_bps":49.1,"sessions_over_dividend_pct":19.4},{"ticker":"MCD","dividend_bps":56.9,"median_gap_bps":26.5,"sessions_over_dividend_pct":18.2},{"ticker":"PG","dividend_bps":62.3,"median_gap_bps":23.6,"sessions_over_dividend_pct":12.5},{"ticker":"PEP","dividend_bps":76.8,"median_gap_bps":27.9,"sessions_over_dividend_pct":12.2},{"ticker":"JNJ","dividend_bps":70.8,"median_gap_bps":25.8,"sessions_over_dividend_pct":10},{"ticker":"KO","dividend_bps":74.9,"median_gap_bps":24,"sessions_over_dividend_pct":9.3},{"ticker":"ABBV","dividend_bps":97,"median_gap_bps":28.8,"sessions_over_dividend_pct":7.4},{"ticker":"VZ","dividend_bps":148.6,"median_gap_bps":23.8,"sessions_over_dividend_pct":3.2}],"shape":"ranking","sql":"WITH\nprices AS\n(\n    SELECT\n        ticker,\n        date,\n        open_px,\n        any(close_px) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prior_close\n    FROM\n    (\n        SELECT\n            ticker,\n            date,\n            toFloat64(max(open))  AS open_px,\n            toFloat64(max(close)) AS close_px\n        FROM global_markets.stocks_daily_aggs\n        WHERE ticker IN ('KO','PG','JNJ','PEP','XOM','CVX','MCD','HD','VZ','ABBV')\n          AND date >= '2020-12-01'\n          AND date <  '2026-01-01'\n        GROUP BY ticker, date\n    )\n),\nex_days AS\n(\n    SELECT\n        ticker,\n        ex_dividend_date            AS ex_date,\n        toFloat64(max(cash_amount)) AS dividend\n    FROM global_markets.stocks_dividends\n    WHERE ticker IN ('KO','PG','JNJ','PEP','XOM','CVX','MCD','HD','VZ','ABBV')\n      AND ex_dividend_date >= '2021-01-01'\n      AND ex_dividend_date <  '2026-01-01'\n      AND cash_amount > 0\n    GROUP BY ticker, ex_dividend_date\n),\ndiv_size AS\n(\n    SELECT\n        e.ticker                                AS ticker,\n        avg(e.dividend / p.prior_close) * 10000 AS dividend_bps\n    FROM ex_days AS e\n    INNER JOIN prices AS p ON p.ticker = e.ticker AND p.date = e.ex_date\n    WHERE p.prior_close > 0\n    GROUP BY e.ticker\n),\nordinary AS\n(\n    SELECT\n        ticker,\n        date,\n        abs(open_px / prior_close - 1) * 10000 AS abs_gap_bps\n    FROM prices\n    WHERE prior_close > 0\n      AND date >= '2021-01-01'\n      AND (ticker, date) NOT IN (SELECT ticker, ex_date FROM ex_days)\n)\nSELECT\n    o.ticker                                                              AS ticker,\n    round(max(d.dividend_bps), 1)                                         AS dividend_bps,\n    round(quantileDeterministic(0.5)(o.abs_gap_bps, toUInt32(o.date)), 1) AS median_gap_bps,\n    round(100 * countIf(o.abs_gap_bps > d.dividend_bps) / count(), 1)     AS sessions_over_dividend_pct\nFROM ordinary AS o\nINNER JOIN div_size AS d ON d.ticker = o.ticker\nGROUP BY o.ticker\nORDER BY sessions_over_dividend_pct DESC","computed_at":"2026-08-14T15:02:40.704555+00:00","elapsed":0.004715844}