Maandelijks rendement van aandelen berekenen
Ontdek hoe u het maandelijkse rendement van een aandeel bepaalt op basis van slotkoersen, dividenden en de impact van splits op de koersreeks.
Als u vraagt naar het rendement van een aandeel in juni, krijgt u verschillende cijfers van verschillende bronnen — en ze zijn allemaal correct. Het maandelijkse rendement van een aandeel wordt bepaald door keuzes die de meeste mensen niet zien: welke twee prijzen de grenzen van de maand markeren, of dividenden worden meegeteld, en of de koersreeks is aangepast voor splits. Deze pagina vergelijkt de verschillende conventies met de daadwerkelijke koersgegevens, zodat de verschillen niet langer mysterieus zijn.
Close-to-close: de standaardconventie
De conventie die wordt gebruikt door indexaanbieders, fund fact sheets en de meeste quotepagina's: het rendement van de maand loopt van de laatste reguliere slotkoers van de voorafgaande maand naar de laatste slotkoers van deze maand. De laatste slotkoers van mei is het startpunt voor juni. De berekening is eenvoudig: de eindkoers minus de startkoers, gedeeld door de startkoors. Een eenvoudig voorbeeld: een aandeel dat mei afsluit op $50.00 en juni afsluit op $53.50, heeft een rendement van (53.50 − 50.00) ÷ 50.00 = 0.07, oftewel 7% voor die maand. Elke conventie op deze pagina gebruikt verschillende inputs voor dezelfde formule. Hieronder volgt de toepassing op de werkelijke juni 2026 data, naast het belangrijkste alternatief:
De exacte SQL achter elk getal
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 tickerHet resultaat voor NVDA in juni was -5.39% close-to-close — maar -7.4% gemeten van de eerste reguliere opening in juni tot de laatste slotkoers. Dezelfde aandeel, dezelfde maand, 2.01 procentpunten verschil tussen de twee correcte antwoorden. Het volledige verschil wordt veroorzaakt door één overnight+weekend window: NVDA sloot mei op $211.15 en opende juni op $215.73 — die sprong behoort tot "juni" in de open-to-close conventie en tot de grens in de close-to-close conventie. SPY laat dezelfde structuur op een minder extreme wijze zien: -1.33% close-to-close versus -1.2% open-to-close.
Geen van beide getallen is onjuist. Close-to-close beantwoordt de vraag: "wat ervoer een aandeelhouder die de positie vasthield over de maandgrens heen?" Open-to-close beantwoordt de vraag: "wat leverde de handel in de maand zelf op voor iemand die kocht bij de opening van juni?" Ze verschillen zodra de markt een gap vertoont over de grens — en overnight gaps komen regelmatig voor.
Dividenden: price return versus total return
De tweede optie: telt het contante dividend dat een aandeel gedurende de maand heeft uitgekeerd mee? Een price return negeert dit; een total return voegt dit toe. Voor de meeste individuele maanden is het verschil klein — een kwartaalbetaler keert ongeveer een kwart van zijn yield per kwartaal uit — maar over jaren heen groeit dit uit tot een groot gat, en juni 2026 was toevallig een maand waarin SPY uitkeerde:
De exacte SQL achter elk getal
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 dvDe price return van SPY in juni was -1.33%; voeg de distributie van $1.9035 per aandeel toe die die maand ex-dividend ging en de total return stijgt naar -1.08% — een bijdrage van 0.25% uit cash. Indexfamilies publiceren beide varianten (de "S&P 500" die u ziet staan is meestal de price index), fondsen zijn verplicht om de total return te tonen op prestatiepagina's, en screeners gebruiken beide vormen vrijelijk. Wanneer twee bronnen enkele tienden verschillen over een maand van een dividendbetaler, is het dividend de eerste verdachte — de ex-dividend datum bepaalt aan welke maand een betaling toebehoort.
Eén enkele maand juni betreft slechts tienden van een procent. De tijdshorizon is wat de twee conventies scheidt — hier is dezelfde berekening over een periode van vijf jaar:
De exacte SQL achter elk getal
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 dvVan de slotkoers in juni 2021 van $428.07 naar de slotkoers in juni 2026 van $746.32, bedraagt de vijfjarige price return van SPY 74.35%. Over dezelfde periode keerde het 20 distributies uit met een totaal van $34.07 per aandeel; het meerekenen van die cash verhoogt het cijfer naar 82.3% — een verschil van 7.96 basis points voordat een enkel dividend wordt geherinvesteerd. Een echte total-return index herinvesteert elke betaling op de ex-datum, en de geherinvesteerde aandelen maken het verschil nog groter. Bij een volwassen dividendbetaler is "grote marges" geen metafoor; het is het standaardresultaat van jarenlange kwartaalbetalingen in cash.
Adjusted close versus raw close: de split-valstrik
De meeste grafiektools — Yahoo Finance, Google Finance en de meeste broker-apps — tonen een adjusted close: een historische prijsreeks waarbij eerdere koersen zijn gecorrigeerd voor splits (en op sommige platforms ook voor dividenden), zodat de lijn door de tijd heen vergelijkbaar blijft. Onze database slaat de koersen op zoals ze daadwerkelijk zijn genoteerd. In een normale maand komen deze twee overeen. In een maand met een stock split geven ze echter totaal verschillende resultaten — zoals de 10-voor-1 split van NVDA op 10 juni 2024:
De exacte SQL achter elk getal
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 spOp basis van de raw koersen "daalde" NVDA die juni van $1097.46 naar $123.41 — een daling van -88.75%. Dit is niet gebeurd: op de datum van de split werd elke oude aandeel 10 nieuwe aandelen, waarbij de prijs evenredig daalde om de waarde voor elke houder gelijk te houden. Declusie van de mei-sluiting met dezelfde ratio — $109.75 op een split-adjusted basis — resulteert in een stijging van 12.45% in juni 2024. Elke bron die adjusted data gebruikt, rapporteert een waarde die dicht bij het tweede getal ligt; een naïeve berekening op basis van raw koersen rapporteert het eerste getal. De adjusted close is de meest voorkomende reden waarom twee bronnen sterk verschillen in een historische maandelijkse return — wanneer een cijfer onmogelijk groot lijkt in welke richting dan ook, controleer dan eerst de split kalender.
Welke "close" is de werkelijke close?
Binnen de conventies bestaat nog een extra grens: de closing price zelf. De waarde die in elk fact sheet wordt gebruikt, is de officiële prijs uit de closing auction — de enkele prijs die door de closing auction om 16:00 uur ET wordt vastgesteld. Omdat de handel na de reguliere sessie doorgaat, kan de laatste print van de extended session afwijken van de officiële close:
De exacte SQL achter elk getal
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'
)Op 30 juni was het verschil -0.003% — klein die avond, maar tijdens een earnings night in een individueel aandeel kan de extended session verschuivingen van een percentage-schaal veroorzaken die de officiële maandelijkse return aan de volgende maand toewijst. After-hours en premarket trading behandelt deze grens in detail. Een gerelateerde uitzondering: maandgrenzen vallen soms samen met een verkorte handelsdag door een feestdag. Op die dagen eindigt de reguliere handel om 13:00 uur ET en wordt de officiële close vastgesteld in een vroege closing auction — de market holiday schedule bevat het overzicht hiervan.
Samengestelde rente over twaalf maanden
Een jaarlijks rendement is niet de som van twaalf maandelijkse rendementen — het is hun product. De formule voor de koppeling: zet elke maand om in een groeifactor (1 + rendement), vermenigvuldig de twaalf factoren met elkaar en trek 1 af. Een maand van −5% gevolgd door een maand van +5% komt op nul uit bij optellen, maar resulteert in een compound van 0,95 × 1,05 − 1 = −0,25%. Hieronder staat het werkelijke maandelijkse verloop van SPY over de twaalf maanden eindigend in juni 2026:
De exacte SQL achter elk getal
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_startTwaalf maanden van close-to-close, van 2.28% in 2025-07 tot -1.33% in 2026-06 — de laatste rij is hetzelfde SPY juni 2026-cijfer dat in het eerste paneel werd gemeten. Koppel de twaalf maanden correct en vergelijk dit met de methode waarbij enkel de percentages worden opgeteld:
De exacte SQL achter elk getal
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)De twaalf maanden tellen op tot 19.83%, maar de compound is 20.79% — en de directe berekening, van de close van juni 2025 naar de close van juni 2026, geeft 20.79%, wat overeenkomt met het gecompounde cijfer in plaats van de som. Het verschil is hier 0.96 basispunten in een relatief rustig jaar; dit verschil wordt groter bij hogere volatiliteit en een langere horizon. Het optellen van maandelijkse percentages is een veelvoorkomende gewoonte in spreadsheets, maar het is onjuist.
De laatste twee kolommen tonen de conventie die is ontwikkeld voor optelling: het log return, het natuurlijke logaritme van de groeifactor, ln(1 + rendement). Maandelijkse log returns tellen op tot 18.89% — identiek aan het twaalfmaands log return van 18.89%, wat precies de reden is waarom analisten en risicomodellen deze gebruiken. Bij kleine maandelijkse schommelingen verschillen de twee conventies nauwelijks (2025-11: 0.21% simpel, 0.21% log); hoe groter de maand, hoe groter het verschil (2026-04: 10.49% simpel, 9.97% log). Fund fact sheets vermelden simple returns; log returns worden gebruikt in onderzoeksrapporten en volatiliteitsberekeningen.
De checklist voor het reconciliëren van twee bronnen
Wanneer twee maandelijkse rendementscijfers afwijken, ligt de oorzaak bijna altijd bij een van de volgende vier parameters:
- Endpoints — close-to-close (de standaard) of open-to-close (de handel binnen de maand zelf). De resultaten verschillen zodra er een gap in de koers zit bij de grens.
- Dividends — price return of total return. De cijfers verschillen in elke maand met een ex-dividend datum.
- Adjustment — raw prints of de adjusted-close serie. De resultaten verschillen sterk in elke maand met een stock split.
- De close zelf — de officiële auction print (de standaard) versus de laatste trade, die mogelijk ook handel buiten de reguliere uren bevat.
Pas dezelfde parameters toe op beide bronnen en het verschil verdwijnt. Een vergelijking tussen een fund en een index is alleen geldig als beide cijfers dezelfde vier instellingen gebruiken; een mismatch zorgt ervoor dat de vergelijking de parameter meet in plaats van de performance. Onze eigen recap van juni 2026 vermeldt de conventie vooraf om precies deze reden — elk maandelijks cijfer daar is close-to-close, officiële prints, price return.
FAQ over maandelijkse returns
Wat is een close-to-close return?
De procentuele verandering van de laatste reguliere slotkoers van de voorgaande periode naar de laatste slotkoers van de huidige periode. Dit is de standaardconventie voor dagelijkse, maandelijkse en jaarlijkse aandelenreturns op fact sheets en indexrapporten.
Waarom tonen twee websites verschillende returns voor hetzelfde aandeel en dezelfde maand?
Dit komt bijna altijd door een van de volgende vier conventies: verschillende eindpunten (close-to-close versus open-to-close), het wel of niet meetellen van dividenden, ruwe prijzen versus split-adjusted prijzen, of een andere bron voor de slotkoers. De juni 2026-cijfers van NVDA meten -5.39% of -7.4% bij de eerste switch alleen al.
Verandert een stock split de berekening van een maandelijkse return?
Dat zou niet moeten gebeuren — een split verandert het aantal aandelen en de prijs gelijktijdig, waardoor de waarde van de positie ongewijzigd blijft — maar het maakt elke berekening op basis van ruwe prijzen onjuist. De juni 2024-cijfers van NVDA lijken op -88.75% op basis van ruwe closes en meten 12.45% zodra de 10-voor-1 split is verwerkt.
Zijn maandelijkse aandelenreturns inclusief dividenden?
Alleen total returns zijn dat. Price returns — inclusief het hoofdniveau van de S&P 500 index — sluiten deze uit. In juni 2026 voegde het dividend 0.25% toe aan de maand van SPY, het verschil tussen de price return en de total return.
Wordt de maandelijkse return van mijn persoonlijke portfolio op dezelfde manier berekend?
Niet zodra er cash wordt gestort of opgenomen. Returns van individuele effecten, zoals die op deze pagina, zijn time-weighted; een rekening met stortingen en opnames vereist een money-weighted (internal-rate-of-return) berekening, anders doen de cash flows zich voor als performance. De meeste brokers rapporteren een time-weighted cijfer om uw stortingen uit het getal te filteren.
Elk bovenstaand cijfer is een opgeslagen, versiesgewijze query op de real tape — breid de SQL van een paneel uit, of meet de maand van een ticker onder een willekeurige conventie op de Strasmore terminal.