{"slug":"portfolio-weighted-dividend-yield","qid":"basket","label":"A five-name portfolio: share of value against share of income","post_title":"Portfolio Dividend Yield: Weighted Average","post_url":"/blog/portfolio-weighted-dividend-yield#q-basket","columns":["symbol","weight_pct","income_share_pct","yield_pct"],"rows":[{"symbol":"MSFT","weight_pct":29.9,"income_share_pct":10.2,"yield_pct":0.76},{"symbol":"XOM","weight_pct":27.4,"income_share_pct":30.7,"yield_pct":2.49},{"symbol":"KO","weight_pct":18.7,"income_share_pct":19.4,"yield_pct":2.3},{"symbol":"PG","weight_pct":17.8,"income_share_pct":24,"yield_pct":3},{"symbol":"VZ","weight_pct":6.1,"income_share_pct":15.6,"yield_pct":5.7}],"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.ticker         AS ticker,\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    h.ticker                                      AS symbol,\n    round(100 * h.value_usd  / t.total_value,  1) AS weight_pct,\n    round(100 * h.income_usd / t.total_income, 1) AS income_share_pct,\n    round(100 * h.income_usd / h.value_usd,    2) AS yield_pct\nFROM holding AS h\nCROSS JOIN\n(\n    SELECT\n        sum(value_usd)  AS total_value,\n        sum(income_usd) AS total_income\n    FROM holding\n) AS t\nORDER BY weight_pct DESC","computed_at":"2026-08-22T04:18:19.695428+00:00","elapsed":0.095861049}