{"slug":"what-breaks-an-options-backtest","qid":"dividend_assignment","label":"In-the-money calls with extrinsic value below the upcoming dividend","post_title":"What Breaks an Options Backtest","post_url":"/blog/what-breaks-an-options-backtest#q-dividend_assignment","columns":["symbol","contracts_checked","below_dividend","below_dividend_pct","avg_dividend"],"rows":[{"symbol":"JNJ","contracts_checked":629,"below_dividend":417,"below_dividend_pct":66.3,"avg_dividend":1.221},{"symbol":"KO","contracts_checked":718,"below_dividend":441,"below_dividend_pct":61.4,"avg_dividend":0.481},{"symbol":"PG","contracts_checked":1061,"below_dividend":524,"below_dividend_pct":49.4,"avg_dividend":0.972},{"symbol":"MSFT","contracts_checked":2768,"below_dividend":411,"below_dividend_pct":14.8,"avg_dividend":0.792},{"symbol":"AAPL","contracts_checked":2722,"below_dividend":190,"below_dividend_pct":7,"avg_dividend":0.244}],"shape":"table","sql":"SELECT\n    symbol,\n    count()                                                     AS contracts_checked,\n    countIf(extrinsic < dividend)                               AS below_dividend,\n    round(100 * countIf(extrinsic < dividend) / count(), 1)      AS below_dividend_pct,\n    round(avg(dividend), 3)                                     AS avg_dividend\nFROM\n(\n    SELECT\n        g.underlying_symbol  AS symbol,\n        g.ticker             AS contract,\n        d.ex_dividend_date   AS ex_date,\n        any(d.cash_amount)   AS dividend,\n        argMax(toFloat64(g.option_close)\n               - (toFloat64(g.underlying_close) - toFloat64(g.strike_price)),\n               g.date)       AS extrinsic\n    FROM global_markets.options_greeks AS g\n    INNER JOIN\n    (\n        SELECT\n            ticker,\n            ex_dividend_date,\n            max(toFloat64(cash_amount)) AS cash_amount\n        FROM global_markets.stocks_dividends\n        WHERE ticker IN ('KO', 'MSFT', 'AAPL', 'JNJ', 'PG')\n          AND ex_dividend_date >= '2021-09-01'\n          AND ex_dividend_date <  '2026-09-01'\n        GROUP BY ticker, ex_dividend_date\n    ) AS d ON d.ticker = g.underlying_symbol\n    WHERE startsWith(lower(g.option_type), 'c')\n      AND g.iv_converged = 1\n      AND g.volume > 0\n      AND g.days_to_expiry BETWEEN 1 AND 60\n      AND toFloat64(g.underlying_close) > toFloat64(g.strike_price)\n      AND g.date <  d.ex_dividend_date\n      AND g.date >= d.ex_dividend_date - 4\n    GROUP BY symbol, contract, ex_date\n)\nGROUP BY symbol\nORDER BY below_dividend_pct DESC","computed_at":"2026-10-07T15:18:25.019999+00:00","elapsed":0.004730092}