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.
| ticker | peak_on | peak_close | trough_on | trough_close | drawdown_pct | drop_length | recovered_on | recovery_length |
|---|---|---|---|---|---|---|---|---|
| QQQ | 19.11.2021 | 403.99 | 28.12.2022 | 260.1 | 35.6 | 277 | 15.12.2023 | 352 |
| SPY | 03.01.2022 | 477.71 | 12.10.2022 | 356.56 | 25.4 | 195 | 19.01.2024 | 464 |
- Rows × columns
- 2 × 9
- 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 |
|---|---|---|---|
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
Работайте с этими данными в своём ИИ-ассистенте
Открывается готовым к запросам, с данными этой страницы. Бесплатно, без аккаунта.