The 7-5-3-1 Rule in Mutual Funds, Tested
The eight weakest seven-year windows on SPY, dividends counted as cashtable ·
2026-09-17 · 8×6
A flat 500-a-month SIP against the same plan stepped up 10% a year, contributions onlytable ·
2026-09-17 · 10×5
Rolling seven-year returns on SPY, one window per start monthseries ·
2026-09-17 · 193×5
Where the seven-year windows landed: SPY windows by return band, dividends countedranking ·
2026-09-17 · 5×3
The eight weakest seven-year windows on SPY, dividends counted as cash
The eight weakest seven-year windows on SPY, dividends counted as cash
| start_label | end_label | start_close | end_close | price_return_pct | with_dividends_pct |
|---|---|---|---|---|---|
| Oct 2004 | Oct 2011 | 113.65 | 109.93 | -3.3 | 7 |
| Dec 2004 | Dec 2011 | 119.23 | 124.97 | 4.8 | 14.6 |
| Sep 2003 | Sep 2010 | 101.96 | 108.46 | 6.4 | 14.8 |
| Jan 2005 | Jan 2012 | 120.3 | 127.5 | 6 | 16.3 |
| Jun 2005 | Jun 2012 | 120.5 | 128.16 | 6.4 | 17.2 |
| Nov 2004 | Nov 2011 | 113.51 | 122 | 7.5 | 17.8 |
| Sep 2004 | Sep 2011 | 111.32 | 120.94 | 8.6 | 18.6 |
| Nov 2003 | Nov 2010 | 105.99 | 118.53 | 11.8 | 20.5 |
the exact SQL behind every number
WITH
monthly AS
(
SELECT
toStartOfMonth(date) AS month_start,
toDate(min(date)) AS first_session,
argMin(toFloat64(close), date) AS first_close
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
GROUP BY month_start
),
divs AS
(
SELECT
toStartOfMonth(ex_dividend_date) AS month_start,
sum(cash) AS month_cash
FROM
(
SELECT
ex_dividend_date,
max(toFloat64(cash_amount)) AS cash
FROM global_markets.stocks_dividends
WHERE ticker = 'SPY'
GROUP BY ex_dividend_date
)
GROUP BY month_start
),
grid AS
(
SELECT
m.month_start AS month_start,
m.first_session AS first_session,
m.first_close AS first_close,
addMonths(m.month_start, 84) AS end_month,
sum(ifNull(d.month_cash, 0)) OVER (ORDER BY m.month_start ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS cash_before
FROM monthly AS m
LEFT JOIN divs AS d ON d.month_start = m.month_start
)
SELECT
formatDateTime(s.first_session, '%b %Y') AS start_label,
formatDateTime(e.first_session, '%b %Y') AS end_label,
round(s.first_close, 2) AS start_close,
round(e.first_close, 2) AS end_close,
round((e.first_close / s.first_close - 1) * 100, 1) AS price_return_pct,
round(((e.first_close + e.cash_before - s.cash_before) / s.first_close - 1) * 100, 1) AS with_dividends_pct
FROM grid AS s
INNER JOIN grid AS e ON e.month_start = s.end_month
ORDER BY with_dividends_pct ASC, s.month_start ASC
LIMIT 8
More from this analysisThe 7-5-3-1 Rule in Mutual Funds, Tested
A flat 500-a-month SIP against the same plan stepped up 10% a year, contributions only
table 10×5
→
Rolling seven-year returns on SPY, one window per start month
series 193×5
→
Where the seven-year windows landed: SPY windows by return band, dividends counted
ranking 5×3
→
Small AAPL print sizes: five sessions in January 2026 against five in July 2026
table 26×3
→
See all 3,293 queries →