Market Maker Inventory: Why Spread and Depth Move Together

The order book is usually read from the taker's side: how far the price moves if I buy. The same book looks different from the side that posts it. A market maker quotes two prices and two sizes, both of which are functions of how much inventory it is carrying and how much it expects to be picked off. This guide explains the quoting decision, why spread and depth widen and thin together, and what a published depth feed can and cannot tell you about either.

CoinSoso EditorialPublished Article #00119Updated

Cover artwork: CoinSoso · AI-generated, not a photograph of a real venue, product or market capture.

Key takeaways

  • A maker's spread pays for three things: the cost of operating, the risk of holding the position the flow leaves behind, and the risk of trading against someone who knows more.
  • Inventory risk is directional: a maker who has been filled on the bid is long, and the cheapest way to reduce a long is to quote lower on both sides rather than to wait for the mid to come back.
  • Size posted at the top of book is a risk budget, not a statement of the maker's view. When inventory limits bind, the quote stays and the size shrinks.
  • Published depth is a snapshot on a stated refresh: OKX's standard books channel sends 400 levels with incremental updates every 100 ms and a checksum, while its low-latency channel sends the same 400 levels every 10 ms.
  • Binance's REST depth endpoint caps at 5,000 levels, defaults to 100 and is served from memory, so what you retrieve is the venue's cached view at the moment of the request.

The short answer

A market maker sells immediacy. The price of immediacy is the spread, and the spread is not a markup on a known cost — it is compensation for two risks that the maker cannot measure exactly:

  • Inventory risk. Every fill leaves the maker holding the other side. The position has to be carried until it can be unwound, and the price can move against it in the meantime.
  • Adverse selection risk. Some of the takers who hit a quote know something the maker does not. Those fills are, on average, followed by a move against the maker’s new position.

Spread and depth are two dials on the same control. When either risk rises, a maker who keeps quoting must either widen the spread or shrink the size — usually both. That is why thin books and wide spreads appear together, and why the two observations are one phenomenon rather than two.

What a quote actually is

A quote is two prices and two sizes. It is a limit order on each side of the book, and both sides are optional. A maker with no appetite for one direction can leave a price and set the size to zero, or pull the quote entirely.

The decision has a shape that can be written down:

quote_bid = mid − (base_cost + inventory_penalty + adverse_selection_cost)
quote_ask = mid + (base_cost + inventory_penalty + adverse_selection_cost)

base_cost covers operations and the venue’s fees. adverse_selection_cost rises with volatility and with the proportion of informed flow in the market. inventory_penalty is the interesting one, because it is directional: it is not the same on both sides.

Inventory risk has a sign

Suppose a maker has been quoting a 10-basis-point market on both sides and the flow has been one-way. Buyers have been lifting the offer, so the maker is now short. To get flat, the maker needs the price to fall, or needs to buy.

Waiting is a position. The maker’s alternative is to skew the quotes: raise both the bid and the ask, so the bid is more attractive to sellers and the ask is less attractive to buyers. The spread can stay the same width while the whole quote moves up. That is what a skew looks like in the data — not a wider market, a displaced one.

The mirror case is the common one. A maker who has been filled on the bid is long, and the cheapest way to reduce a long is to quote lower on both sides: a bid that attracts fewer sellers, an ask that attracts more buyers. When you see the best bid and best ask both step down while the mid is unchanged, you are often watching a maker work off a long position rather than a change in the market’s view.

This is why “the maker is bearish” is the wrong inference from a skewed quote. The skew reports a position, not an opinion. A maker can be long because it was doing its job and be quoting lower precisely because it wants not to be.

Adverse selection: why the spread is wider than the cost

The second component is harder to see and larger than most takers assume. Some fraction of the flow that hits a quote is trading on information about the next move. Those fills are systematically unprofitable for the maker: the price moves in the taker’s direction immediately afterwards, and the maker’s inventory is on the wrong side of the move.

The maker cannot identify informed flow before the fill, so the defence is a price. A spread that looks generous relative to operating costs is often barely covering the informed fraction of the flow. This is also why spreads behave non-linearly around news: when the proportion of informed takers rises, the required spread rises faster than the volatility alone would suggest.

It explains a pattern that puzzles new traders. A market can have deep liquidity, high volume and a persistently wide spread if the flow is toxic — if a large share of takers are faster or better informed than the quoters. Volume is not a proxy for cheapness. The maker versus taker guide covers the fee side of the same asymmetry; this is the price side.

A maker who is long moves both quotes down to attract buyers, keeping the spread width while displacing the mid Same spread, displaced quote flat inventory: quote centred on the mid bid ask mid long inventory: both quotes stepped down bid ask Width in basis points is unchanged; the centre moved. The maker is not expressing a view, it is reducing a position. Illustrative geometry, not a market capture.
Inventory skew moves the quote without necessarily changing its width. Reading a displaced book as a directional signal mistakes a position for a forecast.

Why size, not just price, is the second dial

A maker has a risk limit as well as a price. When inventory approaches the limit, the constraint binds on quantity: the quote can remain, and the size behind it shrinks or disappears.

This produces the pattern that most surprises takers. The best bid might show a small quantity while several levels below show much larger ones. The obvious reading — “the market is thin at the top, deep below” — is correct and incomplete. The small top size is often a maker managing the risk of being filled again, while the deeper size belongs to participants who are willing to be filled only if the price moves in their favour first. The deeper levels are not a promise to buy at the touch; they are a promise to buy 20 basis points lower.

For a taker, the practical consequence is that the cost of a market order is not the top-of-book spread. It is the spread plus the walk down the ladder, which is what the spread, depth and slippage guide measures, and the reason the order book imbalance guide treats depth as a distribution rather than a number.

What you can actually observe

The quoting model above describes a continuous process. What a venue publishes is a sampled version of it, and the sampling matters.

Binance’s REST depth endpoint returns bids and asks as arrays of price and quantity, along with a lastUpdateId. The limit parameter defaults to 100 and caps at 5,000, and the request weight scales with the number of levels: 5 up to 100 levels, 25 up to 500, 50 up to 1,000 and 250 up to 5,000. The documentation labels the data source as memory, and its own key orders the possible sources by potential delay — matching engine, then memory, then database — so a memory-sourced snapshot is not the engine’s live state.

OKX publishes its book over channels with stated refresh intervals. The standard books channel sends an initial snapshot of 400 levels and then incremental updates every 100 ms, with a checksum for validation and sequence IDs for ordering. The books-l2-tbt channel sends the same 400 levels with updates every 10 ms, and the documentation restricts it to API users at VIP4 or above in the venue’s trading fee tier, with everyone else receiving an error. books5 sends five levels, re-pushed every 100 ms when they change; bbo-tbt sends the single best bid and offer every 10 ms. There is also a REST full-order-book endpoint, updated once a second, whose sz parameter is the depth per side, capped at 5,000 — 5,000 bids plus 5,000 asks — and defaults to one level.

Three consequences follow, and all three are load-bearing for anyone reasoning about liquidity:

  1. Depth is a sample. Orders that arrive and cancel between two updates never appear. On the 100 ms channel, a tenth of a second of quoting activity is invisible.
  2. The visible level may not be the tradeable level. OKX documents RPI liquidity — resting orders with a retail price improvement flag — where the quantity shown at a level can differ from the quantity a given taker can actually execute against, and where resting RPI orders can be hidden under the matching rules. The same documentation states that for these channels the third element of a level, the non-RPI quantity, is a deprecated field always returned as zero.
  3. Completeness is a request parameter, and the default is not complete. Asking for 400 levels when the book has 5,000 is not the same observation as asking for 5,000, and a REST request that omits sz returns a single level per side. A depth measurement without its level count is not reproducible.

There is a fourth, less obvious consequence. The richer books channels are not equally available: OKX’s documentation reserves books-l2-tbt for VIP4 and above, and the consolidated books-rpi channel publishes non-RPI quantity as a separate element while carrying no checksum, sequencing instead on seqId and prevSeqId. Two participants can therefore be looking at feeds with different refresh rates and different visibility into the same level, and neither is looking at “the market” in the abstract.

A worked cost illustration

Consider a maker quoting 100 units on each side of a market where the best bid and the best ask sit 10 basis points either side of the mid, so a round trip captures about 20 basis points of notional if both sides fill at the quoted prices. Constructed example.

  • Ten round trips in a day is 20 fills on 100 units at a price of 1,000, or 100,000 of notional per fill. Ten basis points on each leg is 100 per fill and 200 per round trip, so 2,000 for the day.
  • If one of those twenty fills is informed and the price moves 40 basis points against the maker before the position is unwound, the loss on that fill is 400.
  • Five such fills consume the day’s spread capture.

The numbers are invented; the structure is not. Spread capture scales with the number of fills, and adverse selection scales with the size of the moves. A market where the second term is large requires a wider spread to break even, which is why the same venue can show a tight spread in calm conditions and a wide one in a news minute without anyone changing their business model.

How to read a book without over-reading it

  • Measure the spread against volatility, not against yesterday. A 2-basis-point spread on a 20-basis-point hourly range is not tight.
  • Note the level count and the refresh rate behind any depth claim. Two measurements taken at different depths are not comparable.
  • Treat the top of book as the risk budget, and the deeper levels as prices at which other participants are willing to be filled.
  • Do not read skew as direction. It is a position.
  • Do not read a wall as support. It is a quote with conditions, one of which is that the quoter’s inventory has not changed.

For the order-type side of the same subject — how a post-only order interacts with a book that is moving — the iceberg, post-only and TWAP guide covers what happens when a resting order is refused rather than filled.

Risk note. Endpoint limits, channel names, refresh intervals and field semantics in this article were read from Binance’s spot API documentation and OKX’s v5 API documentation on 2026-10-29 and are reproduced as those documents state them. Venues change feed structure and limits without notice. The cost example is constructed arithmetic and is not a description of any participant’s results. Nothing here is investment advice.

Sources

How this was researched. Written from primary documentation and the exchange or protocol's own published material, with sources listed at the end of the article.

Primary sources for the factual claims on this page. A date appears only where a human has actually read the source; where it is missing, the check is still outstanding.

  1. Binance Spot API — Order book (GET /api/v3/depth): limit default and maximum, per-limit weights, lastUpdateId, bids and asks format, data source(read 2026-10-29)
  2. OKX API v5 — Order book channels (books 400 levels at 100 ms, books-l2-tbt at 10 ms and VIP4 eligibility, books5, bbo-tbt, books-rpi, checksum and sequencing, full order book REST endpoint with per-side size cap)(read 2026-10-29)

Frequently asked questions

Why does the spread widen when volatility rises?

Because the maker's two risks both grow with the size of the next price move. Inventory held during a fast market can lose more before it can be unwound, and the chance that the next taker is trading on information rather than liquidity rises. A wider spread is the price of accepting either risk, so when the risks rise the price rises with them.

Why is the size at the best bid so small when the book looks deep behind it?

Because the top of book is where adverse selection is concentrated and where inventory limits bind first. A maker will often quote a small size at the touch and larger size further away, where a fill is less likely to be informed and where the price has already moved in the maker's favour. The [spread, depth and slippage guide](/guides/spread-depth-and-slippage-explained/) measures the cost of walking that ladder.

Is displayed depth the real liquidity?

No. It is the liquidity the venue publishes on a stated schedule. OKX's standard books channel sends incremental updates every 100 ms with a checksum; its low-latency channel sends them every 10 ms. Anything that arrives, fills and is cancelled between two updates is invisible in the feed. OKX also documents resting RPI orders that may be hidden under its matching rules, which is the venue telling you that the visible level is not the whole level.

Does a large bid wall mean the price will hold?

It means someone is willing to buy at that price at the moment the snapshot was taken. Whether the order is still there when the price reaches it depends on the same inventory logic that put it there: a maker whose position changes will move or pull the quote. Reading a wall as a commitment confuses a quote with a promise.

How often can I retrieve depth from Binance?

The REST endpoint is weighted by the number of levels requested: 5 for up to 100 levels, 25 for 101 to 500, 50 for 501 to 1,000 and 250 for 1,001 to 5,000. The limit defaults to 100 and caps at 5,000. For anything resembling real-time observation, the websocket stream is the appropriate source, not repeated REST calls.

Where to go next

Independent research. Each card shows the platform’s invite code, and its Create Account button is a referral link that may earn us a commission at no extra cost to you. Whether an account can be opened is decided by the platform at sign-up.

Binance

One of the largest global exchanges by traded volume, with a very broad product range.

20% Trading Fee Rebate

Use invite code con888 when signing up to enjoy trading fee benefits.

Download Android App

Download from the exchange's official download service. Verify the source and follow the on-screen installation instructions.

Do not install an APK from an unknown source, or one that has been modified or cannot be checked.

Read review →

OKX

A large global exchange offering spot, derivatives and a self-custody wallet.

20% Trading Fee Rebate

Enter invite code con888 when signing up to check available trading fee benefits.

Download Android App

Download from the exchange's official download service. Verify the source and follow the on-screen installation instructions.

Do not install an APK from an unknown source, or one that has been modified or cannot be checked.

Read review →