{"slug":"spy-dividend-yield-and-uit-cash-drag","qid":"fund_yields","label":"Trailing 12-month dividend yield: SPY against two open-end S&P 500 ETFs","post_title":"SPY Dividend Yield: Why It Trails the Index","post_url":"/blog/spy-dividend-yield-and-uit-cash-drag#q-fund_yields","columns":["ticker","trailing_yield_pct","yield_spread_vs_spy_bps"],"rows":[{"ticker":"IVV","trailing_yield_pct":1.063,"yield_spread_vs_spy_bps":8.2},{"ticker":"SPY","trailing_yield_pct":0.981,"yield_spread_vs_spy_bps":0},{"ticker":"VOO","trailing_yield_pct":1.042,"yield_spread_vs_spy_bps":6.1}],"shape":"ranking","sql":"WITH\n    divs AS\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 ('SPY', 'VOO', 'IVV')\n          AND ex_dividend_date >= today() - 365\n          AND ex_dividend_date <  today()\n        GROUP BY ticker, ex_dividend_date\n    ),\n    ttm AS\n    (\n        SELECT\n            ticker,\n            sum(cash_amount) AS ttm_dividend\n        FROM divs\n        GROUP BY ticker\n        HAVING count() = 4\n    ),\n    px AS\n    (\n        SELECT\n            ticker,\n            toFloat64(argMax(close, window_start)) AS last_close\n        FROM global_markets.delayed_stocks_minute_aggs\n        WHERE ticker IN ('SPY', 'VOO', 'IVV')\n          AND window_start >= today() - 15\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\n    ),\n    fund_yield AS\n    (\n        SELECT\n            ttm.ticker                             AS ticker,\n            ttm.ttm_dividend / px.last_close * 100 AS yield_pct\n        FROM ttm\n        INNER JOIN px ON px.ticker = ttm.ticker\n    ),\n    spy_yield AS\n    (\n        SELECT max(yield_pct) AS spy_pct\n        FROM fund_yield\n        WHERE ticker = 'SPY'\n    )\nSELECT\n    fund_yield.ticker                                          AS ticker,\n    round(fund_yield.yield_pct, 3)                             AS trailing_yield_pct,\n    round((fund_yield.yield_pct - spy_yield.spy_pct) * 100, 1) AS yield_spread_vs_spy_bps\nFROM fund_yield\nCROSS JOIN spy_yield\nORDER BY ticker","computed_at":"2026-08-22T04:22:06.912123+00:00","elapsed":1.621234171}