price_mix
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-19, from upcoming-reverse-stock-splits.
| price_bucket | upcoming_count | upcoming_pct | past_year_count | past_year_pct |
|---|---|---|---|---|
| Under $1 | 7 | 38.9 | 513 | 63.8 |
| $1 to $5 | 4 | 22.2 | 151 | 18.8 |
| Over $5 | 7 | 38.9 | 140 | 17.4 |
- Rows × columns
- 3 × 5
- 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 |
|---|---|---|---|
price_bucket |
text | 3 distinct values ($1 to $5, Over $5, Under $1) | |
upcoming_count |
number | 4 to 7 | count |
upcoming_pct |
number | 22.2 to 38.9 | percent |
past_year_count |
number | 140 to 513 | count |
past_year_pct |
number | 17.4 to 63.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.
the exact SQL behind every number
SELECT
price_bucket,
upcoming_count,
round(100.0 * upcoming_count / greatest(sum(upcoming_count) OVER (), 1), 1) AS upcoming_pct,
past_year_count,
round(100.0 * past_year_count / greatest(sum(past_year_count) OVER (), 1), 1) AS past_year_pct
FROM
(
SELECT
b.ord AS ord,
b.price_bucket AS price_bucket,
toUInt32(countIf(m.cohort = 'upcoming')) AS upcoming_count,
toUInt32(countIf(m.cohort = 'past_year')) AS past_year_count
FROM
(
SELECT
arrayJoin([1, 2, 3]) AS ord,
multiIf(ord = 1, 'Under $1', ord = 2, '$1 to $5', 'Over $5') AS price_bucket
) AS b
LEFT JOIN
(
SELECT
cohort,
multiIf(pre_close < 1, 1, pre_close < 5, 2, 3) AS ord
FROM
(
SELECT
'upcoming' AS cohort,
s.ticker AS ticker,
argMax(toFloat64(d.close), d.date) AS pre_close
FROM
(
SELECT ticker, execution_date
FROM global_markets.stocks_splits
WHERE execution_date >= today()
AND split_from > split_to
AND ticker NOT IN ('SPCX')
GROUP BY ticker, execution_date
) AS s
INNER JOIN
(
SELECT ticker, date, close
FROM global_markets.stocks_daily_aggs
WHERE date >= today() - 30
AND date < today()
AND ticker IN
(
SELECT ticker
FROM global_markets.stocks_splits
WHERE execution_date >= today()
AND split_from > split_to
)
) AS d ON d.ticker = s.ticker
GROUP BY s.ticker, s.execution_date
UNION ALL
SELECT
'past_year' AS cohort,
s.ticker AS ticker,
argMin(toFloat64(d.close), d.date) * any(s.to_shares) / any(s.from_shares) AS pre_close
FROM
(
SELECT
ticker,
execution_date,
max(toFloat64(split_from)) AS from_shares,
max(toFloat64(split_to)) AS to_shares
FROM global_markets.stocks_splits
WHERE execution_date >= today() - 365
AND execution_date < today()
AND split_from > split_to
AND split_to > 0
AND ticker NOT IN ('SPCX')
GROUP BY ticker, execution_date
) AS s
INNER JOIN
(
SELECT ticker, date, close
FROM global_markets.stocks_daily_aggs
WHERE date >= today() - 365
AND date < today()
AND ticker IN
(
SELECT ticker
FROM global_markets.stocks_splits
WHERE execution_date >= today() - 365
AND execution_date < today()
AND split_from > split_to
)
) AS d ON d.ticker = s.ticker
WHERE d.date >= s.execution_date
AND d.date < s.execution_date + 7
GROUP BY s.ticker, s.execution_date
)
) AS m ON m.ord = b.ord
GROUP BY b.ord, b.price_bucket
)
ORDER BY ord
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 analysisupcoming-reverse-stock-splits
upcoming_reverse
table 19×6
→
monthly_mix
series 12×5
→
yearly_mix
ranking 8×4
→
The 2s10s spread, every print of the half
table 124×2
→
The 2s10s spread, every print of the half
table 124×2
→
Every half-year since 1976: the 2y and 10y change, the twist between them, and the half's lowest 2s10s print
table 100×7
→
See all 2,401 queries →