Market Making Strategy Explained: How Market Makers Profit in Stocks and Crypto
Market making is the business of quoting two-sided liquidity and earning the spread as compensation for two costs you underwrite continuously: inventory risk (the price moves against the stock on your shelf) and adverse selection (the counterparty often knows something you don't). The gross spread is not the edge — the edge is the spread minus realized adverse selection minus inventory mark-to-market minus fees. This piece treats market making as the optimization problem it actually is, with the inventory and quoting math that decides whether a quoter compounds or bleeds.
The maker's P&L decomposition
For a maker quoting around a fair value m, every round trip earns the half-spread on each side, but each fill carries information. Decompose realized P&L per share:
maker_pnl ≈ spread_captured
- adverse_selection (price drift right after your fill)
- inventory_cost (mark-to-market on held position)
+ rebates - fees
The brutal asymmetry is in the second term. When your quote is stale and fair value has moved, you fill instantly (you're the best price for an informed taker); when fair value moves your way, the taker cancels and you don't fill. So your fill set is biased toward the trades you wish you hadn't made. A naive maker who books the quoted spread as profit and ignores this term will show a positive gross spread and a negative net P&L. Everything in professional market making is an attempt to estimate and control adverse selection and inventory.
Estimating fair value, not the mid
The mid (bid + ask)/2 is a poor fair-value estimate because it ignores book imbalance. The micro-price weights the mid by the size on each side:
microprice = (bid * ask_size + ask * bid_size) / (bid_size + ask_size)
When the bid is much larger than the ask, pressure is upward and the micro-price sits above the mid — quoting symmetrically around the mid in that state means your ask is systematically too cheap and you get adversely selected. Order-flow imbalance is one of the most robust short-horizon predictors of the next price move; see order flow imbalance signals and the broader market microstructure context. Better fair-value estimation directly reduces the adverse-selection term.
Optimal quoting: the Avellaneda–Stoikov frame
The canonical inventory-aware model sets a reservation price that shifts away from fair value in proportion to your inventory, then quotes a spread around it. With inventory q, risk aversion gamma, volatility sigma, and time-to-horizon (T - t):
reservation_price = m - q * gamma * sigma^2 * (T - t)
optimal_spread ≈ gamma * sigma^2 * (T - t) + (2/gamma) * ln(1 + gamma/kappa)
kappa measures order-book liquidity (how fill probability decays as you quote farther from mid). Two practical readings:
- The reservation price is the inventory steering wheel: long inventory pushes both
quotes down so you're more likely to sell and less likely to buy.
- The optimal spread widens with volatility and risk aversion and narrows with
liquidity. When sigma spikes (news), the model mechanically pulls quotes wider — exactly the right reflex, since adverse selection is worst when uncertainty is high.
def as_quotes(mid, inventory, gamma, sigma, tau, kappa, tick=0.01):
"""Avellaneda-Stoikov reservation price + optimal half-spread.
inventory in signed units; tau = time to horizon (fraction)."""
reservation = mid - inventory * gamma * sigma**2 * tau
spread = gamma * sigma**2 * tau + (2 / gamma) * np.log(1 + gamma / kappa)
bid = reservation - spread / 2
ask = reservation + spread / 2
# round to tradeable ticks
return round(bid / tick) * tick, round(ask / tick) * tick
import numpy as np
print(as_quotes(mid=100.0, inventory=500, gamma=0.1, sigma=0.5, tau=0.5, kappa=1.5))
A simpler, robust production heuristic is a linear inventory skew — shift the quote center by k * inventory — which captures most of the benefit without estimating kappa:
def skewed_quotes(fair_value, half_spread, inventory, k):
center = fair_value - k * inventory # long inventory -> shift down to shed it
return center - half_spread, center + half_spread
Choosing half_spread and k is the entire trade-off: wider spreads and stronger skew protect inventory but win less flow; tighter, more symmetric quotes win volume but raise inventory and adverse selection.
A spread-income reality check
Suppose a 100-share market, mid $100.00, $0.04 spread, 2,000 balanced round trips a day:
gross_daily = 0.04 * 100 * 2,000 = $8,000
From that you subtract net fees (or add rebates), inventory losses on one-sided days, and technology overhead. The shape is high volume, razor-thin margin, fat-tailed inventory risk: a single adverse gap can erase many days of spread. This is why the business is dominated by automation and risk limits, not by clever discretion — and why latency matters even for "just posting limit orders."
Queue position and the cost of being slow
At a price level, fills are typically first-in-first-out. Your position in the queue determines which fills you get:
- Near the front, you fill early — often before informed flow arrives, capturing
clean spread.
- Near the back, you fill late — frequently only when the level is being swept by
informed sellers, i.e. precisely the adversely-selected fills.
So queue position is not a speed vanity metric; it changes the composition of your fills toward or away from toxic flow. This is the structural reason retail cannot make markets on liquid, tick-constrained names like large-cap equities: you will sit at the back of a deep queue and inherit the worst fills.
| Venue / regime | Spread | Who wins it | Retail viability |
|---|---|---|---|
| Large-cap equity | ~1 tick | HFT, queue priority | None |
| Small-cap / illiquid ETF | Several ticks | Patient passive flow | Marginal |
| BTC/USDT tier-1 | $1–$10 | Latency-competitive bots | Low |
| Altcoin perps | 0.1%–1% | Inventory-tolerant bots | Plausible with risk limits |
Adverse selection in depth
Adverse selection is the deepest problem, and it has only two real defenses, in tension with each other and with winning volume:
- Quote wider — charge more for immediacy when uncertainty is high. This
reduces toxic-fill losses but cedes flow to tighter competitors.
- Update faster — shrink the window during which your quote is stale. This is a
latency and fair-value-estimation arms race.
The micro-price and order-flow-imbalance signals above are how sophisticated makers update faster in information terms even without winning the raw-latency race: a better fair-value estimate lets you pull or reprice a quote before the obvious price move, sidestepping some toxicity that a mid-anchored quoter eats.
Crypto: accessible, but the trap is identical
Crypto lowers the barriers — open APIs, no membership, common maker-rebate fee tiers — which is why grid quoting is popular. A grid (a ladder of bids below and asks above mid) is market making: you accumulate as price falls and distribute as it rises, earning the rung spacing. See grid trading. The catch is the inventory trap that no rebate fixes: in a sustained trend you end up holding a large one-sided position exactly when it hurts most — long into a crash, short into a squeeze. On perpetuals, that inventory also carries funding and liquidation risk. Wiring quotes up via CCXT and a trading bot is mandatory, since quotes must update continuously and flatten automatically.
Risk limits are the product
A market-making system is, operationally, a risk-limit engine with a quoting model attached. The non-negotiable layers:
- Hard inventory cap that stops adding to one side and forces skew toward flat.
- Max daily loss / auto-flatten kill switch in code, not willpower.
- Volatility-gated spreads that widen or pull quotes when
sigmaspikes. - Order-manager correctness: handle rejects, partial fills, and stuck quotes,
or a feed hiccup leaves you quoting into a moving market.
- Honest accounting: spread captured minus fees, funding, and
adverse-selection drift — the transaction cost analysis and transaction costs lens. Prove it in paper trading first; the operational bugs (double fills, runaway inventory) surface there cheaply.
Skipping the risk-limit layer is how an automated maker converts a slow positive edge into a fast blowup during a single adverse move.
Where the edge is thin
Be honest about the opportunity surface. On liquid, tick-constrained markets the spread is one tick and goes to whoever controls queue priority via co-location — not a retail edge. The accessible edge is in less-contested books: wider-spread altcoins, small-cap names, less liquid perps, where the spread is genuinely compensation for inventory and adverse-selection risk you are equipped to manage. Even there the margin is thin after fees and the occasional inventory gap, and it requires continuous automation. Market making rewards infrastructure and risk discipline far more than signal cleverness.
Conclusion
Market making earns the spread for standing in the middle of the book, but the realized edge is the spread net of adverse selection, inventory mark-to-market, and fees. The professional toolkit — micro-price fair value, inventory-skewed reservation pricing à la Avellaneda–Stoikov, volatility-gated spreads, queue awareness, and hard automated risk limits — all exists to manage those two costs. The same logic scales down to grid bots in less contested markets, where wider spreads pay for the inventory risk that keeps faster capital away.
Understanding the maker improves everyone's execution: your market orders pay the spread to someone, and knowing how they think sharpens your order-type choices and execution algorithms. For price-discrepancy cousins, compare classical arbitrage and triangular arbitrage; for the fast end of the spectrum, high-frequency trading.
