Strasmore Research
学习 Matt Connor作者: Matt Connor · data as of August 21, 2026 · refreshed weekly

Google Sheets 股息率计算:两种修复方法

GOOGLEFINANCE 不提供股息率属性。本文介绍两种可用公式:用已派股息计算过去十二个月股息率,以及用预期股息计算远期股息率。

要在 Google Sheets 中计算股息率,您需要自行构建这一数值。GOOGLEFINANCE 可返回价格、每股收益(EPS)、市盈率(PE)、市值及其他大量报价字段,但不包括股息率:=GOOGLEFINANCE("AAPL","yield") 返回 #N/A,其他拼写方式也无法解析。两种替代方法较为可靠。您可以根据表格中维护的股息数据计算过去十二个月股息率,也可以在单元格中输入已宣布的预期股息率,再进行除法运算。

为什么 GOOGLEFINANCE 没有股息率属性

该函数的属性分为两类。第一类是实时行情字段,需要两个参数调用:pricevolumepeepsmarketcaphigh52changepct,以及大约另外十几个字段。第二类是历史价格字段,需要输入日期或日期范围调用:openhighlowclosevolume。股息记录不属于这两类。没有任何属性会返回派息金额或派息历史,因此股息率的分子必须从函数外部获取。

股息率是每股年度股息除以每股价格,以百分比表示。价格这一项只需一个单元格。股息这一项才是计算的重点。如果您不熟悉这个比率,股息率实际衡量什么会先介绍其含义,再讲解电子表格的具体操作;如何计算股息率则会逐步说明计算过程。

下面是原始数据:过去大约三年内,每次派息的完整记录。每行包括一个除息日,即从该日开始,买入股票的投资者将无法获得即将发放的股息;旁边则是每股现金派息金额。

查询Coca-Cola每股股息支付额(按除息日)
每个数字背后的完整 SQL
SELECT
    toString(ex_dividend_date)                     AS ex_date,
    formatDateTime(ex_dividend_date, '%b %e, %Y')  AS ex_date_label,
    round(toFloat64(payment), 4)                   AS cash_amount,
    round(toFloat64(payment) * 4, 4)               AS annualized_run_rate
FROM
(
    SELECT
        ex_dividend_date,
        max(cash_amount) AS payment
    FROM global_markets.stocks_dividends
    WHERE ticker = 'KO'
      AND ex_dividend_date >= today() - 1120
      AND ex_dividend_date <= today()
    GROUP BY ex_dividend_date
)
ORDER BY ex_dividend_date
Run this yourself

Coca-Cola 在 Sep 14, 2023 每股派发 $0.46,在 Jun 15, 2026 每股派发 $0.53,这段期间共派息 12 次。图表中的第二条线,是将每次派息金额乘以四后的结果,表示如果该季度的派息全年保持不变,对应的年度派息率。该数值每年上调一次,其余时间保持不变。许多电子表格中的股息率错误,都源于没有处理好这种阶梯式变化。完整记录见Coca-Cola 的股息历史

在 Google Sheets 中获取股息率的两种方法

第一种方法是用自建数据列计算滚动股息率。在 A 列填入除息日,在 B 列填入每股现金分配。每笔分配占一行,然后使用以下公式:

  • 过去十二个月的分配总额:=SUMIFS($B$2:$B,$A$2:$A,">="&EDATE(TODAY(),-12),$A$2:$A,"<="&TODAY())
  • 实时价格:=GOOGLEFINANCE("KO","price")
  • 滚动股息率,并将单元格设置为百分比格式:=SUMIFS($B$2:$B,$A$2:$A,">="&EDATE(TODAY(),-12),$A$2:$A,"<="&TODAY())/GOOGLEFINANCE("KO","price")
  • 同一时间窗口内的分配次数,用于核对:=COUNTIFS($A$2:$A,">="&EDATE(TODAY(),-12),$A$2:$A,"<="&TODAY())

EDATE(TODAY(),-12)表示十二个月前的同一日,因此时间窗口会自动向前滚动。应将股息率单元格设置为百分比格式,而不是在公式中乘以 100。有些表格本应显示 2.9%,却会显示为 290%。

第二种方法是根据已宣布的分配率计算远期股息率。在 D2 中填入最近宣布的每股分配率,在 E2 中填入每年的分配次数:

  • 远期股息率:=D2*E2/GOOGLEFINANCE("KO","price")

D2 无法自动更新。董事会宣布分配率后,需要从公告中读取该数值并手动输入。这才是诚实的远期股息率计算方式。两种分子之间的选择,正是滚动股息率与远期股息率的核心区别。

关于该函数,还有两点说明。行情数据最多可能延迟 20 分钟。任意单元格的延迟时间可通过 =GOOGLEFINANCE("KO","datadelay") 读取。历史数据提取结果会返回一个 2×2 数组,而不是单个数值,因此需要进行封装:=INDEX(GOOGLEFINANCE("KO","close",DATE(2026,6,30)),2,2) 只返回收盘价。

年化步骤及其掩盖的错误

股息表格中最常见的错误公式,是将最近一次股息乘以四。只要公司提高股息,这一公式就会失效。加息后,过去十二个月的四次派息中有三次仍按旧标准执行;将最新股息乘以四,会高估股东实际收到的金额。

下方表格比较了八家大型派息公司的差异:每家公司过去十二个月的每股派息总额,以及最近一次派息乘以四后的金额。

查询过去一年实际支付的股息与最新一次支付额的四倍之差
每个数字背后的完整 SQL
SELECT
    ticker,
    round(toFloat64(sum(cash_amount)), 4)                          AS paid_last_12m,
    round(toFloat64(argMax(cash_amount, ex_dividend_date)) * 4, 4) AS latest_x4,
    round((toFloat64(argMax(cash_amount, ex_dividend_date)) * 4
           / toFloat64(sum(cash_amount)) - 1) * 100, 2)            AS gap_pct,
    count()                                                        AS payment_count
FROM
(
    SELECT
        ticker,
        ex_dividend_date,
        max(cash_amount) AS cash_amount
    FROM global_markets.stocks_dividends
    WHERE ticker IN ('KO', 'JNJ', 'PG', 'AAPL', 'MSFT', 'CVX', 'ABBV', 'IBM')
      AND ex_dividend_date >  today() - 365
      AND ex_dividend_date <= today()
    GROUP BY ticker, ex_dividend_date
)
GROUP BY ticker
ORDER BY gap_pct DESC
Run this yourself

按差额排序后,JNJ位居首位。该公司在统计区间内共派息4次,合计每股 $5.24;而最近一次派息乘以四为 $5.36,高出2.29%。对于股息率接近3%的股票,这种规模的误差会使显示的股息率偏高至少十分之一个百分点,足以改变排序结果。

派息次数列说明,在使用乘法前应先考虑SUMIFS。滚动十二个月区间并不总是包含四次季度派息。除息日每年会前后浮动几天,因此统计区间可能包含三次或五次派息。确认总额前,COUNTIFS会告诉你实际发生的是哪一种情况。

特别股息不是持续派息率

另一个典型错误,是把一次性支付当成定期派息的一部分。公司通过一次大额分配清理多余现金,SUMIFS 将其计入滚动总额,收益率单元格随之跳升。十二个月后,这一数字又会悄然回落。

这类支付并不少见。该面板逐月统计美国市场所有由股息日历标记为一次性支付、而非重复派息计划组成部分的股息支付。

查询按月列示的一次性支付(而非计划支付)
每个数字背后的完整 SQL
SELECT
    toString(month_start)                           AS month,
    formatDateTime(month_start, '%b %Y')            AS month_label,
    countIf(freq = '0')                             AS one_time_payments,
    round(countIf(freq = '0') / count() * 100, 2)   AS one_time_share_pct
FROM
(
    SELECT
        toStartOfMonth(ex_dividend_date)        AS month_start,
        ticker,
        ex_dividend_date,
        ifNull(toString(any(frequency)), 'na')  AS freq
    FROM global_markets.stocks_dividends
    WHERE ex_dividend_date >= toStartOfMonth(today() - 730)
      AND ex_dividend_date <  toStartOfMonth(today())
    GROUP BY month_start, ticker, ex_dividend_date
)
GROUP BY month_start
ORDER BY month
Run this yourself

Jul 2026(最近一个完整月份),有 111 笔支付带有一次性标记,占当月所有除息支付的 2.91%。滚动十二个月合计迟早会包含其中一笔。

解决办法是增加标记列。在每笔支付旁边的 C 列填入 regularspecial,然后将其作为筛选条件:

  • =SUMIFS($B$2:$B,$A$2:$A,">="&EDATE(TODAY(),-12),$A$2:$A,"<="&TODAY(),$C$2:$C,"regular")

保留工作表中的特别股息行。它们代表实际收到的现金,应纳入收款记录。但它们不应计入用于描述持续派息率的数字。

完成单元格的输出结果

按这种方式计算的滚动收益率包含两个部分,而且二者的变化节奏不同。股息总额每年只会变化几次,例如某笔分配进入或移出计算区间,或公司提高股息时。价格则每个交易日都会变化。下方面板按月运行了同一只派息证券过去两年的完整计算结果。

查询Coca-Cola过去12个月股息及滚动收益率(逐月)
每个数字背后的完整 SQL
WITH
    month_close AS
    (
        SELECT
            toLastDayOfMonth(date) AS month_end,
            argMax(close, date)    AS close_px
        FROM global_markets.stocks_daily_aggs
        WHERE ticker = 'KO'
          AND date >= toStartOfMonth(today() - 730)
          AND date <  toStartOfMonth(today())
        GROUP BY month_end
    ),
    payouts AS
    (
        SELECT
            ex_dividend_date,
            max(cash_amount) AS cash_amount
        FROM global_markets.stocks_dividends
        WHERE ticker = 'KO'
          AND ex_dividend_date >= today() - 1160
          AND ex_dividend_date <= today()
        GROUP BY ex_dividend_date
    )
SELECT
    toString(month_end)                       AS month,
    formatDateTime(month_end, '%b %Y')        AS month_label,
    round(ttm, 4)                             AS ttm_dividends,
    round(ttm / close_px * 100, 2)            AS trailing_yield_pct
FROM
(
    SELECT
        m.month_end                                   AS month_end,
        toFloat64(any(m.close_px))                    AS close_px,
        toFloat64(sumIf(p.cash_amount,
            (p.ex_dividend_date >  subtractYears(m.month_end, 1))
            AND (p.ex_dividend_date <= m.month_end))) AS ttm
    FROM month_close AS m
    CROSS JOIN payouts AS p
    GROUP BY m.month_end
)
ORDER BY month
Run this yourself

股息曲线呈阶梯状变化,随后保持平稳。收益率曲线则在同一期间逐月变化。在 Aug 2024,滚动股息总额为每股 $1.89,收益率为 2.61%;到 Jul 2026,股息总额为每股 $2.08,收益率为 2.37%。如果股息栏没有变化,收益率单元格却发生了变化,这正是滚动收益率的正常表现:分母发生了变化。

一个 ticker 完成后,将该区块向下复制到每个持仓,并按市值对结果加权,而不是简单计算收益率平均值。这一步称为投资组合加权股息收益率

常见问题

GOOGLEFINANCE 是否提供股息率属性?

不提供。该函数涵盖实时行情字段和历史价格,但其中没有股息或收益率字段。=GOOGLEFINANCE("KO","yield") 返回 #N/A。表格中的收益率,需要用您提供的股息数据除以该函数返回的价格计算。

如何在 Google Sheets 中计算滚动股息率?

将除息日保存在一列,将每股现金股息保存在下一列。使用 =SUMIFS($B$2:$B,$A$2:$A,">="&EDATE(TODAY(),-12),$A$2:$A,"<="&TODAY()) 汇总过去十二个月的股息,再用该合计值除以 =GOOGLEFINANCE("KO","price"),并将结果单元格设置为百分比格式。

为什么我的股息率与券商页面上的不同?

最常见的原因是分子不同。显示远期股息率的页面,会将当前已宣布的股息率年化;而按十二个月计算的 SUMIFS 返回的是滚动股息率,其中仍可能包含按旧股息率支付的股息。如果统计区间内包含特别股息,差异会进一步扩大。

如何将特别股息排除在股息率之外?

增加一列,标记每笔股息属于常规股息还是特别股息。然后在 SUMIFS 中将该列作为额外的条件范围和条件参数传入。特别股息仍保留在表格中,但不会计入股息率。

Google Sheets 能否自动提取股息历史?

不能通过 GOOGLEFINANCE 提取。股息列需要手动维护,或从公布股息支付记录的来源粘贴导入。这是本页两种方法中唯一需要手动完成的步骤。


本页每个面板都附有生成该面板的 SQL。打开面板即可准确查看合计值的计算方式。您也可以在 Strasmore terminal 中用自然语言提出相同问题。

#dividend yield#google sheets#spreadsheets#股息#tools