STRASMORE/EXPLORE 3,293 QUERIES

bear_2022

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-11-01, from what-is-qqq-etf-for-russian-investors.

as of table 2×9read in context →
bear_2022 — 2 rows by 9 columns, computed from US exchange, SIP and OPRA data.
tickerpeak_onpeak_closetrough_ontrough_closedrawdown_pctdrop_lengthrecovered_onrecovery_length
QQQ19.11.2021403.9928.12.2022260.135.627715.12.2023352
SPY03.01.2022477.7112.10.2022356.5625.419519.01.2024464
Rows × columns
2 × 9
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 bear_2022, derived from the stored result.
ColumnTypeRangeNotes
ticker text 2 distinct values (QQQ, SPY)
peak_on text 2 distinct values (03.01.2022, 19.11.2021)
peak_close number 403.99 to 477.71 US dollars
trough_on text 2 distinct values (12.10.2022, 28.12.2022)
trough_close number 260.1 to 356.56 US dollars
drawdown_pct number 25.4 to 35.6 percent
drop_length number 195 to 277
recovered_on text 2 distinct values (15.12.2023, 19.01.2024)
recovery_length number 352 to 464

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 px AS
(
    SELECT
        ticker,
        date,
        toFloat64(any(close)) AS close_px
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('QQQ', 'SPY')
      AND date BETWEEN '2021-11-01' AND '2024-06-30'
    GROUP BY ticker, date
),
price_path AS
(
    SELECT
        ticker,
        date,
        close_px,
        max(close_px)          OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_peak,
        argMax(date, close_px) OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_peak_on
    FROM px
),
trough AS
(
    SELECT
        ticker,
        argMin(running_peak_on, close_px / running_peak) AS peak_date,
        argMin(running_peak,    close_px / running_peak) AS peak_close,
        argMin(date,            close_px / running_peak) AS trough_date,
        argMin(close_px,        close_px / running_peak) AS trough_close,
        min(close_px / running_peak) - 1                 AS max_drawdown
    FROM price_path
    GROUP BY ticker
)
SELECT
    t.ticker                                                  AS ticker,
    formatDateTime(t.peak_date, '%d.%m.%Y')                   AS peak_on,
    round(t.peak_close, 2)                                    AS peak_close,
    formatDateTime(t.trough_date, '%d.%m.%Y')                 AS trough_on,
    round(t.trough_close, 2)                                  AS trough_close,
    round(abs(t.max_drawdown) * 100, 1)                       AS drawdown_pct,
    countIf(p.date > t.peak_date AND p.date <= t.trough_date) AS drop_length,
    formatDateTime(minIf(p.date, p.date > t.trough_date AND p.close_px >= t.peak_close), '%d.%m.%Y') AS recovered_on,
    dateDiff('day', t.trough_date, minIf(p.date, p.date > t.trough_date AND p.close_px >= t.peak_close)) AS recovery_length
FROM trough AS t
INNER JOIN px AS p ON p.ticker = t.ticker
GROUP BY t.ticker, t.peak_date, t.peak_close, t.trough_date, t.trough_close, t.max_drawdown
ORDER BY t.ticker
⌘/Ctrl + Enter

Работайте с этими данными в своём ИИ-ассистенте

Открывается готовым к запросам, с данными этой страницы. Бесплатно, без аккаунта.