worst_windows
Answered against 22 years of US equities and 12 years of US options data and published with the query that produced it. This result is stored as of 2026-09-17, from the-7-5-3-1-rule-mutual-funds.
| 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 |
- Rows × columns
- 8 × 6
- Computed
- Completeness
- No missing values
- Source
- US exchange, SIP and OPRA market data
- Licence
- Strasmore terms · free, no signup
What each column holds
| Column | Type | Range | Notes |
|---|---|---|---|
start_label |
text | 8 distinct values (Dec 2004, Jan 2005, Jun 2005…) | |
end_label |
text | 8 distinct values (Dec 2011, Jan 2012, Jun 2012…) | |
start_close |
number | 101.96 to 120.5 | US dollars |
end_close |
number | 108.46 to 128.16 | US dollars |
price_return_pct |
number | -3.3 to 11.8 | percent |
with_dividends_pct |
number | 7 to 20.5 | percent |
Computed from Strasmore's warehouse of US exchange, SIP and OPRA market data. Equity prices are delayed; options greeks and implied volatility are end-of-day. This result is stored, not recomputed on load — it is exactly the numbers that were returned on , and the query below is what returned them.
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
Run your own version of this
The same 22 years of US equities and 12 years of options data are queryable in SQL or plain English. A free account runs 100 queries a day and takes no card.
More from this analysisthe-7-5-3-1-rule-mutual-funds
step_up
table 10×5
→
rolling_7y
series 193×5
→
return_buckets
ranking 5×3
→
The 2s10s spread, every print of the half
table 124×2
→
The 2s10s spread, every print of the half
table 124×2
→
Every half-year since 1976: the 2y and 10y change, the twist between them, and the half's lowest 2s10s print
table 100×7
→
See all 2,309 queries →