STRASMORE/EXPLORE 2,170 QUERIES

QQQ sessions since 2003: intraday low ≤ −3% vs prior close AND close ≥ +1%

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-07-26, from Feb 24, 2022: War at the Open, Green by Close.

as of series 2×4read in context →
QQQ sessions since 2003: intraday low ≤ −3% vs prior close AND close ≥ +1% — 2 rows by 4 columns, computed from US exchange, SIP and OPRA data.
sessionlow_vs_prior_pctclose_vs_prior_pcttrough_to_close_pct
2022-02-24-3.43.47
2022-10-13-3.22.35.7
Rows × columns
2 × 4
Period covered
to
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 QQQ sessions since 2003: intraday low ≤ −3% vs prior close AND close ≥ +1%, derived from the stored result.
ColumnTypeRangeNotes
session date 2022-02-24 to 2022-10-13
low_vs_prior_pct number -3.4 to -3.2 percent
close_vs_prior_pct number 2.3 to 3.4 percent
trough_to_close_pct number 5.7 to 7 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
SELECT
    toString(d) AS session,
    low_vs_prior_pct,
    close_vs_prior_pct,
    trough_to_close_pct
FROM (
    SELECT
        d,
        round((lo / prev_c - 1) * 100, 1) AS low_vs_prior_pct,
        round((c / prev_c - 1) * 100, 1) AS close_vs_prior_pct,
        round((c / lo - 1) * 100, 1) AS trough_to_close_pct
    FROM (
        SELECT d, c, lo,
               lagInFrame(c) OVER (ORDER BY d ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_c
        FROM (
            SELECT
                toDate(toTimeZone(window_start, 'America/New_York')) AS d,
                argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) AS c,
                minIf(toFloat64(low), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) AS lo
            FROM global_markets.delayed_stocks_minute_aggs
            WHERE ticker = 'QQQ'
              AND window_start >= toDateTime('2003-01-01 00:00:00') AND window_start < toDateTime('2026-01-01 00:00:00')
            GROUP BY d
        )
    )
    WHERE prev_c > 0 AND isFinite(prev_c)
)
WHERE low_vs_prior_pct <= -3 AND close_vs_prior_pct >= 1
ORDER BY session

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 analysisFeb 24, 2022: War at the Open, Green by Close
QQQ daily closes, February 22 – March 14, 2022 series 15×4 QQQ by half-hour: February 24, 2022 regular session series 13×4 2-year and 10-year Treasury yields, February 18 – March 8, 2022 (%) series 12×3 Eleven tickers on February 24, 2022: gap, intraday extremes, close (% vs prior close) table 11×6 After the reversal: when QQQ broke the invasion-day low, and how far it fell scalar 1×10 QQQ on February 24, 2022: the invasion-day reversal, receipted scalar 1×14 See all 2,170 queries →