Strasmore Research
Deep Dives Matt ConnorBy Matt Connor · Updated 2026-07-26

GameStop, Jan 28, 2021: $483 to $112 by Noon

Jan 28, 2021: GME printed $483 and $112 in one morning, Robinhood went position-close-only, and 76 minutes vanished into trading halts. The tape, receipted.

January 28, 2021 was the crescendo of the GameStop squeeze, the morning GME printed $483 and $112.25 within two hours, the day Robinhood and other brokerages restricted buying in the name, and, by the count of its own minute bars, receipted below, the heaviest halt day of the squeeze itself. The squeeze's mechanics are covered in the short squeeze explainer, with this same stock as the case study; this page is the day itself, the run-up that set it up, the tape minute by minute, the broker restrictions, the options flow, and the round trip back down. Every number is a stored query; expand any panel for the SQL.

The run-up: December 2020 to January 27

The single wildest day in the saga makes no sense without the eight weeks in front of it. GME ended 2020-12-01 at $15.81, a heavily-shorted mall retailer trading a few million shares a day, 6.2 million on an ordinary early-December session. On the eve of this page's session it closed at $345, 21.8 times the December 1 price.

QueryGME daily close and volume: December 1, 2020 to January 27, 2021 (as-traded prices)
39 rows (showing 20)
sessionclose_usdmult_from_dec1shares_m
2020-12-0115.81111.8
2020-12-0216.5917.6
2020-12-0316.1216.2
2020-12-0416.911.18.5
2020-12-0716.3217.2
2020-12-0816.921.116
2020-12-0913.660.924.1
2020-12-1014.120.97.5
2020-12-1113.310.87.4
2020-12-1412.720.89.8
2020-12-1513.870.98.1
2020-12-1613.850.95.4
2020-12-1714.830.98.1
2020-12-1815.63114.6
2020-12-2115.5219.7
2020-12-2219.431.230.2
2020-12-2320.581.325.3
2020-12-2420.151.36.1
2020-12-2820.981.38.8
2020-12-2919.371.29
The exact SQL behind every number
SELECT
    toString(et_date) AS session,
    close_usd,
    round(close_usd / first_value(close_usd) OVER (ORDER BY et_date ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 1) AS mult_from_dec1,
    shares_m
FROM (
    SELECT
        toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
        round(argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959), 2) AS close_usd,
        round(toFloat64(sum(volume)) / 1e6, 1) AS shares_m
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'GME'
      AND window_start >= toDateTime('2020-12-01 00:00:00') AND window_start < toDateTime('2021-01-27 23:59:00')
    GROUP BY et_date
)
WHERE et_date >= toDate('2020-12-01') AND et_date <= toDate('2021-01-27')
ORDER BY et_date
Run this yourself

The path is a staircase, not a ramp. Through mid-January the stock crept along in the teens; on 2021-01-13 it closed at $31.44 on 144.4 million shares, volume more than twenty times its December norm, and from there each leg was larger than the last, through the $64.85 close on 2021-01-22 to the near-doubling into January 27. Short sellers were positioned throughout: the settlement-date receipts further down this page show what that climb did to them.

The day, on one row, count the bars

QueryGME on January 28, 2021: receipted (as-traded, pre-2022-split prices)
prior_closerth_opengap_pctrth_lowlow_etrth_highrth_closeday_change_pctlow_vs_prior_pctday_shares_mday_notional_bnrth_minute_barsrth_high_splitadjthinnest_other_session_bars
345265-23.2112.2511:24483197.44-42.8-67.557.416.7314120.75348
The exact SQL behind every number
WITH
    (
        SELECT argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'GME'
          AND window_start >= toDateTime('2021-01-27 00:00:00') AND window_start < toDateTime('2021-01-28 04:00:00')
    ) AS prior_rth_close,
    (
        SELECT min(bars)
        FROM (
            SELECT
                toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
                countIf((toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) AS bars
            FROM global_markets.delayed_stocks_minute_aggs
            WHERE ticker = 'GME'
              AND window_start >= toDateTime('2021-01-25 04:00:00') AND window_start < toDateTime('2021-02-05 04:00:00')
            GROUP BY et_date
            HAVING et_date != toDate('2021-01-28')
        )
    ) AS thinnest_other
SELECT
    round(prior_rth_close, 2) AS prior_close,
    round(toFloat64(argMinIf(open, window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)), 2) AS rth_open,
    round((toFloat64(argMinIf(open, window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)) / prior_rth_close - 1) * 100, 1) AS gap_pct,
    round(minIf(toFloat64(low), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959), 2) AS rth_low,
    formatDateTime(toTimeZone(argMinIf(window_start, (toFloat64(low), toInt64(toUnixTimestamp(window_start))), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959), 'America/New_York'), '%H:%i') AS low_et,
    round(maxIf(toFloat64(high), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959), 2) AS rth_high,
    round(toFloat64(argMaxIf(close, window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)), 2) AS rth_close,
    round((toFloat64(argMaxIf(close, window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)) / prior_rth_close - 1) * 100, 1) AS day_change_pct,
    round((minIf(toFloat64(low), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) / prior_rth_close - 1) * 100, 1) AS low_vs_prior_pct,
    round(toFloat64(sum(volume)) / 1e6, 1) AS day_shares_m,
    round(sum(toFloat64(close) * toFloat64(volume)) / 1e9, 1) AS day_notional_bn,
    countIf((toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) AS rth_minute_bars,
    round(maxIf(toFloat64(high), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) / 4, 2) AS rth_high_splitadj,
    thinnest_other AS thinnest_other_session_bars
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'GME'
  AND window_start >= toDateTime('2021-01-28 04:00:00') AND window_start < toDateTime('2021-01-28 23:59:00')
Run this yourself

Start with the bar count: 314 regular-session minute bars instead of 390. The roughly seventy-six missing minutes are Limit Up/Limit Down volatility halts tripping over and over as the price teleported; no other session of the squeeze stretch, January 25 through February 4, kept fewer than 348 regular-session bars. Between the halts: an open at $265, already -23.2% below the prior official close, the overnight and premarket tape having turned violent as brokerage restrictions were announced, then a spike to the all-time high of $483 in the opening hour, a collapse to $112.25 at 11:24 ET, -67.5% below the prior close, and a close at $197.44, -42.8% down on the day. All prices as they traded, before the 2022 four-for-one split.

The scale deserves its own sentence: 57.4 million shares changed hands across the extended day, roughly $16.7 billion in dollar volume, megacap-sized turnover concentrated in a video-game retailer that had traded 6.2 million shares on a quiet session eight weeks earlier.

What a Limit Up/Limit Down halt actually is

The halts were not exchange discretion; they are automatic. A Limit Up/Limit Down (LULD) halt is the single-stock circuit breaker adopted after the 2010 flash crash. Every stock carries a price band around a reference price, a rolling five-minute average of its own trades, of 5% either side for the largest names, 10% for most others, and wider for low-priced stocks, with bands doubled in the final 25 minutes of the session. If the best bid or offer sits at the band's edge for 15 seconds, trading in that stock pauses on every exchange for five minutes, and it reopens by auction on the listing exchange; when the auction cannot settle inside the allowed range, the pause extends. On a tape moving like GME's that morning, the cycle repeats: reopen, cross the width of a band in seconds, pause again. That is how a session loses seventy-six minutes with nobody pressing a button, the mechanism working exactly as designed, consuming trading time as it works.

The morning, bucket by bucket

QueryGME by half-hour: January 28, 2021 regular session
et_timebucket_closebucket_lowshares_m
09:30468.49261.526.2
10:00396.5369.414.4
10:30264.01264.013.1
11:00132112.254.5
11:30255.761356.3
12:00278.7250.73.9
12:30239.67230.012.4
13:00231.47205.422.8
13:30241.53226.652.3
14:00229220.791.5
14:30247.172153.2
15:00225.46225.022.2
15:30197.44197.443.5
The exact SQL behind every number
SELECT
    formatDateTime(toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
    round(toFloat64(argMax(close, window_start)), 2) AS bucket_close,
    round(min(toFloat64(low)), 2) AS bucket_low,
    round(toFloat64(sum(volume)) / 1e6, 1) AS shares_m
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'GME'
  AND window_start >= toDateTime('2021-01-28 04:00:00') AND window_start < toDateTime('2021-01-28 23:59:00')
  AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY et_time
ORDER BY et_time
Run this yourself

The 09:30 and 10:00 buckets contain the peak; the 11:00 bucket's $112.25 low is the trough, a round trip that erased and partially rebuilt tens of billions of market value before lunch. Note the missing volume inside the halt windows: the buckets with sparse shares are the ones where trading kept stopping. The $483 and $112.25 prints were both "the market price" that morning, minutes apart, anyone modeling markets as continuous should keep this tape pinned above their desk.

The brokers: Robinhood and position-close-only

The other defining fact of January 28 sits nowhere on the price tape. Before the open, Robinhood, the brokerage where much of the squeeze's retail buying lived, moved GME and a list of other names to position-closing only: customers could sell shares they held but could not buy. Interactive Brokers had put GME options into liquidation-only at midday the previous day, January 27, and several other brokers raised margin requirements or restricted opening trades. Robinhood attributed its restriction to a pre-dawn deposit call from the industry clearinghouse that it put at roughly $3 billion, reduced after the restrictions went in, and the firm raised over a billion dollars from its investors that night. The February 2021 congressional hearing and the SEC's October 2021 staff report both walk through that sequence in detail.

What the tape records is co-timing, not a verdict: restrictions announced before the open, a -23.2% gap down at 9:30, the $483 print, the halts, the $112.25 low. And the restriction list moved as a bloc:

QueryThe restricted names on January 28, 2021: prior close vs close (ET regular session)
tickerclose_jan27close_jan28change_pct
AMC19.888.68-56.3
GME345197.44-42.8
BB25.0214.64-41.5
KOSS57.4139.04-32
NOK6.634.7-29.1
The exact SQL behind every number
SELECT
    ticker,
    round(argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) = '2021-01-27' AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959), 2) AS close_jan27,
    round(argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) = '2021-01-28' AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959), 2) AS close_jan28,
    round((argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) = '2021-01-28' AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) / argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) = '2021-01-27' AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 1) AS change_pct
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('GME', 'AMC', 'BB', 'NOK', 'KOSS')
  AND window_start >= toDateTime('2021-01-27 00:00:00') AND window_start < toDateTime('2021-01-29 04:00:00')
GROUP BY ticker
ORDER BY change_pct ASC
Run this yourself

Every name on the panel closed hard down, spanning -56.3% for the hardest-hit (AMC) to -29.1% for the mildest (Nokia), with GME itself at -42.8%. Five stocks with five unrelated businesses printed the same shape on the same day, the common factor was the list itself.

The options tape: the hedging machine at full throttle

By squeeze week, GameStop's options market was among the busiest of any listed company. The standard telling includes a gamma loop, a dealer who sells a call option typically buys shares to hedge, and as the price rises toward the strike that hedge must grow, adding mechanical buying on the way up. Trade prints cannot show the hedging directly, but they show the throughput:

QueryGME options trades by session: January 25–28, 2021
sessioncall_contracts_mput_contracts_mcall_share_pctpremium_bnprints_k
2021-01-250.490.8536.52.32343
2021-01-260.70.7149.43.04415
2021-01-270.331.05247.99351
2021-01-280.20.4829.53.97175
The exact SQL behind every number
SELECT
    toString(toDate(toTimeZone(sip_timestamp, 'America/New_York'))) AS session,
    round(sumIf(size, substring(ticker, 12, 1) = 'C') / 1e6, 2) AS call_contracts_m,
    round(sumIf(size, substring(ticker, 12, 1) = 'P') / 1e6, 2) AS put_contracts_m,
    round(100.0 * sumIf(size, substring(ticker, 12, 1) = 'C') / sum(size), 1) AS call_share_pct,
    round(sum(toFloat64(price) * size * 100) / 1e9, 2) AS premium_bn,
    round(count() / 1e3, 0) AS prints_k
FROM global_markets.options_trades
WHERE ticker >= 'O:GME21' AND ticker < 'O:GME22'
  AND sip_timestamp >= toDateTime('2021-01-25 00:00:00') AND sip_timestamp < toDateTime('2021-01-29 00:00:00')
GROUP BY session
ORDER BY session
Run this yourself

On 2021-01-27, the eve of this session, $7.99 billion of option premium changed hands in GME contracts alone, across 351 thousand individual prints; the 28th added $3.97 billion more. And one detail the retelling usually skips: the tape was put-heavy at the top. Calls were only 24% of contract volume on the 27th (1.05 million puts against 0.33 million calls) and 29.5% on the 28th. Alongside the crowd chasing the upside, a crowd was paying for downside as the top formed.

The aftermath: the round trip down

January 28 was not the end. The next session, January 29, limited buying resumed at the restricted brokers, position caps at Robinhood at one point measured in single-digit share counts, and GME closed at $328.24, up 66.2% on the day. It was the last close anywhere near the highs.

QueryGME daily close and volume: January 29 to February 9, 2021
sessionclose_usdchange_pctshares_m
2021-01-29328.2466.250.1
2021-02-01227-30.837.3
2021-02-0290.47-60.178.1
2021-02-0392.041.742.6
2021-02-0453.38-4262.3
2021-02-0563.7619.481
2021-02-0859.96-625.6
2021-02-0950.32-16.126.7
The exact SQL behind every number
SELECT
    toString(et_date) AS session,
    close_usd,
    round(if(prev_close = 0, NULL, (close_usd / prev_close - 1) * 100), 1) AS change_pct,
    shares_m
FROM (
    SELECT et_date, close_usd, shares_m,
           lagInFrame(close_usd) OVER (ORDER BY et_date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_close
    FROM (
        SELECT
            toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
            round(argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959), 2) AS close_usd,
            round(toFloat64(sum(volume)) / 1e6, 1) AS shares_m
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'GME'
          AND window_start >= toDateTime('2021-01-27 00:00:00') AND window_start < toDateTime('2021-02-09 23:59:00')
        GROUP BY et_date
    )
)
WHERE et_date >= toDate('2021-01-29') AND et_date <= toDate('2021-02-09')
ORDER BY et_date
Run this yourself

The way down was as steep as the way up: -30.8% on 2021-02-01, -60.1% on 2021-02-02, and by 2021-02-04 the close was $53.38, in a stock that had printed $483 five sessions earlier. The fortnightly short-interest file records what the squeeze had accomplished by then:

QueryGME reported short interest by settlement date: November 2020 to February 2021
settledshares_short_mdays_to_cover
2020-11-1367.514
2020-11-30688.7
2020-12-1568.16.9
2020-12-3171.26.1
2021-01-1561.82.1
2021-01-2921.41
2021-02-1216.51
2021-02-2614.21
The exact SQL behind every number
SELECT toString(settlement_date) AS settled,
       round(short_interest / 1e6, 1) AS shares_short_m,
       round(days_to_cover, 1) AS days_to_cover
FROM global_markets.stocks_short_interest
WHERE ticker = 'GME'
  AND settlement_date >= '2020-11-01'
  AND settlement_date <= '2021-02-28'
ORDER BY settlement_date
Run this yourself

From 71.2 million shares short at the 2020-12-31 settlement, reported short interest collapsed to 21.4 million by 2021-01-29, the settlement one session after this page's date, and days to cover fell from 14 at the November peak to 1. The shorts whose positions defined the setup were, by this measure, largely gone by month-end; the anatomy of that unwind is in the short squeeze explainer, and the difference between this fortnightly figure and daily short-sale volume is covered in short interest vs short volume.

What this day teaches

For all its meme-era costume, January 28 is a classical liquidity lesson. A stock's price is set by its most urgent marginal order, and when position-closing urgency (shorts buying), access restrictions (brokers limiting buys), and mechanical pauses (LULD halts) all land on the same tape, price discovery happens in staccato jumps rather than curves. Nothing about the day requires a villain to explain its shape, and nothing in the minute bars can rule one in or out. The receipts above are what actually printed.

GameStop January 28 FAQ

What was GameStop's highest price ever?

$483 (intraday, as-traded), printed on the morning of January 28, 2021. Split-adjusted for the 2022 four-for-one split, that corresponds to $120.75 on today's share count.

Why did Robinhood restrict buying GameStop?

Robinhood moved GME and other names to position-closing only on January 28, 2021, and attributed the decision to a clearinghouse deposit call it put at roughly $3 billion that morning. It raised over a billion dollars from investors overnight and restored limited buying the next session. Congressional testimony and the SEC's 2021 staff report document the account.

Did Robinhood cause the GameStop crash?

The tape records the sequence, not the verdict: restrictions were announced before the open, GME gapped -23.2% down, printed its $483 record and its $112.25 low within two hours, and every restricted name closed down double digits the same day. Which ingredient mattered most is still argued; the SEC's staff report declined to settle it.

How many times was GME halted on January 28, 2021?

The minute tape shows 314 regular-session bars instead of 390, roughly seventy-six minutes lost to repeated Limit Up/Limit Down halts. That made January 28 the heaviest halt day of the entire squeeze: no other session from January 25 through February 4 kept fewer than 348 regular-session bars.

What happened to GME after January 28, 2021?

One more surge, a close of $328.24 on January 29, and then the slide: by 2021-02-04 the stock closed at $53.38, and reported short interest had already collapsed to 21.4 million shares at the January 29 settlement.


Every panel above is a stored, versioned query over the historical tape, expand the SQL to see each measurement. Want to feel this day instead of reading it? It is one of the playable scenarios in the Strasmore Labs trading simulator.

#market history#gamestop#short squeeze#halts#robinhood