Strasmore Research
Learn Matt ConnorBy Matt Connor

How Monthly Stock Returns Are Measured

A monthly stock return depends on which two prices you pick and whether dividends count. The same June 2026 tape, measured under each convention, side by side.

Ask what a stock "did in June" and you will get different numbers from different sources — all of them correct. A monthly stock return is defined by two choices most people never see: which two prices mark the month's edges, and whether dividends count. This page runs the competing conventions on the same June 2026 tape, side by side, so the differences stop being mysterious.

Close-to-close: the standard convention

The convention used by index providers, fund fact sheets, and most quote pages: the month's return runs from the prior month's final regular-session closing price to this month's final close. May's last close is the starting line for June. Measured that way, alongside the main alternative:

QueryJune 2026 measured two ways — close-to-close vs open-to-close, NVDA and SPY
The exact SQL behind every number
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's June was -5.39% close-to-close — but -7.4% measured from June's first regular-session open to its last close. Same stock, same month, 2.01 percentage points between the two honest answers. The entire difference is one overnight+weekend window: NVDA closed May at $211.15 and opened June at $215.73 — that jump belongs to "June" in the open-to-close convention and to the boundary in close-to-close. SPY shows the same anatomy more gently: -1.33% close-to-close versus -1.2% open-to-close.

Neither number is wrong. Close-to-close answers "what did a continuing holder experience across the month boundary?" Open-to-close answers "what did the month's own trading deliver to someone who bought at the June open?" They differ whenever the market gaps across the boundary — and overnight gaps are routine, not rare.

Dividends: price return vs total return

The second choice: does the cash a stock paid out during the month count? A price return ignores it; a total return adds it back. For most single months the gap is small — a quarterly payer distributes roughly a quarter of its yield per quarter — but it compounds into a chasm over years, and June 2026 happened to be an SPY payment month:

QuerySPY June 2026 — price return vs total return (June ex-dividend included)
The exact SQL behind every number
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's June price return was -1.33%; add the $1.9035 per-share distribution that went ex-dividend during the month and the total return improves to -1.08% — a 0.25% contribution from cash. Index families publish both flavors (the "S&P 500" you see quoted is usually the price index), fund performance pages are required to show total return, and screeners mix the two freely. When two sources disagree by a few tenths on a dividend payer's month, the dividend is the first suspect — the ex-dividend date determines which month a payment belongs to.

Which "close" is the close?

One more boundary hides inside the conventions: the closing price itself. The number every fact sheet uses is the official closing-auction print — the single price set by the closing auction at 4:00 PM ET. But trading continues after hours, and the last print of the extended session can drift from the official close:

QuerySPY on June 30, 2026 — official-close vs the final extended-hours print
The exact SQL behind every number
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'
)

On June 30 the two differed by -0.003% — small that evening, but on an earnings night in a single stock the extended session can move percent-scale amounts that the official monthly return will assign to the next month. After-hours and premarket trading covers that boundary in detail.

Why the convention choice actually matters

Two practical consequences. First, comparisons are only valid convention-to-convention: judging a fund's month against an index requires both figures to be total return (or both price return), both close-to-close, both on official prints — mismatch any switch and the comparison quietly measures the switch instead of the performance. Second, longer horizons inherit the choice: a yearly return is the compounding of twelve monthly closes, so a convention difference that looks like rounding at one-month scale becomes a visible wedge over years — dividends alone separate long-run price and total return by large margins on any mature payer.

The checklist that reconciles any two sources

When two monthly return figures disagree, they almost always differ on one of three switches:

  1. Endpoints — close-to-close (the standard) or open-to-close (the month's own trading). Different whenever the boundary gapped.
  2. Dividends — price return or total return. Different in any month containing an ex-dividend date.
  3. The close itself — official auction print (the standard) versus a last trade that may include extended hours.

Run the same convention on both sources and the disagreement disappears. Our own June 2026 recap states its convention up front for exactly this reason — every monthly number there is close-to-close, official prints, price return.

Monthly returns FAQ

What is a close-to-close return?

The percentage change from the prior period's final regular-session closing price to this period's final close. It is the standard convention for daily, monthly, and yearly stock returns on fact sheets and index reports.

Why do two websites show different returns for the same stock and month?

Almost always one of three conventions: different endpoints (close-to-close vs open-to-close), dividends counted or not (total vs price return), or a different closing price source (official auction print vs last trade including extended hours). NVDA's June 2026 measures -5.39% or -7.4% on the first switch alone.

Do monthly stock returns include dividends?

Only total returns do. Price returns — including the headline S&P 500 index level — exclude them. In June 2026 the dividend added 0.25% to SPY's month, the gap between its price and total return.

Which price counts as a stock's official close?

The closing-auction print at 4:00 PM ET, set by each listing exchange's closing auction. Trades in the after-hours session print later prices, but the official close — and every return computed from it — comes from the auction.


Every figure above is a stored, versioned query on the real tape — expand any panel's SQL, or measure any ticker's month under any convention on the Strasmore terminal.

#returns#conventions#dividends#education