{"slug":"portfolio-weighted-dividend-yield","qid":"weighted_vs_naive","label":"Two averages of the same five holdings","post_title":"Portfolio Dividend Yield: Weighted Average","post_url":"/blog/portfolio-weighted-dividend-yield#q-weighted_vs_naive","columns":["method","yield_pct"],"rows":[{"method":"Simple average of the five yields","yield_pct":2.85},{"method":"Market-value weighted portfolio yield","yield_pct":2.22}],"shape":"ranking","sql":"WITH\n    positions AS\n    (\n        SELECT\n            tupleElement(p, 1)            AS ticker,\n            toFloat64(tupleElement(p, 2)) AS shares\n        FROM\n        (\n            SELECT arrayJoin([('MSFT', 30.), ('PG', 60.), ('XOM', 80.), ('KO', 100.), ('VZ', 60.)]) AS p\n        )\n    ),\n    last_px AS\n    (\n        SELECT\n            ticker,\n            toFloat64(argMax(close, date)) AS px\n        FROM global_markets.stocks_daily_aggs\n        WHERE ticker IN ('MSFT', 'PG', 'XOM', 'KO', 'VZ')\n          AND date >= today() - 30\n        GROUP BY ticker\n    ),\n    ttm_dps AS\n    (\n        SELECT\n            ticker,\n            sum(amount) AS dps\n        FROM\n        (\n            SELECT\n                ticker,\n                id,\n                toFloat64(any(cash_amount)) AS amount\n            FROM global_markets.stocks_dividends\n            WHERE ticker IN ('MSFT', 'PG', 'XOM', 'KO', 'VZ')\n              AND ex_dividend_date >  today() - 365\n              AND ex_dividend_date <= today()\n            GROUP BY ticker, id\n        )\n        GROUP BY ticker\n    ),\n    holding AS\n    (\n        SELECT\n            pos.shares * lp.px AS value_usd,\n            pos.shares * d.dps AS income_usd\n        FROM positions AS pos\n        INNER JOIN last_px AS lp ON lp.ticker = pos.ticker\n        INNER JOIN ttm_dps AS d  ON d.ticker  = pos.ticker\n    )\nSELECT\n    tupleElement(m, 1)           AS method,\n    round(tupleElement(m, 2), 2) AS yield_pct\nFROM\n(\n    SELECT arrayJoin([\n        ('Market-value weighted portfolio yield', weighted_yield),\n        ('Simple average of the five yields',     naive_yield)\n    ]) AS m\n    FROM\n    (\n        SELECT\n            100 * sum(income_usd) / sum(value_usd) AS weighted_yield,\n            avg(100 * income_usd / value_usd)      AS naive_yield\n        FROM holding\n    )\n)\nORDER BY yield_pct DESC","computed_at":"2026-08-22T04:18:19.846289+00:00","elapsed":0.059150954}