STRASMORE/EXPLORE 3,293 QUERIES

Where the seven-year windows landed: SPY windows by return band, dividends counted

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 in Mutual Funds, Tested.

as of ranking 5×3read in context →
Where the seven-year windows landed: SPY windows by return band, dividends counted — 5 rows by 3 columns, computed from US exchange, SIP and OPRA data.
bucketwindow_countshare_pct
Below 0%00
0% to 25%178.8
25% to 50%3417.6
50% to 100%136.7
Above 100%12966.8
Rows × columns
5 × 3
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 Where the seven-year windows landed: SPY windows by return band, dividends counted, derived from the stored result.
ColumnTypeRangeNotes
bucket text 5 distinct values (0% to 25%, 25% to 50%, 50% to 100%…)
window_count number 0 to 129 count
share_pct number 0 to 66.8 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.

Run it yourself

This is the exact query behind the result above. Change a ticker, a date or a column and run it against the warehouse — no account, no key. The no-signup tier is smaller than the one this page was computed on; a query that reaches past it comes back saying which plan runs it.

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
    ),
    windows AS
    (
        SELECT
            ((e.first_close + e.cash_before - s.cash_before) / s.first_close - 1) * 100 AS ret
        FROM grid AS s
        INNER JOIN grid AS e ON e.month_start = s.end_month
    ),
    stats AS
    (
        SELECT
            count()                           AS total,
            countIf(ret < 0)                  AS below_zero,
            countIf(ret >= 0  AND ret < 25)   AS to_25,
            countIf(ret >= 25 AND ret < 50)   AS to_50,
            countIf(ret >= 50 AND ret < 100)  AS to_100,
            countIf(ret >= 100)               AS above_100
        FROM windows
    )
SELECT
    tupleElement(band, 1) AS bucket,
    tupleElement(band, 2) AS window_count,
    tupleElement(band, 3) AS share_pct
FROM stats
ARRAY JOIN
    [
        ('Below 0%',    below_zero, round(below_zero / total * 100, 1)),
        ('0% to 25%',   to_25,      round(to_25 / total * 100, 1)),
        ('25% to 50%',  to_50,      round(to_50 / total * 100, 1)),
        ('50% to 100%', to_100,     round(to_100 / total * 100, 1)),
        ('Above 100%',  above_100,  round(above_100 / total * 100, 1))
    ] AS band
⌘/Ctrl + Enter

Work with this data in your AI assistant

Opens ready to query, with this page's data. Free, no account.

More from this analysisThe 7-5-3-1 Rule in Mutual Funds, Tested
Rolling seven-year returns on SPY, one window per start month series 193×5 → A flat 500-a-month SIP against the same plan stepped up 10% a year, contributions only table 10×5 → The eight weakest seven-year windows on SPY, dividends counted as cash table 8×6 → An illustrative $10,000 SPY stake from year end 2005, marked at each year end ranking 21×3 → SPY calendar-year price change vs the 12% assumption, 2006-2025 ranking 20×3 → The same monthly lots ranked by per share result at the December 2022 price ranking 18×3 → See all 3,293 queries →