Strasmore Research
学习 Matt Connor作者: Matt Connor · 更新于 2026-08-08 · data as of August 8, 2026 · refreshed weekly

如何计算投资组合股息率:市值加权平均

了解如何用年度股息总收入除以投资组合市值计算股息率,并看懂为何简单平均股息率会高估收入,以及市值加权如何纠正这一问题。

您的投资组合股息率是一个单一数值:持仓预期支付的年度股息总额,除以这些持仓的总市值。换一种写法,它是各持仓股息率按市值加权后的平均值,其中每个持仓的权重,是其美元市值占组合总市值的比例。券商界面上对股息率一栏取简单平均,得到的是另一个数值,而且在大多数实际投资组合中,那个数值会显得更高。

如何计算投资组合股息率

对每个持仓,将股数乘以每股年度股息,得到该持仓的年度美元收入。把所有持仓的年度收入相加,再除以所有持仓的股数乘以价格之和,最后乘以 100。这就是完整计算过程,无论持有四只股票还是四十只股票,方法都一样。

有两种等价的写法:

  • 年度总收入除以投资组合总市值。
  • 对所有持仓,将市值权重乘以股息率后求和。其中,权重等于持仓市值除以投资组合市值。

第二种写法说明了简单平均为何会出错。两种计算都包含每个持仓,但正确计算会按照各持仓的美元市值赋予权重,而不是让每个持仓各有一票。如果您将现金视为投资组合的一部分,现金也应计入分母。排除现金会在没有增加任何收入的情况下抬高显示的股息率。对于单只股票的计算方法,请先参阅如何计算股息率

为何对股息率一栏取平均会高估收入

通过一个具体示例,可以更直观地看出两种方法的差异。下面的脚本使用原生 Python 3,没有导入任何模块。任何安装了 python3 的设备都可以运行。五个持仓均为假设数据,数值取整,以便清楚展示影响:股票名称、股数、价格和每股年度股息。

#!/usr/bin/env python3
# each row: (name, shares, price, annual dividend per share)
holdings = [
    ('A', 200,  50.00, 1.50),
    ('B', 150, 100.00, 2.00),
    ('C', 100,  80.00, 0.80),
    ('D', 300,  20.00, 1.00),
    ('E', 100,  10.00, 0.90),
]

total_value  = sum(sh * px for _, sh, px, _ in holdings)
total_income = sum(sh * dps for _, sh, _, dps in holdings)
naive        = sum(100 * dps / px for _, _, px, dps in holdings) / len(holdings)

print(f'market value      : ${total_value:,.2f}')
print(f'annual income     : ${total_income:,.2f}')
print(f'portfolio yield   : {100 * total_income / total_value:.2f}%')
print(f'average of yields : {naive:.2f}%')

for name, sh, px, dps in holdings:
    value = sh * px
    income = sh * dps
    print(
        f'{name}  weight {100 * value / total_value:5.1f}%'
        f'  yield {100 * dps / px:5.2f}%'
        f'  income ${income:8,.2f}'
        f'  share of income {100 * income / total_income:5.1f}%'
    )

运行脚本后,两项核心结果会出现明显差异。该投资组合持有价值 40,000 美元的股票,年度股息收入为 1,070 美元,对应的加权股息率为 2.68%。五只股票股息率的简单平均值却为 4.00%,约为前者的一点五倍。

持仓 E 说明了全部问题。它的股息率为 9.00%,是组合中最高的,但股票市值只有 1,000 美元,仅占组合市值的 2.5%,却贡献了 8.4%的股息收入。在简单平均中,它占有五分之一的权重,与旁边市值 15,000 美元的持仓完全相同。只有将股息率与其背后的美元市值联系起来,这个股息率才有实际意义。

实际持仓中的权重如何体现

家庭投资者常持有股息率差异较大的股票,因此权重计算方式十分重要。下方面板根据过去 12 个月已宣布的每股股息总额,除以最近一个交易日收盘价,计算每只股票的滚动股息率。

查询十家家庭股息支付者过去12个月股息率
每个数字背后的完整 SQL
WITH
    last_px AS
    (
        SELECT
            ticker,
            toFloat64(argMax(close, date))         AS px,
            formatDateTime(max(date), '%b %e, %Y') AS priced_through
        FROM global_markets.stocks_daily_aggs
        WHERE ticker IN ('AAPL', 'MSFT', 'HD', 'KO', 'PG', 'PEP', 'JNJ', 'XOM', 'CVX', 'VZ')
          AND date >= today() - 30
        GROUP BY ticker
    ),
    ttm_dps AS
    (
        SELECT
            ticker,
            sum(amount) AS dps
        FROM
        (
            SELECT
                ticker,
                id,
                toFloat64(any(cash_amount)) AS amount
            FROM global_markets.stocks_dividends
            WHERE ticker IN ('AAPL', 'MSFT', 'HD', 'KO', 'PG', 'PEP', 'JNJ', 'XOM', 'CVX', 'VZ')
              AND ex_dividend_date >  today() - 365
              AND ex_dividend_date <= today()
            GROUP BY ticker, id
        )
        GROUP BY ticker
    )
SELECT
    p.ticker                     AS symbol,
    round(d.dps, 2)              AS ttm_dividend_usd,
    round(100 * d.dps / p.px, 2) AS yield_pct,
    p.priced_through             AS priced_through
FROM last_px AS p
INNER JOIN ttm_dps AS d ON d.ticker = p.ticker
ORDER BY yield_pct DESC
Run this yourself

在这 10 只股票中,按 Aug 7, 2026 的价格计算,股息率从 5.96% 的 VZ0.34% 的 AAPL 不等。除非各持仓的美元市值恰好相等,否则由这类股票构成的投资组合,其股息率不会接近该栏数据的中点。

现在将其中五只股票按固定股数纳入投资组合,并将两个数值并列比较:每个持仓占组合市值的比例,以及其占年度股息收入的比例。

查询五只股票组合:价值占比与收入占比
每个数字背后的完整 SQL
WITH
    positions AS
    (
        SELECT
            tupleElement(p, 1)            AS ticker,
            toFloat64(tupleElement(p, 2)) AS shares
        FROM
        (
            SELECT arrayJoin([('MSFT', 30.), ('PG', 60.), ('XOM', 80.), ('KO', 100.), ('VZ', 60.)]) AS p
        )
    ),
    last_px AS
    (
        SELECT
            ticker,
            toFloat64(argMax(close, date)) AS px
        FROM global_markets.stocks_daily_aggs
        WHERE ticker IN ('MSFT', 'PG', 'XOM', 'KO', 'VZ')
          AND date >= today() - 30
        GROUP BY ticker
    ),
    ttm_dps AS
    (
        SELECT
            ticker,
            sum(amount) AS dps
        FROM
        (
            SELECT
                ticker,
                id,
                toFloat64(any(cash_amount)) AS amount
            FROM global_markets.stocks_dividends
            WHERE ticker IN ('MSFT', 'PG', 'XOM', 'KO', 'VZ')
              AND ex_dividend_date >  today() - 365
              AND ex_dividend_date <= today()
            GROUP BY ticker, id
        )
        GROUP BY ticker
    ),
    holding AS
    (
        SELECT
            pos.ticker         AS ticker,
            pos.shares * lp.px AS value_usd,
            pos.shares * d.dps AS income_usd
        FROM positions AS pos
        INNER JOIN last_px AS lp ON lp.ticker = pos.ticker
        INNER JOIN ttm_dps AS d  ON d.ticker  = pos.ticker
    )
SELECT
    h.ticker                                      AS symbol,
    round(100 * h.value_usd  / t.total_value,  1) AS weight_pct,
    round(100 * h.income_usd / t.total_income, 1) AS income_share_pct,
    round(100 * h.income_usd / h.value_usd,    2) AS yield_pct
FROM holding AS h
CROSS JOIN
(
    SELECT
        sum(value_usd)  AS total_value,
        sum(income_usd) AS total_income
    FROM holding
) AS t
ORDER BY weight_pct DESC
Run this yourself

实时价格下也会重复脚本中的结果。MSFT 是最大持仓,占市值的 31.4%,同时贡献 10% 的股息收入,股息率为 0.72%。另一端的 VZ 占市值 5.9%,贡献 15.7% 的股息收入,股息率为 5.96%。只要股息率不同,市值权重和收入占比就会出现差异。

用两种方法取平均,同样的五个持仓会得到两个不同答案。

查询同一五项持仓的两种平均值
每个数字背后的完整 SQL
WITH
    positions AS
    (
        SELECT
            tupleElement(p, 1)            AS ticker,
            toFloat64(tupleElement(p, 2)) AS shares
        FROM
        (
            SELECT arrayJoin([('MSFT', 30.), ('PG', 60.), ('XOM', 80.), ('KO', 100.), ('VZ', 60.)]) AS p
        )
    ),
    last_px AS
    (
        SELECT
            ticker,
            toFloat64(argMax(close, date)) AS px
        FROM global_markets.stocks_daily_aggs
        WHERE ticker IN ('MSFT', 'PG', 'XOM', 'KO', 'VZ')
          AND date >= today() - 30
        GROUP BY ticker
    ),
    ttm_dps AS
    (
        SELECT
            ticker,
            sum(amount) AS dps
        FROM
        (
            SELECT
                ticker,
                id,
                toFloat64(any(cash_amount)) AS amount
            FROM global_markets.stocks_dividends
            WHERE ticker IN ('MSFT', 'PG', 'XOM', 'KO', 'VZ')
              AND ex_dividend_date >  today() - 365
              AND ex_dividend_date <= today()
            GROUP BY ticker, id
        )
        GROUP BY ticker
    ),
    holding AS
    (
        SELECT
            pos.shares * lp.px AS value_usd,
            pos.shares * d.dps AS income_usd
        FROM positions AS pos
        INNER JOIN last_px AS lp ON lp.ticker = pos.ticker
        INNER JOIN ttm_dps AS d  ON d.ticker  = pos.ticker
    )
SELECT
    tupleElement(m, 1)           AS method,
    round(tupleElement(m, 2), 2) AS yield_pct
FROM
(
    SELECT arrayJoin([
        ('Market-value weighted portfolio yield', weighted_yield),
        ('Simple average of the five yields',     naive_yield)
    ]) AS m
    FROM
    (
        SELECT
            100 * sum(income_usd) / sum(value_usd) AS weighted_yield,
            avg(100 * income_usd / value_usd)      AS naive_yield
        FROM holding
    )
)
ORDER BY yield_pct DESC
Run this yourself

较高的 2.93% 是 Simple average of the five yields 数值。另一个数值为 2.24%。只有其中一个对应实际现金收入。将加权股息率乘以投资组合市值,即可还原年度收入。对简单平均值进行同样计算,得到的金额不会出现在任何对账单上。其方向具有结构性:当高股息率股票的持仓规模较小时,简单平均值会高于真实投资组合股息率;当高股息率股票的持仓规模较大时,简单平均值则会低于真实股息率。

成本收益率不是投资组合股息率

成本收益率以当前年度股息除以您的买入价格,而不是除以持仓当前市值。假设一只股票以 20 美元买入,目前价格为 80 美元,每股年度股息仍为 1.00 美元。其成本收益率为 5.00%,而当前股息率为 1.25%。股息收入金额没有变化,变化的只是分母。

这两个数值都合理,但回答的是不同问题。以当前市值为分母,可以说明投资组合在当前价格下的股息率,这也是可与良好股息率或美国国库券比较的指标。以成本基础为分母,则反映您过去进行的一笔买入交易。问题在于将两者混用在同一个投资组合总数中:近期买入的持仓使用当前股息率,持有十年的股票使用成本收益率。这种混合计算通常会将收益型投资组合的表面股息率提高一倍,而且与券商报告的任何指标都不一致。股息率陷阱介绍了另一种错觉,即股价大幅下跌后显示出很高的股息率。

滚动数据或前瞻数据会改变结果

上述每个数值都取决于分子中使用的股息数据。滚动股息率将过去 12 个月实际宣布的股息相加。前瞻股息率则将最近一次股息年化,通常是将最近一季的股息乘以四。对于调整过股息、或在年内派发过特别股息的股票,两者会出现差异;单个大额持仓就可能明显改变投资组合总结果。本文各面板使用滚动数据。滚动股息率与前瞻股息率说明了应在何时使用各项指标。

股息率是一个比率,现金收入则分批到账

加权股息率是年度比率,不代表实际派息时间表。同样的五个持仓会在少数几个集中月份派发股息,因为大多数美国公司按季度除息,除息日通常集中在相近的时间。

查询五只股票组合的股息收入(按月)
每个数字背后的完整 SQL
WITH
    positions AS
    (
        SELECT
            tupleElement(p, 1)            AS ticker,
            toFloat64(tupleElement(p, 2)) AS shares
        FROM
        (
            SELECT arrayJoin([('MSFT', 30.), ('PG', 60.), ('XOM', 80.), ('KO', 100.), ('VZ', 60.)]) AS p
        )
    ),
    payments AS
    (
        SELECT
            ticker,
            id,
            any(ex_dividend_date)       AS ex_date,
            toFloat64(any(cash_amount)) AS amount
        FROM global_markets.stocks_dividends
        WHERE ticker IN ('MSFT', 'PG', 'XOM', 'KO', 'VZ')
          AND ex_dividend_date >  today() - 365
          AND ex_dividend_date <= today()
        GROUP BY ticker, id
    )
SELECT
    formatDateTime(toStartOfMonth(pay.ex_date), '%Y-%m') AS month,
    formatDateTime(toStartOfMonth(pay.ex_date), '%b %Y') AS month_label,
    round(sum(pos.shares * pay.amount), 2)               AS income_usd
FROM payments AS pay
INNER JOIN positions AS pos ON pos.ticker = pay.ticker
GROUP BY month, month_label
ORDER BY month
Run this yourself

过去一年中,现金收入分布在 12 个月,最近一次发生在 Jul 2026,金额为 $107.76。几个百分点的投资组合股息率无法说明现金会在哪个月到账。因此,使用月度收入制定计划时,除了收益率,还需要查看派息日历。关于这些投资组合数据所对应的整体市场水平,请参阅标普 500 指数股息率

常见问题

如何计算整个投资组合的股息率?

将每个持仓的年度股息收入相加,即股数乘以每股年度股息;再将每个持仓的市值相加,即股数乘以价格。然后用总收入除以总市值,再乘以 100。结果就是各持仓股息率按市值加权后的平均值。

为什么各持仓股息率的平均值高于投资组合股息率?

简单平均让每个持仓各有一票。投资组合股息率则按照每个持仓的美元市值赋予权重。当最高股息率的股票是最小持仓时,简单平均值会高于投资组合实际产生的股息率,有时高出约一半。

现金是否计入投资组合股息率?

如果您将现金视为投资组合的一部分,现金应以零股息计入分母,这会降低股息率。排除现金,则反映仅投资部分的股息率。两种口径都可以,但每次计算都必须保持一致。

成本收益率是否等同于投资组合股息率?

不等同。成本收益率用当前股息除以多年前的买入价格,因此股价上涨时,该指标也会上升。投资组合股息率使用当前市值,这一指标才能与当前持仓产生的收入对应。

增加一只高股息率股票,会大幅提高投资组合股息率吗?

影响只取决于该股票在组合中的美元市值。一只股息率为 9%、占组合市值 2.5%的股票,会将加权股息率提高约 0.2 个百分点(0.09 乘以 0.025),但无论其对股息率一栏的简单平均值有何影响,结果都一样。


本文每个面板都附有生成结果的完整 SQL,因此可以逐行审查权重计算。若要对您自己的股票名单和持股数量运行相同计算,请在 Strasmore terminal 中用自然语言提出请求。

#dividend yield#portfolio#weighted average#income#calculation