debut_two_legs
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-10-02, from what-is-gmp-in-an-ipo.
| band | listing_count | median_pop_pct | median_day1_change_pct | closed_above_open_pct |
|---|---|---|---|---|
| opened below offer | 234 | -5.3 | 0.1 | 51.3 |
| opened 0-10% above offer | 378 | 0.7 | 0 | 38.1 |
| opened 10-30% above offer | 194 | 17.6 | -0.8 | 45.4 |
| opened more than 30% above offer | 413 | 461.2 | -4.2 | 39.2 |
- Rows × columns
- 4 × 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 |
|---|---|---|---|
band |
text | 4 distinct values | |
listing_count |
number | 194 to 413 | count |
median_pop_pct |
number | -5.3 to 461.2 | percent |
median_day1_change_pct |
number | -4.2 to 0.1 | percent |
closed_above_open_pct |
number | 38.1 to 51.3 | 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.
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 issues AS
(
SELECT
ticker,
min(listing_date) AS listing_dt,
max(toFloat64(final_issue_price)) AS offer_price
FROM global_markets.stocks_ipos
WHERE listing_date >= '2021-01-01'
AND listing_date < '2026-07-01'
AND final_issue_price > 0
AND issuer_name NOT ILIKE '%acquisition%'
AND ticker NOT IN ('SPCX')
GROUP BY ticker
),
debut AS
(
SELECT
i.ticker AS ticker,
round(100 * (argMin(toFloat64(d.open), d.date) / i.offer_price - 1), 2) AS pop_pct,
round(100 * (argMin(toFloat64(d.close), d.date)
/ argMin(toFloat64(d.open), d.date) - 1), 2) AS day1_change_pct
FROM issues AS i
INNER JOIN global_markets.stocks_daily_aggs AS d ON d.ticker = i.ticker
WHERE d.date >= i.listing_dt
AND d.date < i.listing_dt + 7
GROUP BY i.ticker, i.offer_price
)
SELECT
band,
count() AS listing_count,
round(quantileDeterministic(0.5)(pop_pct, toUInt32(cityHash64(ticker))), 1) AS median_pop_pct,
round(quantileDeterministic(0.5)(day1_change_pct, toUInt32(cityHash64(ticker))), 1) AS median_day1_change_pct,
round(100 * countIf(day1_change_pct > 0) / count(), 1) AS closed_above_open_pct
FROM
(
SELECT
ticker,
pop_pct,
day1_change_pct,
multiIf(pop_pct < 0, 1, pop_pct < 10, 2, pop_pct < 30, 3, 4) AS band_rank,
multiIf(pop_pct < 0, 'opened below offer',
pop_pct < 10, 'opened 0-10% above offer',
pop_pct < 30, 'opened 10-30% above offer',
'opened more than 30% above offer') AS band
FROM debut
WHERE isFinite(pop_pct) AND isFinite(day1_change_pct)
)
GROUP BY band, band_rank
ORDER BY band_rank
Work with this data in your AI assistant
Opens ready to query, with this page's data. Free, no account.