Strasmore Research
Learn Matt ConnorBy Matt Connor · Updated 2026-09-28

NYSE Imbalance Messages: How to Read Them

NYSE imbalance messages explained: what paired shares and the unmatched imbalance actually mean, and how the indicative clearing price is computed.

NYSE imbalance messages are the exchange's running preview of its own auction. Before the closing bell NYSE publishes a small record, refreshed at least once a second, that says how many shares already have a match, how many do not, which side the unmatched shares sit on, and where the auction would price if it ran at that instant. Vendors rename those fields and sell the feed. The quantities underneath are defined by exchange rule, and every one of them is explainable in plain English.

What is a NYSE imbalance message?

An auction gathers every order that wants to trade at a single price and crosses them together at that price. NYSE runs one at the open and one at 4:00 p.m. ET. The 4:00 p.m. version, the closing auction, sets the official closing price quoted everywhere.

An imbalance is the leftover. If 900,000 shares want to buy at the close and 700,000 want to sell, 700,000 pair off and 200,000 buy shares have nobody to trade with.

A message carries four things worth knowing.

  • Paired quantity: the volume that already matches and would trade. 700,000 in the example above. Some feeds abbreviate it to p.
  • Imbalance quantity and its side: 200,000, buy. Some feeds abbreviate the quantity to o. Quoted without a side it means nothing.
  • Indicative clearing price: where the auction would print if it ran at this instant, meaning the price that maximizes paired volume.
  • Book clearing price (b) and auction time (at): the price at which the unmatched shares would meet enough opposite interest to fill, and the moment the auction is scheduled to run.

Field names vary by vendor. The definitions come from the exchange and do not.

How to read the three numbers: a worked example

The order book below is invented for teaching. Say it holds 20,000 shares of market-on-close buy interest and 5,000 of market-on-close sell interest, orders that trade at whatever price the auction sets. Alongside them sit limit-on-close orders. Buyers: 10,000 at $50.10, 15,000 at $50.05, 20,000 at $50.00, 5,000 at $49.95. Sellers: 8,000 at $49.95, 12,000 at $50.00, 6,000 at $50.05, 30,000 at $50.10.

Walk the price ladder. At each candidate price, total everyone willing to buy at that price or higher, total everyone willing to sell at that price or lower, and the smaller number is what can actually trade.

  1. At $49.95: 70,000 would buy, 13,000 would sell. Paired 13,000, imbalance 57,000 buy.
  2. At $50.00: 65,000 would buy, 25,000 would sell. Paired 25,000, imbalance 40,000 buy.
  3. At $50.05: 45,000 would buy, 31,000 would sell. Paired 31,000, imbalance 14,000 buy.
  4. At $50.10: 30,000 would buy, 61,000 would sell. Paired 30,000, imbalance 31,000 sell.

The most that can cross is 31,000 shares, at $50.05. That is the indicative clearing price, the paired quantity is 31,000, and the imbalance is 14,000 shares to buy. Move a nickel higher to $50.10 and the imbalance flips to the sell side, which makes $50.10 the level where those 14,000 unmatched buy shares would finally meet enough sellers.

Notice what changed between step 3 and step 4. Nothing about the company, nothing about the orders. Only the price the book is measured at. Every quantity in an imbalance message is a function of that price, which is why the message publishes the price next to the shares.

When does NYSE publish closing auction imbalance data?

There are two publications, and confusing them is the most common mistake.

From 2:00 p.m. ET the exchange makes closing auction imbalance information available to Floor brokers: total imbalance and its side, paired quantity, and unpaired quantity and its side. That early view is informational, and its audience is narrow.

At 3:50 p.m. ET the mandatory publication begins. Under NYSE Rule 7.35 that moment is the Closing Auction Imbalance Freeze Time, and three things happen together. Imbalance information starts going out publicly and updates at least every second through to the bell. The ordinary entry window for market-on-close and limit-on-close orders shuts. NYSE also evaluates whether the imbalance is large enough to carry a Significant Closing Imbalance flag, a dynamic calculation that replaced the older fixed 500 round lot Regulatory Imbalance threshold in October 2024.

Between 3:50 p.m. and 4:00 p.m., MOC and LOC orders may still arrive, but only on the side that offsets the published imbalance. From 3:50 p.m. to 3:58 p.m. existing MOC and LOC orders may be cancelled or cut in size only to correct a genuine error. The auction runs at 4:00 p.m.

Two caveats matter more than the times themselves. First, these are exchange rules, and exchange rules move: NYSE filed amendments touching Rules 7.31, 7.35 and 7.35B as recently as August 2026. Take the schedule from NYSE's own auction fact sheet rather than a vendor blog post, and re-check it yearly. Second, the opening auction runs on a different clock, with entry deadlines covered in MOC and MOO order cutoff times.

How much volume runs through the closing auction

Why any of this matters comes down to size. The panel below takes six NYSE listed household names across July 2026 and asks what share of each session's volume printed in the opening auction and what share printed in the closing auction. Each auction is a single trade on the tape, and the panel reads that trade directly.

QueryShare of regular-session volume in the opening and closing auction prints, July 2026
tickeropening_print_pctclosing_print_pct
JPM1.928.67
PG2.5122.75
JNJ2.0120.12
HD1.6918.35
KO2.1618.16
XOM1.6117.7
The exact SQL behind every number
SELECT
    ticker,
    round(100 * sum(opening_print) / sum(closing_print + session_shares), 2) AS opening_print_pct,
    round(100 * sum(closing_print) / sum(closing_print + session_shares), 2) AS closing_print_pct
FROM
(
    SELECT
        ticker,
        toDate(toTimeZone(sip_timestamp, 'America/New_York')) AS trade_date,
        toFloat64(maxIf(size, has(conditions, 17))) AS opening_print,
        toFloat64(maxIf(size, has(conditions, 8)))  AS closing_print,
        toFloat64(sumIf(size, NOT hasAny(conditions, [8, 15, 16, 38])
            AND toHour(toTimeZone(sip_timestamp, 'America/New_York')) * 60
              + toMinute(toTimeZone(sip_timestamp, 'America/New_York')) BETWEEN 570 AND 959)) AS session_shares
    FROM global_markets.stocks_trades
    WHERE ticker IN ('JNJ', 'JPM', 'KO', 'PG', 'HD', 'XOM')
      AND sip_timestamp >= '2026-07-01 00:00:00'
      AND sip_timestamp <  '2026-08-01 00:00:00'
    GROUP BY ticker, trade_date
    HAVING countIf(has(conditions, 8)) > 0
)
GROUP BY ticker
HAVING sum(session_shares) > 0
ORDER BY closing_print_pct DESC
Run this yourself

In JPM the closing auction print carried 28.67% of regular session volume, the largest share of the six, against 1.9% for the opening auction print. That is one trade at one price, which is what makes a 3:50 p.m. imbalance in a large cap worth watching.

The smallest closing share of the six, 17.7% in XOM, is still a single trade. Measuring it takes some care with the data. The one-minute volume bars on this tape leave the closing auction print out entirely, so a 16:00 bar holds only the scattered trades around it, and on some NYSE names the print itself is stamped a few minutes after the bell. Each print here is found by its sale condition, the code the tape attaches to an auction trade, rather than by the minute it lands in. Check how a feed records the closing print before you read a closing share off it.

What the tape does across the imbalance window

The imbalance publication lands inside the busiest stretch of the session. This panel averages one of those names, Coca-Cola, into five minute buckets from 3:00 p.m. ET to the bell, with the closing auction print as its own final bar, over the same July 2026 sessions.

QueryCoca-Cola average volume per five-minute bucket from 3:00 p.m. ET, then the closing auction print, July 2026
et_timeavg_shares_k
15:00147.6
15:05126.7
15:10125.5
15:15122.8
15:20135.4
15:25138.7
15:30169.2
15:35153.8
15:40193.4
15:45379.8
15:50392.6
15:551090.2
16:002915.6
The exact SQL behind every number
SELECT
    et_time,
    round(sum(shares) / countDistinct(trade_date) / 1000, 1) AS avg_shares_k
FROM
(
    SELECT
        toDate(toTimeZone(sip_timestamp, 'America/New_York')) AS trade_date,
        if(has(conditions, 8), '16:00',
           formatDateTime(toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 5 MINUTE), '%H:%i')) AS et_time,
        toFloat64(size) AS shares
    FROM global_markets.stocks_trades
    WHERE ticker = 'KO'
      AND sip_timestamp >= '2026-07-01 00:00:00'
      AND sip_timestamp <  '2026-08-01 00:00:00'
      AND NOT hasAny(conditions, [15, 16, 38])
      AND (has(conditions, 8)
           OR toHour(toTimeZone(sip_timestamp, 'America/New_York')) * 60
              + toMinute(toTimeZone(sip_timestamp, 'America/New_York')) BETWEEN 900 AND 959)
)
GROUP BY et_time
ORDER BY et_time
Run this yourself

The 15:00 bucket averaged 147.6 thousand shares. The final bar, labelled 16:00, is the auction print alone, and it averaged 2915.6 thousand. The step up coincides with the mandatory publication at 3:50 p.m. and peaks at the auction print itself. Volume behaves the opposite way in the middle of the day, a pattern measured in why trading volume dies at midday.

Why a published imbalance keeps changing

Here is what vendor tutorials tend to undersell. The 3:50 p.m. imbalance describes a book that still has ten minutes of orders coming into it. Offsetting interest arrives precisely to work against a published imbalance, d-Quote orders can be entered and updated after the MOC cutoff, and the indicative price is recomputed continuously until the cross.

You can size that gap without any imbalance feed. Compare the price at 3:50 p.m. with the official closing price for the same session.

QueryGap between the 3:50 p.m. price and the official close, July 2026 sessions
tickermedian_move_bpslargest_move_bps
XOM2342.7
PG18.575.9
JPM14.336.8
KO13.241.9
HD1346.6
JNJ1336.1
The exact SQL behind every number
SELECT
    d.sym AS ticker,
    round(quantileDeterministic(0.5)(abs(d.official_close / m.px_1550 - 1) * 10000,
                                     toUInt64(toUnixTimestamp(d.session_date))), 1) AS median_move_bps,
    round(max(abs(d.official_close / m.px_1550 - 1) * 10000), 1)                    AS largest_move_bps
FROM
(
    SELECT
        ticker                AS sym,
        date                  AS session_date,
        max(toFloat64(close)) AS official_close
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('JNJ', 'JPM', 'KO', 'PG', 'HD', 'XOM')
      AND date >= '2026-07-01'
      AND date <  '2026-08-01'
    GROUP BY sym, session_date
) AS d
INNER JOIN
(
    SELECT
        ticker                                               AS sym,
        toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
        max(toFloat64(close))                                AS px_1550
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('JNJ', 'JPM', 'KO', 'PG', 'HD', 'XOM')
      AND window_start >= '2026-07-01'
      AND window_start <  '2026-08-01'
      AND toHour(toTimeZone(window_start, 'America/New_York'))   = 15
      AND toMinute(toTimeZone(window_start, 'America/New_York')) = 50
    GROUP BY sym, session_date
) AS m ON m.sym = d.sym AND m.session_date = d.session_date
GROUP BY d.sym
ORDER BY median_move_bps DESC, ticker
Run this yourself

A basis point is one hundredth of one percent. Across July 2026 the median gap between the 3:50 p.m. price and the official close ran from 13 basis points in JNJ up to 23 in XOM, the widest of the six. The largest single session gap for XOM across the month reached 42.7 basis points.

Size is one question. Direction is another, and it sits much closer to a coin flip.

QueryHow often the close finished above the 3:50 p.m. price, July 2026 sessions
tickerpct_closed_higherpct_moved_over_10bps
PG68.272.7
JNJ63.668.2
JPM59.159.1
XOM59.181.8
HD54.559.1
KO54.572.7
The exact SQL behind every number
SELECT
    d.sym AS ticker,
    round(100 * countIf(d.official_close > m.px_1550) / count(), 1)                       AS pct_closed_higher,
    round(100 * countIf(abs(d.official_close / m.px_1550 - 1) * 10000 > 10) / count(), 1) AS pct_moved_over_10bps
FROM
(
    SELECT
        ticker                AS sym,
        date                  AS session_date,
        max(toFloat64(close)) AS official_close
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('JNJ', 'JPM', 'KO', 'PG', 'HD', 'XOM')
      AND date >= '2026-07-01'
      AND date <  '2026-08-01'
    GROUP BY sym, session_date
) AS d
INNER JOIN
(
    SELECT
        ticker                                               AS sym,
        toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
        max(toFloat64(close))                                AS px_1550
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('JNJ', 'JPM', 'KO', 'PG', 'HD', 'XOM')
      AND window_start >= '2026-07-01'
      AND window_start <  '2026-08-01'
      AND toHour(toTimeZone(window_start, 'America/New_York'))   = 15
      AND toMinute(toTimeZone(window_start, 'America/New_York')) = 50
    GROUP BY sym, session_date
) AS m ON m.sym = d.sym AND m.session_date = d.session_date
GROUP BY d.sym
ORDER BY pct_closed_higher DESC, ticker
Run this yourself

The share of July 2026 sessions that closed above their own 3:50 p.m. price ranged from 54.5% in KO to 68.2% in PG. In PG the move over that final stretch cleared 10 basis points in 72.7% of sessions. Read a published imbalance as a description of the book at one second, and expect it to be revised.

Where imbalance messages sit in a market data feed

An imbalance message is its own message type on the exchange's proprietary feed, separate from the top of book quote and from depth of book updates. A retail platform showing you a bid and an ask will usually show nothing at all at 3:50 p.m. The gap between those tiers of data is the subject of Level 1 vs Level 2 market data.

FAQ

What does the imbalance quantity in a NYSE imbalance message mean?

It is the number of shares in the closing auction book with no matching order on the other side at the indicative clearing price, published together with a side. A 200,000 share buy imbalance means 200,000 more shares want to buy at the close than to sell.

What time does NYSE publish closing auction imbalance information?

Public dissemination begins at 3:50 p.m. ET, the Closing Auction Imbalance Freeze Time, and updates at least every second until the 4:00 p.m. auction. A narrower informational view is available to Floor brokers from 2:00 p.m. These times are set by exchange rule and amended periodically, so confirm them against NYSE's published schedule.

What is the difference between paired quantity and imbalance quantity?

Paired quantity is the volume that already has a match and would trade in the auction. Imbalance quantity is the unmatched remainder. Add the two together and you have the total interest sitting on the heavier side of the book.

Does a buy imbalance mean a stock will close higher?

No. An imbalance describes the book at one instant, and offsetting orders keep arriving until the auction runs. The panels above show prices between 3:50 p.m. and the close moving in both directions across the sessions measured.

How these panels are built
  • The two auction panels read the consolidated tape trade by trade. The opening and closing auction prints are the trades carrying the opening-trade and closing-print sale conditions, one of each per name per session, found by that label rather than by the minute they land in: the one-minute volume bars on this tape leave the closing print out, and on some names the print is stamped a few minutes after the bell. Regular-session volume is the closing print plus every other trade stamped 09:30 through 15:59 ET, leaving out the official open and close summary records.
  • All four panels are pinned to July 2026 sessions, so the figures stay put as new data arrives.
  • The 3:50 p.m. reference price is the close of that session's 15:50 one minute bar. The official close comes from the daily record for the same date.
  • Gaps are measured in absolute terms, so an up move and a down move of the same size count equally.

Every panel here ships with the SQL that produced it, so open one and the arithmetic is in front of you. To run the same questions over different NYSE listed names or a different month, ask them in plain English on the Strasmore terminal.