Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

Does IPO GMP Predict Listing Gains?

Does IPO GMP predict listing gains? The grey market premium has no order book and no audit trail. Here is how to score it against the discovered open.

Does IPO GMP predict listing gains? Grey market premium, GMP for short, is an unofficial dealer quote on an IPO application before the shares list, and the honest way to judge it is as a forecast of one specific number: the price the stock opens at on listing day. Scored that way it is directionally informative on heavily subscribed mainboard issues, systematically optimistic in hot markets, and close to noise on small SME issues where a few applications move the quote. This page explains how the number is made, then shows you how to keep score on it yourself.

How is a GMP quote actually made?

GMP is quoted in rupees per share above the issue price. A premium of ₹60 on a ₹300 issue is a dealer saying they will pay ₹360 for shares you have not received yet, in a deal struck before the listing. Two sibling quotes sit beside it. The kostak rate is a flat amount paid for your whole application, whether or not anything is allotted to you. The subject to sauda rate is paid for that application only in the event of allotment, which takes the allotment lottery out of the price and leaves the dealer's view of the listing.

What sits behind all three numbers is a dealer network, not a market. There is no order book, no clearing corporation standing between the two sides, no reported volume, and no audit trail a third party can inspect afterwards. The figure republished on aggregator pages is a hearsay consensus: one person's reading of what a handful of dealers are quoting, copied from site to site, with no requirement that a single rupee changed hands at that level. What the grey market premium is walks through that plumbing in detail, and how pre-IPO shares trade covers the routes that do leave a record.

Does IPO GMP predict listing gains?

Hold the premium to the standard any forecast is held to. It names a number before the event, the event happens, and the gap between the two gets recorded. Two things are scored separately, and collapsing them into one verdict is where most GMP arguments go wrong. Sign is direction: a positive premium followed by an open above the issue price is a hit. Error is level: quoted premium as a percent of the issue price, minus the actual opening move in the same unit.

A forecast can be strong on sign and poor on level, which is roughly the reputation GMP has earned on large mainboard issues. Keeping two columns rather than one is what lets you see that. Here is the whole method:

  1. On the day before listing, write down the quoted premium, where you read it, and the time you read it.
  2. Convert it to a percent of the issue price, the unit that compares across issues of different prices.
  3. After listing, record the exchange-discovered open and the close of that first session.
  4. Score sign as hit or miss. Score error as quoted percent minus actual percent, keeping the signed number alongside the absolute value.
  5. Repeat for at least 30 issues before reading anything into the averages.

The average signed error answers the hot-market question: an average sitting persistently above zero means the quotes ran high across the whole sample. Scoring forecasts with the Brier score applies the same discipline to yes-or-no forecasts.

What does the listing print actually look like?

This page publishes no live GMP number and treats no aggregator as a source of truth. What can be shown end to end is the target: the quantity any premium is trying to call. The panels below measure US listings, where the offer price and the first exchange print are both on the public record and the scoring arithmetic can be re-run.

QueryOffer to open, and open to close, on the heaviest-traded recent listing days
tickeroffer_to_open_pctopen_to_close_pct
CBRS89.2-11.1
FIG157.635.9
BLSH143.2-24.4
CRCL122.620.6
MDLN20.717.1
KLAR30-11.9
FLY55.6-13.8
QNT13.3-11.2
INIO14.87.4
VOYG125-19
CRWV-2.52.6
CHYM59.3-13.7
The exact SQL behind every number
WITH day_one AS
(
    SELECT
        i.ticker                                                 AS ticker,
        i.list_date                                              AS list_date,
        (toFloat64(d.open_px)  / i.offer_price - 1) * 100        AS offer_to_open,
        (toFloat64(d.close_px) / i.offer_price - 1) * 100        AS offer_to_close,
        (toFloat64(d.close_px) / toFloat64(d.open_px) - 1) * 100 AS open_to_close,
        toFloat64(d.open_px) * toFloat64(d.day_volume)           AS day1_turnover
    FROM
    (
        SELECT
            ticker,
            toDate(argMax(listing_date, last_updated))         AS list_date,
            argMax(toFloat64(final_issue_price), last_updated) AS offer_price
        FROM global_markets.stocks_ipos
        WHERE listing_date >= '2017-01-01'
          AND listing_date <  '2026-09-01'
          AND final_issue_price > 0
          AND currency_code = 'USD'
          AND ticker NOT IN ('SPCX')
        GROUP BY ticker
    ) AS i
    INNER JOIN
    (
        SELECT
            ticker,
            date,
            max(open)   AS open_px,
            max(close)  AS close_px,
            max(volume) AS day_volume
        FROM global_markets.stocks_daily_aggs
        WHERE date >= '2017-01-01'
          AND date <  '2026-09-01'
        GROUP BY ticker, date
    ) AS d
        ON d.ticker = i.ticker AND d.date = i.list_date
    WHERE d.day_volume > 0
      AND d.open_px > 0
      AND i.offer_price > 0
)
SELECT
    ticker,
    round(offer_to_open, 1) AS offer_to_open_pct,
    round(open_to_close, 1) AS open_to_close_pct
FROM day_one
WHERE list_date >= '2025-01-01'
ORDER BY day1_turnover DESC
LIMIT 12
Run this yourself

The busiest listing day in view, CBRS, opened 89.2% away from its offer price, then travelled -11.1% between that open and the close. Read the two columns across all 12 rows and they frequently point opposite ways. A premium quoted before listing is a forecast of the open, and the open is not the number most people remember by the evening.

Why a GMP rule calibrated last year misfires this year

The base rate moves. Every rule of thumb built on premiums ("knock a third off the quote" and the rest) is a statement about the average listing of a particular vintage, and the average listing changes from year to year with the mix of issues coming to market.

QueryMedian listing-day move versus the offer price, by listing year
listing_yearlistingsmedian_offer_to_open_pctmedian_offer_to_close_pct
201714888.8
201817813.914.2
2019170710.3
202025914.410.3
20213603.53.5
2022610.40.2
2023962.72.3
20241591.21.2
20252811.21.2
20261660.20.1
The exact SQL behind every number
WITH day_one AS
(
    SELECT
        i.ticker                                                 AS ticker,
        i.list_date                                              AS list_date,
        (toFloat64(d.open_px)  / i.offer_price - 1) * 100        AS offer_to_open,
        (toFloat64(d.close_px) / i.offer_price - 1) * 100        AS offer_to_close,
        (toFloat64(d.close_px) / toFloat64(d.open_px) - 1) * 100 AS open_to_close,
        toFloat64(d.open_px) * toFloat64(d.day_volume)           AS day1_turnover
    FROM
    (
        SELECT
            ticker,
            toDate(argMax(listing_date, last_updated))         AS list_date,
            argMax(toFloat64(final_issue_price), last_updated) AS offer_price
        FROM global_markets.stocks_ipos
        WHERE listing_date >= '2017-01-01'
          AND listing_date <  '2026-09-01'
          AND final_issue_price > 0
          AND currency_code = 'USD'
          AND ticker NOT IN ('SPCX')
        GROUP BY ticker
    ) AS i
    INNER JOIN
    (
        SELECT
            ticker,
            date,
            max(open)   AS open_px,
            max(close)  AS close_px,
            max(volume) AS day_volume
        FROM global_markets.stocks_daily_aggs
        WHERE date >= '2017-01-01'
          AND date <  '2026-09-01'
        GROUP BY ticker, date
    ) AS d
        ON d.ticker = i.ticker AND d.date = i.list_date
    WHERE d.day_volume > 0
      AND d.open_px > 0
      AND i.offer_price > 0
)
SELECT
    toString(toYear(list_date)) AS listing_year,
    count()                     AS listings,
    round(quantileDeterministic(0.5)(offer_to_open,  cityHash64(ticker)), 1) AS median_offer_to_open_pct,
    round(quantileDeterministic(0.5)(offer_to_close, cityHash64(ticker)), 1) AS median_offer_to_close_pct
FROM day_one
GROUP BY listing_year
HAVING count() >= 5
ORDER BY listing_year
Run this yourself

In 2017 the median listing opened 8% from its offer price, across 148 issues. In 2026 the median was 0.2%. 10 vintages clear the five-listing minimum, and the gap between the best and the quietest of them is far larger than the precision anyone claims for a premium quote. Score by vintage, and say which window each number came from.

Does a big opening move hold to the close?

The premium is a forecast of the open. The open is itself a discovered price, struck by whoever turns up to the first auction, and the session keeps going afterwards. Sorting every listing by the size of its opening move shows what the rest of the day did with it.

QueryMedian open-to-close move, grouped by the size of the opening move
opening_move_bucketlistingsmedian_open_to_close_pct
opened below offer3530
opened 0 to 10% up7400
opened 10 to 30% up2430
opened 30 to 60% up197-1.1
opened over 60% up345-2.1
The exact SQL behind every number
WITH day_one AS
(
    SELECT
        i.ticker                                                 AS ticker,
        i.list_date                                              AS list_date,
        (toFloat64(d.open_px)  / i.offer_price - 1) * 100        AS offer_to_open,
        (toFloat64(d.close_px) / toFloat64(d.open_px) - 1) * 100 AS open_to_close,
        toFloat64(d.open_px) * toFloat64(d.day_volume)           AS day1_turnover
    FROM
    (
        SELECT
            ticker,
            toDate(argMax(listing_date, last_updated))         AS list_date,
            argMax(toFloat64(final_issue_price), last_updated) AS offer_price
        FROM global_markets.stocks_ipos
        WHERE listing_date >= '2017-01-01'
          AND listing_date <  '2026-09-01'
          AND final_issue_price > 0
          AND currency_code = 'USD'
          AND ticker NOT IN ('SPCX')
        GROUP BY ticker
    ) AS i
    INNER JOIN
    (
        SELECT
            ticker,
            date,
            max(open)   AS open_px,
            max(close)  AS close_px,
            max(volume) AS day_volume
        FROM global_markets.stocks_daily_aggs
        WHERE date >= '2017-01-01'
          AND date <  '2026-09-01'
        GROUP BY ticker, date
    ) AS d
        ON d.ticker = i.ticker AND d.date = i.list_date
    WHERE d.day_volume > 0
      AND d.open_px > 0
      AND i.offer_price > 0
)
SELECT
    multiIf(offer_to_open <  0, 'opened below offer',
            offer_to_open < 10, 'opened 0 to 10% up',
            offer_to_open < 30, 'opened 10 to 30% up',
            offer_to_open < 60, 'opened 30 to 60% up',
                                'opened over 60% up') AS opening_move_bucket,
    count()                                           AS listings,
    round(quantileDeterministic(0.5)(open_to_close, cityHash64(ticker)), 1) AS median_open_to_close_pct
FROM day_one
GROUP BY opening_move_bucket
ORDER BY min(offer_to_open)
Run this yourself

The opened below offer group holds 353 listings, with a median open-to-close move of 0%. At the other end, the opened over 60% up group holds 345 listings and a median of -2.1%. All 5 buckets sit much closer to zero on this measure than the opening moves that defined them. The large, variable part of a listing day happens at the auction.

Mainboard and SME listings discover price differently

A mainboard listing in India opens through a special pre-open call auction: orders are collected over a set window, a single equilibrium price is struck from the resulting book, and that becomes the first traded price. Exchange price bands then cap how far the stock can travel for the rest of the session. The book behind that equilibrium price on a heavily subscribed issue is deep. How the IPO opening price is set covers that auction step by step.

SME platform listings work from a much smaller base. Floats are smaller, minimum application and lot sizes are far larger, and a handful of orders can set the opening price. The premium quoted into that print rests on correspondingly tiny volume. Both sides of the forecast get thin at once, and the measurable analogue is first-session turnover.

QueryDispersion of the opening move, by first-session dollar turnover
day1_turnover_tierlistingsmedian_offer_to_open_pctp10_to_p90_spread
under $5M traded17812.161672.8
$5M to $50M6521.21917.8
$50M to $500M8943.864.1
$500M and up15232.8103.9
The exact SQL behind every number
WITH day_one AS
(
    SELECT
        i.ticker                                          AS ticker,
        i.list_date                                       AS list_date,
        (toFloat64(d.open_px) / i.offer_price - 1) * 100  AS offer_to_open,
        toFloat64(d.open_px) * toFloat64(d.day_volume)    AS day1_turnover
    FROM
    (
        SELECT
            ticker,
            toDate(argMax(listing_date, last_updated))         AS list_date,
            argMax(toFloat64(final_issue_price), last_updated) AS offer_price
        FROM global_markets.stocks_ipos
        WHERE listing_date >= '2017-01-01'
          AND listing_date <  '2026-09-01'
          AND final_issue_price > 0
          AND currency_code = 'USD'
          AND ticker NOT IN ('SPCX')
        GROUP BY ticker
    ) AS i
    INNER JOIN
    (
        SELECT
            ticker,
            date,
            max(open)   AS open_px,
            max(volume) AS day_volume
        FROM global_markets.stocks_daily_aggs
        WHERE date >= '2017-01-01'
          AND date <  '2026-09-01'
        GROUP BY ticker, date
    ) AS d
        ON d.ticker = i.ticker AND d.date = i.list_date
    WHERE d.day_volume > 0
      AND d.open_px > 0
      AND i.offer_price > 0
)
SELECT
    multiIf(day1_turnover <   5000000, 'under $5M traded',
            day1_turnover <  50000000, '$5M to $50M',
            day1_turnover < 500000000, '$50M to $500M',
                                       '$500M and up') AS day1_turnover_tier,
    count()                                            AS listings,
    round(quantileDeterministic(0.5)(offer_to_open, cityHash64(ticker)), 1) AS median_offer_to_open_pct,
    round(quantileDeterministic(0.9)(offer_to_open, cityHash64(ticker))
        - quantileDeterministic(0.1)(offer_to_open, cityHash64(ticker)), 1) AS p10_to_p90_spread
FROM day_one
GROUP BY day1_turnover_tier
ORDER BY min(day1_turnover)
Run this yourself

The spread between the 10th and the 90th percentile of the opening move is the width of the target a forecaster is aiming at. In the $500M and up tier it measures 103.9 points, around a median opening move of 32.8%. In the under $5M traded tier the same spread runs to 61672.8 percentage points across 178 listings, a width in the thousands of points rather than the tens: the thin tail there holds first prints many times the offer price. At that end the percentile spread stops describing any target a forecast could be scored against, and the quote itself was assembled from fewer observations too.

For the backdrop against which recent quotes were struck, the 2026 IPO market so far sets out the supply side, and the IPO quiet period covers why so little verifiable information reaches the public while premiums are quoted most actively.

Method notes for the panels above
  • Offer price is the final issue price of record for each listing, taken from the most recently updated record for that ticker. Only first sessions with reported volume are kept.
  • Medians and percentiles use deterministic estimators keyed on the ticker, so the same window returns the same figure on every run.
  • Turnover tiers use first-session dollar turnover, the opening price times the session volume. The thinnest tier holds micro-float listings whose first prints sit far from the offer price; its percentile spread is correspondingly wide.

FAQ

Is GMP a reliable indicator of listing gains?

It is a dealer quote, not a measurement, and it is best treated as a forecast with a track record you keep yourself. On heavily subscribed mainboard issues it tends to point the right way on direction more often than it lands the level.

What is the difference between GMP and the kostak rate?

GMP is a premium per share above the issue price, applying to shares you have been allotted. The kostak rate is a flat amount paid for an entire application, whether or not any shares are allotted. The subject to sauda rate sits between them: it is paid for the application only in the event of allotment.

Why does GMP move so much on SME IPOs?

SME issues have small floats, large minimum lot sizes, and far fewer participants than mainboard issues. A quoted premium there rests on a handful of conversations, and the listing print it forecasts is set by a handful of orders.

Can grey market premium be manipulated?

Nothing in the structure prevents it. There is no order book, no clearing record, and no published volume, so a quote can be moved by whoever is quoting it, and no third party can verify afterwards whether any trade occurred at that level.


Every panel on this page ships with the SQL that produced it, so you can open one and re-run the same scoring over a different window. The same listing-day questions can be asked in plain English on the Strasmore terminal.