Google Sheets 股息率计算:两种修复方法
GOOGLEFINANCE 不提供股息率属性。本文介绍两种可用公式:用已派股息计算过去十二个月股息率,以及用预期股息计算远期股息率。
要在 Google Sheets 中计算股息率,您需要自行构建这一数值。GOOGLEFINANCE 可返回价格、每股收益(EPS)、市盈率(PE)、市值及其他大量报价字段,但不包括股息率:=GOOGLEFINANCE("AAPL","yield") 返回 #N/A,其他拼写方式也无法解析。两种替代方法较为可靠。您可以根据表格中维护的股息数据计算过去十二个月股息率,也可以在单元格中输入已宣布的预期股息率,再进行除法运算。
为什么 GOOGLEFINANCE 没有股息率属性
该函数的属性分为两类。第一类是实时行情字段,需要两个参数调用:price、volume、pe、eps、marketcap、high52、changepct,以及大约另外十几个字段。第二类是历史价格字段,需要输入日期或日期范围调用:open、high、low、close、volume。股息记录不属于这两类。没有任何属性会返回派息金额或派息历史,因此股息率的分子必须从函数外部获取。
股息率是每股年度股息除以每股价格,以百分比表示。价格这一项只需一个单元格。股息这一项才是计算的重点。如果您不熟悉这个比率,股息率实际衡量什么会先介绍其含义,再讲解电子表格的具体操作;如何计算股息率则会逐步说明计算过程。
下面是原始数据:过去大约三年内,每次派息的完整记录。每行包括一个除息日,即从该日开始,买入股票的投资者将无法获得即将发放的股息;旁边则是每股现金派息金额。
每个数字背后的完整 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_dateCoca-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按差额排序后,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在 Jul 2026(最近一个完整月份),有 111 笔支付带有一次性标记,占当月所有除息支付的 2.91%。滚动十二个月合计迟早会包含其中一笔。
解决办法是增加标记列。在每笔支付旁边的 C 列填入 regular 或 special,然后将其作为筛选条件:
=SUMIFS($B$2:$B,$A$2:$A,">="&EDATE(TODAY(),-12),$A$2:$A,"<="&TODAY(),$C$2:$C,"regular")
保留工作表中的特别股息行。它们代表实际收到的现金,应纳入收款记录。但它们不应计入用于描述持续派息率的数字。
完成单元格的输出结果
按这种方式计算的滚动收益率包含两个部分,而且二者的变化节奏不同。股息总额每年只会变化几次,例如某笔分配进入或移出计算区间,或公司提高股息时。价格则每个交易日都会变化。下方面板按月运行了同一只派息证券过去两年的完整计算结果。
每个数字背后的完整 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股息曲线呈阶梯状变化,随后保持平稳。收益率曲线则在同一期间逐月变化。在 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 中用自然语言提出相同问题。