streaks
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-18, from how-long-can-a-stock-trade-under-1-dollar.
| threshold_label | names | share_pct |
|---|---|---|
| 1 or more | 356 | 100 |
| 30 or more | 210 | 59 |
| 90 or more | 104 | 29.2 |
| 180 or more | 48 | 13.5 |
- Rows × columns
- 4 × 3
- 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 |
|---|---|---|---|
threshold_label |
text | 4 distinct values (1 or more, 180 or more, 30 or more…) | |
names |
number | 48 to 356 | |
share_pct |
number | 13.5 to 100 | 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
threshold_label,
countIf(streak >= threshold) AS names,
round(100 * countIf(streak >= threshold) / count(), 1) AS share_pct
FROM
(
SELECT
ticker,
arrayReverseSort(groupArray((date, px))) AS closes_desc,
arrayFirstIndex(x -> tupleElement(x, 2) >= 1, closes_desc) AS first_at_or_above_1,
if(first_at_or_above_1 = 0, toInt32(length(closes_desc)), toInt32(first_at_or_above_1) - 1) AS streak
FROM
(
SELECT
ticker,
date,
argMax(toFloat64(close), _ingest_time) AS px
FROM global_markets.stocks_daily_aggs
WHERE date >= today() - 400
AND date <= (SELECT max(date) FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY' AND date >= today() - 14)
AND ifNull(otc, 0) = 0
AND length(ticker) <= 4
AND ticker NOT IN ('SPCX')
AND volume > 0
AND close > 0
AND ticker IN
(
SELECT ticker
FROM global_markets.stocks_daily_aggs
WHERE date = (SELECT max(date) FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY' AND date >= today() - 14)
AND volume > 0
AND close > 0
AND close < 1
)
GROUP BY ticker, date
) AS daily
GROUP BY ticker
) AS per_ticker
ARRAY JOIN
[1, 30, 90, 180] AS threshold,
['1 or more', '30 or more', '90 or more', '180 or more'] AS threshold_label
GROUP BY threshold, threshold_label
ORDER BY threshold
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 analysishow-long-can-a-stock-trade-under-1-dollar
price_buckets
ranking 5×4
→
sub_dollar_trend
series 105×3
→
reverse_splits_monthly
series 12×3
→
Top 25 weekly-options underlyings by distinct contracts traded, with expiration weekdays
ranking 25×4
→
Annualized volatility vs total return, 25 large caps, calmest to wildest (~2 years)
ranking 25×3
→
SPY options median spread by expiration date, near-the-money strikes only
ranking 25×4
→
See all 2,358 queries →