{"slug":"does-ipo-gmp-predict-listing-gains","qid":"opening_move_vs_close","label":"opening_move_vs_close","post_title":"does-ipo-gmp-predict-listing-gains","post_url":"/blog/does-ipo-gmp-predict-listing-gains#q-opening_move_vs_close","columns":["opening_move_bucket","listings","median_open_to_close_pct"],"rows":[{"opening_move_bucket":"opened below offer","listings":353,"median_open_to_close_pct":0},{"opening_move_bucket":"opened 0 to 10% up","listings":740,"median_open_to_close_pct":0},{"opening_move_bucket":"opened 10 to 30% up","listings":243,"median_open_to_close_pct":0},{"opening_move_bucket":"opened 30 to 60% up","listings":197,"median_open_to_close_pct":-1.1},{"opening_move_bucket":"opened over 60% up","listings":345,"median_open_to_close_pct":-2.1}],"shape":"ranking","sql":"WITH day_one AS\n(\n    SELECT\n        i.ticker                                                 AS ticker,\n        i.list_date                                              AS list_date,\n        (toFloat64(d.open_px)  / i.offer_price - 1) * 100        AS offer_to_open,\n        (toFloat64(d.close_px) / toFloat64(d.open_px) - 1) * 100 AS open_to_close,\n        toFloat64(d.open_px) * toFloat64(d.day_volume)           AS day1_turnover\n    FROM\n    (\n        SELECT\n            ticker,\n            toDate(argMax(listing_date, last_updated))         AS list_date,\n            argMax(toFloat64(final_issue_price), last_updated) AS offer_price\n        FROM global_markets.stocks_ipos\n        WHERE listing_date >= '2017-01-01'\n          AND listing_date <  '2026-09-01'\n          AND final_issue_price > 0\n          AND currency_code = 'USD'\n          AND ticker NOT IN ('SPCX')\n        GROUP BY ticker\n    ) AS i\n    INNER JOIN\n    (\n        SELECT\n            ticker,\n            date,\n            max(open)   AS open_px,\n            max(close)  AS close_px,\n            max(volume) AS day_volume\n        FROM global_markets.stocks_daily_aggs\n        WHERE date >= '2017-01-01'\n          AND date <  '2026-09-01'\n        GROUP BY ticker, date\n    ) AS d\n        ON d.ticker = i.ticker AND d.date = i.list_date\n    WHERE d.day_volume > 0\n      AND d.open_px > 0\n      AND i.offer_price > 0\n)\nSELECT\n    multiIf(offer_to_open <  0, 'opened below offer',\n            offer_to_open < 10, 'opened 0 to 10% up',\n            offer_to_open < 30, 'opened 10 to 30% up',\n            offer_to_open < 60, 'opened 30 to 60% up',\n                                'opened over 60% up') AS opening_move_bucket,\n    count()                                           AS listings,\n    round(quantileDeterministic(0.5)(open_to_close, cityHash64(ticker)), 1) AS median_open_to_close_pct\nFROM day_one\nGROUP BY opening_move_bucket\nORDER BY min(offer_to_open)","computed_at":"2026-10-03T15:20:14.436221+00:00","elapsed":0.004596416}