STRASMORE/EXPLORE 2,309 QUERIES

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.

as of table 8×6read in context →
worst_windows — 8 rows by 6 columns, computed from US exchange, SIP and OPRA data.
start_labelend_labelstart_closeend_closeprice_return_pctwith_dividends_pct
Oct 2004Oct 2011113.65109.93-3.37
Dec 2004Dec 2011119.23124.974.814.6
Sep 2003Sep 2010101.96108.466.414.8
Jan 2005Jan 2012120.3127.5616.3
Jun 2005Jun 2012120.5128.166.417.2
Nov 2004Nov 2011113.511227.517.8
Sep 2004Sep 2011111.32120.948.618.6
Nov 2003Nov 2010105.99118.5311.820.5
Rows × columns
8 × 6
Computed
Completeness
No missing values
Source
US exchange, SIP and OPRA market data
Licence
Strasmore terms · free, no signup
Formats
JSON · CSV · the SQL below

What each column holds

Column definitions for worst_windows, derived from the stored result.
ColumnTypeRangeNotes
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 →