Trading strategies·mm-inventory

Inventory management

structural
Reviewed 4 June 2026. As of 2026: a permanent feature of the market, not an edge that decays.

A filled quote leaves you holding a position. Skew your quotes against your inventory (quote more aggressively on the side that flattens you) so the book mean-reverts toward zero before a move hurts.

See it move

Inventory skewdrag inventoryIX-INVENTORY
Inventory q+0
Reservation price100.000
Your bid99.206
Your ask100.794
midreservationbidask
Current inventory q+0
Risk aversion γ0.50

What to notice. Go long (q > 0) and both quotes slide down: you quote a keener ask to offload and a stingier bid to stop accumulating. The book mean-reverts your position toward flat. Raise γ and the skew gets more aggressive.

Why does a market maker accumulate inventory?

Because fills arrive unpaired. A maker posts a two-sided quote, but buyers and sellers do not show up in matched pairs: a run of sellers hitting the bid leaves it long; a run of buyers lifting the ask leaves it short. With nothing pulling the position back, inventory follows a random walk and drifts to levels the maker was never paid to hold.

Even if hits and lifts were a fair coin, your inventory would still wander. A symmetric random walk has no mean reversion, and its spread grows like t\sqrt{t}, so over a session that is enough to drift you to a large long or short purely by chance, before any directional flow even shows up. Each fill nudges the position one way; nothing nudges it back.

That wandering position is the inventory-risk leg of the market-making trilemma. A maker wants to earn the spread, not bet on direction, but every unit of inventory is an un-asked-for directional bet whose mark moves with the price (see fat tails): one adverse move on a large position erases days of spread capture. Worse, the flow that grows your inventory is often informed: a one-sided run of sellers may be sellers who know something (adverse selection). Uncontrolled inventory and toxic flow tend to arrive together, exactly when you least want a big position. Switch the skew off in the simulator above and watch the path stick near the limit under a one-sided imbalance.

What is symmetric quoting, and why is it dangerous?

Symmetric quoting places the bid and ask an equal distance either side of the mid, regardless of the maker's position. It maximises spread capture per fill but does nothing to flatten inventory, so the position random-walks freely, accumulates directional risk, and tends to get stuck at the limit. It is the naive baseline every skew rule improves on.

Symmetric quoting treats every fill the same whether you are flat or dangerously long. You keep buying on the bid even when you are already long 500 lots, because your quotes never lean to discourage it. The book has no reason to sell you back to flat, so it does not. This is the "naive symmetric ladder": the simplest possible market maker, and the right thing to start from precisely because it fails in an instructive way: under any flow imbalance the inventory path drifts to the position limit and parks there, carrying risk you were never compensated for.

The fix is to make the quotes care about inventory, to lean them so the flattening side is cheaper to hit. Everything below is a way of doing that, from a crude linear lean to the principled Avellaneda–Stoikov reservation-price shift.

What is inventory skew?

Inventory skew shifts both quotes toward the side that flattens the book. When the maker is long, it lowers both bid and ask, making its ask keener to be lifted (sell, get flat) and its bid less keen to be hit (stop buying more). When short, it raises both. The market then preferentially trades the maker back toward zero inventory.

You tilt the whole quote, not the spread width. Long 50 lots? Drop both quotes by an amount proportional to how long you are. Your ask is now closer to (or below) the mid, so it gets lifted and you sell off the position; your bid is further from the mid, so you buy less. The position mean-reverts instead of random-walking. The workhorse heuristic is linear inventory skew: shift the quote centre by a constant kk times your signed inventory qq, then place the bid and ask a fixed half-spread either side of that centre.

Shift both quotes away from your inventory by a constant skew strength times your signed position; quote the half-spread around that shifted centre.
centre  =  s    kq\text{centre} \;=\; s \;-\; k\,q

Here ss is the mid, qq the signed inventory in lots, and kk the skew strength, a tuning knob. Simple, robust, and what most independent and crypto bots actually run. This is exactly the Avellaneda–Stoikov reservation price r=sqγσ2(Tt)r = s - q\,\gamma\,\sigma^{2}\,(T-t) with the inventory coefficient k=γσ2(Tt)k = \gamma\sigma^{2}(T-t) made explicit and time-/volatility-dependent. Linear skew is the constant-kk simplification of A–S; A–S tells you what kk should be: it grows with risk-aversion, volatility and time-to-close, and fades at the session's end.

The trade-off: more skew flattens faster but gives up spread on the side you are leaning (you sell cheaper / buy dearer than a flat book would). Too little skew and inventory runs away; too much and you bleed spread continuously. There is a sweet spot, and finding it analytically is precisely what A–S does. Push the skew-strength slider above and watch the inventory path pulled back toward flat as the spread-given-up readout climbs.

Position limits and hedging: the backstops

Skew mean-reverts inventory in the average case; position limits and hedging handle the tail. A hard limit stops quoting (or only quotes the flattening side) once inventory hits a cap, so a bad run cannot unbound you. Hedging offsets the residual inventory in a correlated, more liquid instrument, converting position risk into basis risk.

Hard position limits. Set a maximum q|q|. As you approach it, the venue-facing logic widens or pulls the side that would grow the position, and at the cap it quotes the flattening side only. This caps the worst case that skew alone cannot guarantee: skew makes a large position unlikely, limits make it impossible. This is also where kill switches and throttles live: inventory breaching a limit is a classic kill-switch trigger.

Hedging. Rather than wait for the book to flatten you, offset the inventory directly: e.g. a crypto maker long spot hedging in the perpetual future, or an equity maker hedging single-name inventory in an index or ETF. This trades the position's price risk for basis risk (the hedge and the inventory are not perfectly correlated) plus the hedge's own costs and market impact. Sound when the hedge is cheap and liquid; a trap when the basis breaks.

Inventory as a mean-reverting target. The unifying mental model: good inventory management turns the position from a random walk (no pull, variance grows without bound) into a mean-reverting process around a target (usually zero), an Ornstein–Uhlenbeck-like dynamic where skew supplies the restoring force.

Skew acts like a spring: the position is pulled back toward its target at a rate set by the skew strength, with the flow as the random shock. That is mean reversion, not a random walk.
dq  =  κ(qq)dt  +  flow noisedq \;=\; -\kappa\,(q - q^{*})\,dt \;+\; \text{flow noise}

The target qq^{*} need not be zero: a maker with a directional view, or one warehousing risk for a fee, can target a non-zero inventory deliberately. Run the "Hard-limit skew" preset above to see the path capped at the limit even under a strong one-sided flow.

The naive ladder vs the principled model

There is a ladder of sophistication, and most real bots live lower on it than you would think. Each rung adds structure to the same idea: make the quotes lean against inventory so the position mean-reverts.

Rung 0, symmetric. No inventory control; inventory random-walks. An instructive failure, never shipped alone. Rung 1, linear skew + hard limits. centre=skq\text{centre} = s - kq, capped. Simple, robust, the realistic default for an independent or crypto quoting bot in 2026; you tune kk and the limit by hand or a coarse backtest. Rung 2, Avellaneda–Stoikov. k=γσ2(Tt)k = \gamma\sigma^{2}(T-t) derived from risk-aversion, volatility and time-to-close, with the matching optimal spread: the principled answer to "what should kk be?". Rung 3, extended / learned. Multi-asset inventory with hedging, regime-switching volatility, fee/rebate-aware skew, and learned, state-dependent policies (RL or fitted). What AI changes here is mostly calibration (a better, regime-aware kk and limit) not the structure (see what AI changes for HFT).

The honest takeaway: you do not need rung 2 or 3 to not blow up. Rung 1 keeps you alive; the higher rungs squeeze out efficiency. Start at rung 1, understand rung 2, and reach for rung 3 only when the data justifies it. The spread you give up to skew is netted into your P&L exactly as spread vs adverse selection accounts for it.

Worked example

A side-by-side of symmetric versus linearly-skewed quoting on identical synthetic flow, as of a 2026 worked snapshot. Mid s=100.00s = 100.00, half-spread 0.050.05 each side, a flow imbalance running 60% sells / 40% buys (so the maker tends to get long), skew strength k=0.01k = 0.01 per lot. Reproduce it by moving the sliders above.

Symmetric quoting (k=0k = 0). The maker quotes 99.95 / 100.05 throughout, regardless of position. Under the sell-heavy flow it keeps buying on the bid, and after 200 fills its inventory has random-walked to roughly +45+45 lots and is still climbing toward the limit. Its bid never leaned to discourage the buys. Max-q|q| over the run is about 52 lots, and the position's mark-to-market swings dominate the spread P&L.

Linear skew (k=0.01k = 0.01). At inventory q=+45q = +45, the quote centre shifts to 100.000.0145=99.55100.00 - 0.01\cdot 45 = 99.55, so the maker quotes bid 99.50 / ask 99.60: its ask now sits 0.40 below the mid, so it gets lifted and sells off the position.

Long 45 lots, the centre drops to 99.55 and the ask falls to 99.60 (below the mid of 100.00) so the market lifts it and flattens you.
centre=100.000.0145=99.55,pask=99.60,pbid=99.50\text{centre} = 100.00 - 0.01\cdot 45 = 99.55, \quad p^{\text{ask}} = 99.60, \quad p^{\text{bid}} = 99.50

As qq falls, the centre returns toward the mid. The inventory path mean-reverts around a small positive level (set by the residual flow imbalance) instead of drifting; max-q|q| over the same flow is about 18 lots.

The cost of the skew. At q=+45q = +45 the maker sold at 99.60 rather than the 100.05 a symmetric ask would have shown, giving up about 0.45 per lot on those flattening sells. That foregone spread is the price of mean reversion. Drop kk and inventory wanders more but you give up less per fill; raise kk and inventory hugs flat but you bleed spread. The A–S-optimal k=γσ2(Tt)k = \gamma\sigma^{2}(T-t) is the value that balances this against the inventory variance you are avoiding.

With a hard limit of 30 lots. The maker quotes only its ask (the flattening side) once q30q \ge 30, so the position is capped at 30 regardless of how one-sided the flow gets: the backstop skew alone does not guarantee.

The numbers are illustrative and synthetic; real skew strengths and limits are calibrated per instrument, venue and volatility regime. Tune all of this live above. Educational only, not investment advice; no P&L is promised.

Where this fits

Common questions

What is inventory risk for a market maker?
Inventory risk is the danger that filled quotes leave you holding a directional position that then moves against you, turning a spread-capture business into a bet on price. Managing it means skewing quotes against your inventory (quoting more aggressively on the side that flattens you) so the book mean-reverts toward zero. Avellaneda–Stoikov (2008) formalises exactly this skew.