Strasmore Research
学习 Matt Connor作者: Matt Connor · 更新于 2026-07-23

如何计算月度股票收益率

了解月度收益率的计算标准,包括价格选取、股息计入及拆股调整,通过真实数据对比消除数据差异。

询问某只股票“6 月的表现”时,不同来源的数据可能并不一致,但它们各自都是正确的。月度股票收益率取决于一些鲜为人知的定义标准:哪两个价格作为月份的起止点、是否计入股息,以及价格序列是否经过拆股调整。本页面通过对真实交易数据进行对比分析,展示了这些不同的计算惯例,旨在消除数据差异带来的困惑。

收盘价对比:标准惯例

指数提供商、基金说明书及大多数报价页面均采用此惯例:月度收益率计算范围从上月最后一个常规交易日的收盘价开始,到本月最后一个收盘价结束。5 月的最后收盘价即为 6 月的起点。计算公式很简单:(期末价 - 期初价) / 期初价。举个简单的例子:若某股票 5 月收盘价为 \$50.00,6 月收盘价为 \$53.50,则该月收益率为 (53.50 − 50.00) ÷ 50.00 = 0.07,即 7%。本页面提到的所有惯例,其输入参数各异,但最终都代入同一个公式。以下是 2026 年 6 月的真实数据,并与主要的另一种计算方式进行了对比:

查询2026年6月两种衡量方式 — 收盘价对比收盘价 vs 开盘价对比收盘价,NVDA 与 SPY
每个数字背后的完整 SQL
SELECT ticker,
       round(argMaxIf(cl, day, day <= '2026-05-31'), 2) AS may_final_close,
       round(argMinIf(op, day, day >= '2026-06-01'), 2) AS june_first_open,
       round(argMaxIf(cl, day, day <= '2026-06-30'), 2) AS june_final_close,
       round(100 * (argMaxIf(cl, day, day <= '2026-06-30') - argMaxIf(cl, day, day <= '2026-05-31'))
             / argMaxIf(cl, day, day <= '2026-05-31'), 2) AS close_to_close_pct,
       round(100 * (argMaxIf(cl, day, day <= '2026-06-30') - argMinIf(op, day, day >= '2026-06-01'))
             / argMinIf(op, day, day >= '2026-06-01'), 2) AS open_to_close_pct,
       round(abs(100 * (argMaxIf(cl, day, day <= '2026-06-30') - argMinIf(op, day, day >= '2026-06-01'))
                 / argMinIf(op, day, day >= '2026-06-01')
             - 100 * (argMaxIf(cl, day, day <= '2026-06-30') - argMaxIf(cl, day, day <= '2026-05-31'))
                 / argMaxIf(cl, day, day <= '2026-05-31')), 2) AS convention_gap_points
FROM (
    SELECT ticker,
               toDate(toTimeZone(window_start, 'America/New_York')) AS day,
               argMinIf(toFloat64(open), window_start, rth) AS op,
               argMaxIf(toFloat64(close), window_start, rth) AS cl
        FROM (
            SELECT ticker, window_start, open, close,
                   toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
                   AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York') AS rth
            FROM global_markets.delayed_stocks_minute_aggs
            WHERE ticker IN ('NVDA', 'SPY')
              AND window_start >= '2026-05-28 04:00:00'
              AND window_start < '2026-07-01 08:00:00'
        )
        GROUP BY ticker, day
)
GROUP BY ticker
ORDER BY ticker

NVDA 的 6 月收盘价收益率为 -5.39% —— 但若按 6 月首个常规交易日开盘价至最后收盘价计算,则为 -7.4%。同一只股票,同一月份,两个准确的答案之间存在 2.01 个百分点。差异完全源于一个隔夜加周末的时间窗口:NVDA 5 月收盘价为 \$211.15,6 月开盘价为 \$215.73 —— 在“开盘至收盘”惯例中,这一涨幅计入“6 月”;而在“收盘至收盘”惯例中,这属于边界值。SPY 的数据结构类似,但波动较小:收盘价收益率为 -1.33%,开盘价收益率为 -1.2%。

这两个数值都正确。“收盘价对比”回答的是:“持有者在跨月期间经历了什么?”“开盘价对比”回答的是:“在 6 月开盘时买入的人,该月交易带来了多少收益?”只要市场在边界处出现跳空,两者就会产生差异,而 隔夜跳空 是常态,而非例外。

股息:价格回报与总回报

第二种选择:股票当月派发的现金是否计入收益?价格回报不计入股息;总回报则将其重新计入。在大多数单月周期内,两者差距很小——季度派息公司每季仅发放约四分之一的年化收益率——但经过多年复利,差距会变得巨大。恰好 2026 年 6 月是 SPY 的派息月:

查询SPY 2026年6月 — 价格回报 vs 总回报(含6月除权)
每个数字背后的完整 SQL
WITH px AS (
    SELECT argMaxIf(cl, day, day <= '2026-05-31') AS may_close,
           argMaxIf(cl, day, day <= '2026-06-30') AS jun_close
    FROM (
        SELECT ticker,
               toDate(toTimeZone(window_start, 'America/New_York')) AS day,
               argMinIf(toFloat64(open), window_start, rth) AS op,
               argMaxIf(toFloat64(close), window_start, rth) AS cl
        FROM (
            SELECT ticker, window_start, open, close,
                   toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
                   AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York') AS rth
            FROM global_markets.delayed_stocks_minute_aggs
            WHERE ticker IN ('NVDA', 'SPY')
              AND window_start >= '2026-05-28 04:00:00'
              AND window_start < '2026-07-01 08:00:00'
        )
        GROUP BY ticker, day
    )
    WHERE ticker = 'SPY'
),
dv AS (
    SELECT sum(cash_amount) AS div_per_share
    FROM global_markets.stocks_dividends
    WHERE ticker = 'SPY'
      AND ex_dividend_date >= '2026-06-01'
      AND ex_dividend_date <= '2026-06-30'
)
SELECT round(may_close, 2) AS may_final_close,
       round(jun_close, 2) AS june_final_close,
       round(div_per_share, 4) AS june_dividend_per_share,
       round(100 * (jun_close - may_close) / may_close, 2) AS price_return_pct,
       round(100 * div_per_share / may_close, 2) AS dividend_contribution_pct,
       round(100 * ((jun_close + div_per_share) - may_close) / may_close, 2) AS total_return_pct
FROM px CROSS JOIN dv

SPY 6 月的价格回报为 -1.33%;加上该月除息的每股 1.9035 美元分红,总回报提升至 -1.08%——其中现金贡献了 0.25%。指数系列会同时发布这两种数据(您看到的“标普 500”通常指价格指数),基金业绩页面必须显示总回报,而选股器则会自由混用两者。当两个数据源在派息月的数值上出现零点几的偏差时,股息通常是首要原因——除息日决定了分红属于哪个月份。

单月的差距仅为零点几百分点。时间跨度才是区分这两种计算方式的关键——以下是相同算法在五年周期下的应用:

查询SPY 五年表现,2021年6月至2026年6月 — 价格回报 vs 含股息回报
每个数字背后的完整 SQL
WITH daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
           argMaxIf(toFloat64(close), window_start,
               toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
               AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York')) AS cl
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND ((window_start >= '2021-06-28 04:00:00' AND window_start < '2021-07-01 08:00:00')
        OR (window_start >= '2026-06-26 04:00:00' AND window_start < '2026-07-01 08:00:00'))
    GROUP BY day
),
px AS (
    SELECT argMaxIf(cl, day, day <= '2021-06-30') AS start_close,
           argMaxIf(cl, day, day <= '2026-06-30') AS end_close
    FROM daily
),
dv AS (
    SELECT round(sum(cash_amount), 2) AS divs_per_share,
           count() AS payments
    FROM global_markets.stocks_dividends
    WHERE ticker = 'SPY'
      AND ex_dividend_date >= '2021-07-01'
      AND ex_dividend_date <= '2026-06-30'
)
SELECT round(start_close, 2) AS june_2021_close,
       round(end_close, 2) AS june_2026_close,
       divs_per_share AS dividends_paid_per_share,
       payments AS dividend_payments,
       round(100 * (end_close - start_close) / start_close, 2) AS five_year_price_return_pct,
       round(100 * ((end_close + divs_per_share) - start_close) / start_close, 2) AS five_year_return_with_divs_pct,
       round(100 * divs_per_share / start_close, 2) AS dividend_points_added
FROM px CROSS JOIN dv

从 2021 年 6 月收盘价 428.07 美元到 2026 年 6 月收盘价 746.32 美元,SPY 的五年价格回报率为 74.35%。同期其派发的累计每股分红为 34.07 美元(共 20 次);计入该现金后,回报率升至 82.3%——在未进行股息再投资的情况下,差距为 7.96 个百分点。真正的总回报指数会在除息日将每笔分红进行再投资,再投资产生的股份会进一步拉大这一差距。对于成熟的派息股而言,“高利润率”并非修辞手法,而是多年季度现金分红带来的必然结果。

复权收盘价与原始收盘价:拆股陷阱

大多数图表工具(如 Yahoo Finance、Google Finance 及多数券商 App)报价使用的是复权收盘价。这是一种历史价格序列,通过对过往价格进行拆股调整(部分平台还会进行股息调整),使价格曲线在时间维度上具有可比性。而我们的数据库存储的是实际成交的原始价格。在常规月份,两者结果一致。但在发生拆股的月份,两者会呈现截然不同的走势——例如 NVDA 在 2024 年 6 月 10 日进行了 10 比 1 拆股:

查询NVDA 2024年6月 — 原始收盘价对比收盘价计算 vs 复权后回报
每个数字背后的完整 SQL
WITH px AS (
    SELECT argMaxIf(cl, day, day <= '2024-05-31') AS may_close,
           argMaxIf(cl, day, day <= '2024-06-30') AS jun_close
    FROM (
        SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
               argMaxIf(toFloat64(close), window_start,
                   toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
                   AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York')) AS cl
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'NVDA'
          AND window_start >= '2024-05-29 04:00:00'
          AND window_start < '2024-07-01 08:00:00'
        GROUP BY day
    )
),
sp AS (
    SELECT split_to / split_from AS ratio
    FROM global_markets.stocks_splits
    WHERE ticker = 'NVDA'
      AND execution_date >= '2024-06-01'
      AND execution_date <= '2024-06-30'
)
SELECT round(may_close, 2) AS may_final_close_raw,
       round(jun_close, 2) AS june_final_close_raw,
       toInt32(ratio) AS shares_after_split_per_old_share,
       round(100 * (jun_close - may_close) / may_close, 2) AS raw_price_change_pct,
       round(may_close / ratio, 2) AS may_close_split_adjusted,
       round(100 * (jun_close - may_close / ratio) / (may_close / ratio), 2) AS adjusted_return_pct
FROM px CROSS JOIN sp

若查看原始价格,NVDA 在该月从 $1097.46 “跌至” $123.41,跌幅达 -88.75%。但实际情况并非如此:在拆股执行日,每 1 股旧股变为 10 股新股,价格按比例下调,从而保持持仓总价值不变。若将 5 月收盘价按相同比例进行复权计算(即 $109.75),则 2024 年 6 月的涨幅为 12.45%。任何提供复权数据的来源都会报告接近第二个数值;而仅基于原始价格的简单计算则会得出第一个数值。复权收盘价是导致两个数据源在历史月度收益率上出现巨大差异的最常见原因。当数据出现异常大幅度的波动时,请务必先核对 拆股日历

究竟哪一个才是“收盘价”?

在交易惯例中还隐藏着一个界限:收盘价本身。所有业绩报告所使用的数值都是官方收盘竞价价格,即美东时间下午 4:00 由 收盘竞价 确定的单一价格。但盘后交易仍在继续,延长交易时段的最后成交价可能与官方收盘价存在偏差:

查询SPY 2026年6月30日 — 官方收盘价 vs 最终盘后交易价
每个数字背后的完整 SQL
SELECT round(argMaxIf(toFloat64(close), window_start, rth), 2) AS regular_session_close,
       round(argMax(toFloat64(close), window_start), 2) AS last_extended_print,
       round(100 * (argMax(toFloat64(close), window_start) - argMaxIf(toFloat64(close), window_start, rth))
             / argMaxIf(toFloat64(close), window_start, rth), 3) AS after_hours_drift_pct
FROM (
    SELECT window_start, close,
           toTimeZone(window_start, 'America/New_York') >= toDateTime('2026-06-30 09:30:00', 'America/New_York')
           AND toTimeZone(window_start, 'America/New_York') < toDateTime('2026-06-30 16:00:00', 'America/New_York') AS rth
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= '2026-06-30 04:00:00'
      AND window_start < '2026-07-01 08:00:00'
)

6 月 30 日,两者的差异为 -0.003% —— 当晚该差异较小,但在个股财报发布之夜,延长交易时段的波动可能达到百分比级别,而官方月度收益率会将这些波动计入下个月盘后与盘前交易 详细介绍了这一界限。另一个相关的极端情况:月末日期偶尔会落在交易时间缩短的节假日,此时常规交易在美东时间下午 1:00 结束,官方收盘价通过提前进行的收盘竞价产生 —— 市场节假日时间表 列出了这些安排。

十二个月的复利计算

年化收益率并非十二个月收益率的简单相加,而是它们的乘积。计算公式如下:将每月收益率转换为增长因子 (1 + 收益率),将这十二个因子相乘,最后减去 1。例如,若第一个月收益率为 -5%,第二个月为 +5%,两者相加为零,但复利计算结果为 0.95 × 1.05 − 1 = −0.25%。以下是截至 2026 年 6 月的 SPY 实际月度走势:

查询SPY 月度收盘价对比收盘价回报 — 截至2026年6月的十二个月,简单与对数回报
每个数字背后的完整 SQL
WITH daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
           argMaxIf(toFloat64(close), window_start,
               toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
               AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York')) AS cl
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= '2025-06-24 04:00:00'
      AND window_start < '2026-07-01 08:00:00'
    GROUP BY day
),
monthly AS (
    SELECT toStartOfMonth(day) AS month_start,
           argMax(cl, day) AS month_close
    FROM daily
    GROUP BY month_start
),
rets AS (
    SELECT month_start,
           formatDateTime(month_start, '%Y-%m') AS month,
           round(month_close, 2) AS month_final_close,
           100 * (month_close / lagInFrame(month_close) OVER (ORDER BY month_start) - 1) AS r
    FROM monthly
)
SELECT month,
       month_final_close,
       round(r, 2) AS simple_return_pct,
       round(100 * log(1 + r / 100), 2) AS log_return_pct
FROM rets
WHERE isFinite(r)
ORDER BY month_start

2025-072.28% 到 2026-06-1.33% 的十二个月收盘数据——最后一行与第一个面板中测算的 2026 年 6 月 SPY 数据一致。请将这十二个月进行复利关联,并与直接相加百分比的简便方法进行对比:

查询累加 vs 复利 — 三种方式关联的十二个月 SPY 月度回报
每个数字背后的完整 SQL
WITH daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
           argMaxIf(toFloat64(close), window_start,
               toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
               AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York')) AS cl
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= '2025-06-24 04:00:00'
      AND window_start < '2026-07-01 08:00:00'
    GROUP BY day
),
monthly AS (
    SELECT toStartOfMonth(day) AS month_start,
           argMax(cl, day) AS month_close
    FROM daily
    GROUP BY month_start
),
rets AS (
    SELECT month_start,
           100 * (month_close / lagInFrame(month_close) OVER (ORDER BY month_start) - 1) AS r
    FROM monthly
),
ends AS (
    SELECT argMin(month_close, month_start) AS base_close,
           argMax(month_close, month_start) AS final_close
    FROM monthly
)
SELECT count() AS months_linked,
       round(sum(r), 2) AS simple_sum_pct,
       round(100 * (exp(sum(log(1 + r / 100))) - 1), 2) AS geometric_compound_pct,
       round(100 * (any(final_close) / any(base_close) - 1), 2) AS direct_twelve_month_pct,
       round(100 * (exp(sum(log(1 + r / 100))) - 1) - sum(r), 2) AS compounding_gap_points,
       round(sum(100 * log(1 + r / 100)), 2) AS sum_of_monthly_log_returns_pct,
       round(100 * log(any(final_close) / any(base_close)), 2) AS twelve_month_log_return_pct
FROM rets CROSS JOIN ends
WHERE isFinite(r)

十二个月的收益率总和为 19.83%,但复利收益率为 20.79%。直接计算 2025 年 6 月收盘价至 2026 年 6 月收盘价的收益率为 20.79%,这与复利结果一致,而非简单的总和。在这样一个相对平稳的年份中,两者差距为 0.96 个百分点;随着波动率和时间跨度的增加,差距会进一步扩大。在电子表格中使用月度百分比直接相加是一种常见的错误习惯。

最后两列展示了另一种计算惯例:对数收益率,即增长因子的自然对数 ln(1 + 收益率)。月度对数收益率之和为 18.89%,这与十二个月的对数收益率 18.89% 完全一致,这也是分析师和风险模型使用它们的原因。对于波动较小的月份,两种计算方式几乎没有差异(2025-11: 0.21% 简单收益率, 0.21% 对数收益率);而月份波动越大,两者差异越明显(2026-04: 10.49% 简单收益率, 9.97% 对数收益率)。基金说明书通常引用简单收益率;对数收益率则广泛应用于研究报告和波动率数学计算中。

统一两种数据源的核对清单

当两个月度收益率数据不一致时,通常是因为以下四个变量设置不同:

  1. 时间边界 — 收盘价对比收盘价(标准做法)或开盘价对比收盘价(当月交易)。若边界存在跳空,结果就会不同。
  2. 股息 — 价格收益率或总收益率。若当月包含除权日,结果就会不同。
  3. 复权方式 — 原始价格或复权收盘价序列。若当月包含拆股,结果会有巨大差异。
  4. 收盘价定义 — 官方竞价收盘价(标准做法)或包含盘后交易的最后一笔成交价。

对两个数据源应用相同的变量设置,差异就会消失。只有当两者基于相同的四项设置时,基金与指数的对比才有效;若设置不匹配,对比结果衡量的是变量差异而非实际业绩。正因如此,我们的 2026年6月回顾 在开头就明确了其惯例:所有月度数据均采用收盘价对比收盘价、官方竞价收盘价以及价格收益率。

月度收益率常见问题解答

什么是收盘价收益率?

指从上一期间常规交易时段的最后收盘价到本期间最后收盘价的百分比变化。这是事实表和指数报告中计算日、月、年股票收益率的标准惯例。

为什么两个网站对同一只股票和月份的收益率显示不同?

通常由以下四种情况之一引起:计算终点不同(收盘价对收盘价 vs 开盘价对收盘价)、是否计入股息、使用原始价格还是拆股调整后价格,或者收盘价数据源不同。仅在首次切换时,NVDA 2026年6月的指标就会出现 -5.39% 或 -7.4% 的差异。

股票拆股会改变月度收益率计算吗?

理论上不会——拆股会同时改变股数和股价,从而保持持仓价值不变——但它会破坏基于原始价格进行的任何计算。NVDA 2024年6月的原始收盘价收益率为 -88.75%,而在进行 10 比 1 拆股调整后,其收益率为 12.45%。

月度股票收益率包含股息吗?

仅总收益率(Total Returns)包含股息。价格收益率(Price Returns)——包括标普 500 指数的主指数水平——不包含股息。2026年6月,股息为 SPY 带来了 0.25% 的月度增益,这是其价格收益率与总收益率之间的差距。

我个人投资组合的月度收益率计算方式相同吗?

一旦发生资金流入或流出,计算方式就不再相同。本页面显示的单只证券收益率采用时间加权法;而包含存款和取款的账户需要使用资金加权法(内部收益率)进行计算,否则现金流会误导业绩表现。大多数券商报告时间加权数据,正是为了从数值中剔除您的存款影响。


以上所有数据均为基于实时行情数据的存储版本查询——您可以展开任何面板的 SQL 语句,或在 Strasmore 终端上按任何惯例测量任何代码的月度数据。

#returns#conventions#股息#splits#education