Performance & capacity

Performance attribution

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

Where did the P&L actually come from: spread, signal, rebate, or luck? Attribution splits a market maker’s return into its sources so you fix the right thing.

The idea

Performance attribution annotated diagramfigure
Where did the P&L actually come from: spread, signal, rebate, or luck? Attribution splits a market maker’s return into its sources so you fix the right thing.

Reference figure. This concept is explained in prose and diagram; the interactive widgets live on the flagship pages it links to under Where this fits.

What is performance attribution and why does it matter?

Performance attribution is the breakdown of total P&L into the distinct sources that produced it. It matters because a single P&L number is undiagnosable: you cannot improve a book you cannot decompose. Attribution turns "we made £40k" into "we earned £90k of spread, leaked £35k to adverse selection and £15k to our own impact", a list of fixes.

A single P&L figure is like a medical bill total with no line items: it tells you the outcome but nothing you can act on. Attribution is the itemised statement. The same net P&L can come from healthy spread capture with light leakage, or from huge spread capture almost entirely eaten by adverse selection, and those two books need opposite interventions.

The discipline is the bridge from measuring a strategy (the rest of these guides) to improving it (the business of running a desk). Grading tells you whether to keep trading; attribution tells you what to change. A firm that grades but does not attribute is flying with an altimeter and no map. Attribution is also how a book's components are kept honest: a profitable book can be hiding a loss-making venue, symbol or hour that is masked by the winners, and only decomposition surfaces it, usually the single highest-return analysis a desk does.

What are the sources of a market-making book's P&L?

A passive, liquidity-providing book's P&L splits into: spread capture (the revenue, half-spreads earned on fills), adverse selection (the dominant cost, losses from being filled by informed flow just before the price moves against you), the market impact of your own trades, signal alpha (P&L attributable to a predictive signal), and fees net of rebates.

The decomposition is additive: gross spread captured, minus adverse selection, minus your own impact, plus signal alpha, plus fees net of rebates, equals net P&L. Each term is separately measurable, which is what makes it a diagnostic.
Πnet=ScaprevenueAadvcostIowncost+αsigsignal+(RF)rebates-fees\Pi_{\text{net}} = \underbrace{S_{\text{cap}}}_{\text{revenue}} - \underbrace{A_{\text{adv}}}_{\text{cost}} - \underbrace{I_{\text{own}}}_{\text{cost}} + \underbrace{\alpha_{\text{sig}}}_{\text{signal}} + \underbrace{(R - F)}_{\text{rebates-fees}}

Spread capture is the gross revenue: when your passive order fills, you earn the difference between your fill price and the mid at that time, roughly half the spread per fill. You got paid for providing liquidity, and you quantify it as fills(fillmat fill)×signed size\sum_{\text{fills}} (\text{fill} - m_{\text{at fill}}) \times \text{signed size}. Adverse selection is the painful counterpart: your passive order fills precisely because someone better-informed is hitting it, and the price then moves against your new position. The standard estimator is the mark-out: compare the mid at your fill to the mid a short horizon later (1s, 10s, 100ms; pick horizons and report all of them). For a market maker, spread capture minus adverse selection is the real revenue; the spread is gross, adverse selection is the cost of goods. It has its own deep treatment in spread vs adverse selection and adverse selection.

Market impact of your own trades is distinct: when you cross the spread or post aggressively, your own order moves the price, and that displacement is a cost you imposed on yourself, attributed by comparing your aggressive fills' VWAP to the pre-trade mid (see market impact). Signal alpha is the P&L a predictive signal (microprice tilt, order-flow imbalance, a short-horizon forecast) added over a signal-off baseline (the counterfactual P&L of the same fills without the signal-driven skew) isolating "did the model help?" from "did we just earn the spread anyway?". Fees and rebates are the explicit costs from transparent costs: on a rebate-capture book this line is revenue; on an aggressive book it is pure cost. Always net them and attribute per venue, because the schedule is venue-specific.

How do you separate adverse selection from your own market impact?

Both show up as the price moving against you after a fill, but the cause differs. Adverse selection is the price moving against your passive fills because the counterparty was informed; own-impact is the price moving against your aggressive orders because you consumed liquidity. Separate them by conditioning on whether you were the maker or the taker on each fill.

Tag every fill by liquidity flag: were you the passive resting side (maker) or the aggressive crossing side (taker)? On maker fills, the post-fill mark-out measures adverse selection: someone chose to trade against your resting order, and the subsequent drift is the information they carried. On taker fills, the gap between your execution VWAP and the pre-trade mid, plus the post-trade mark-out, measures your own impact (temporary plus permanent; see market impact).

The mark-out: the signed mid move from fill to a horizon hh later. On maker fills it measures adverse selection; on taker fills, your own impact. Report a range of horizons, because the split depends on the horizon chosen.
markout(h)=ε(m(tfill+h)m(tfill)),h{100ms,1s,10s}\text{markout}(h) = \varepsilon \cdot \big(m(t_{\text{fill}} + h) - m(t_{\text{fill}})\big), \qquad h \in \{100\text{ms}, 1\text{s}, 10\text{s}\}

The distinction is load-bearing because the fixes are opposite. High adverse selection on maker fills says your quotes are too passive, too slow or mispriced relative to a better fair value; the cure is a better fair-value estimate (microprice), faster cancels, or wider skew. High own-impact on taker fills says you are trading too aggressively or too large; the cure is execution scheduling (Almgren–Chriss) or smaller clips. Conflating them sends you to the wrong fix. The honest caveat: at HFT horizons the two bleed into each other (your aggressive order can trigger informed responses) and the mark-out horizon is a modelling choice, so treat the decomposition as a well-founded estimate, not an identity.

How do you slice attribution by symbol, venue, hour and signal?

Decompose the same P&L along every operational axis. Per symbol finds the names that lose money; per venue finds the exchanges where fees or fills are toxic; per hour finds the times of day the edge inverts (the open and close behave nothing like midday); per signal finds which predictors actually pay. Each slice localises a fixable leak.

Per symbol. The aggregate book can be profitable while a handful of names bleed. Rank symbols by net P&L and by P&L-per-unit-risk; the losers are candidates to drop, re-parameterise or quote wider, usually the fastest win available. Per venue. Fills, fees and adverse selection differ sharply across exchanges and crypto venues. A venue with attractive rebates but high adverse selection (toxic flow) can be a net loser despite the rebate; only per-venue attribution shows it, linking to market fragmentation and maker-taker.

Per hour. Intraday seasonality is real and large: the open and close carry different volatility, spread and toxicity from the midday lull. A strategy can earn its whole edge in the first and last 30 minutes and lose money midday; the per-hour heatmap reveals it, and the fix is to trade only when the edge exists. Per signal. If the book runs several modules, attribute P&L to each by turning one off in replay and measuring the delta. Signals decay independently (alpha decay), so per-signal attribution is the early-warning system for a predictor that has stopped paying. The compounding insight: real attribution is multi-dimensional (the leak is often a specific symbol, on a specific venue, in a specific hour) which a one-dimensional summary hides.

Why is attribution how you actually improve a book?

Because improvement is targeted, and targeting needs a diagnosis. Attribution converts a P&L number into a ranked list of leaks (this venue is toxic, that symbol bleeds, the close is unprofitable, this signal has died) each mapped to a concrete intervention. Without it you are tuning parameters blind; with it, every change is aimed at a measured loss.

The improvement loop, made explicit: attribute, identify the largest negative line (say adverse selection on maker fills for symbol X), form a hypothesis about its cause, make one targeted change (skew wider, switch fair-value model, drop the venue, gate by hour), then re-attribute to confirm the line shrank without breaking another. This is the actual day-job of a quant trader running a live book, and it is what separates a deployed strategy from a one-off backtest.

Attribution also disciplines research: a new signal is only worth deploying if attribution shows it adds P&L over the existing book (the signal-off counterfactual), not merely that the book with it on is profitable. This feeds the research-to-production pipeline and stops the desk from accumulating signals that look additive but only re-earn the spread. The 2026 framing: as alpha commoditises, the durable edge migrates from the signal to the attribution-and-fix discipline around it. Two desks with the same commoditised signal diverge on who decomposes leakage finely enough to plug it. Attribution is one of the few parts of the stack that compounds rather than decays.

Worked example

A synthetic crypto market-making book on one venue over one day, as of 2026; all figures illustrative, in basis points of notional traded. The book posted passively and earned roughly half-spreads on its maker fills.

The attribution waterfall: gross spread captured, minus adverse selection, minus own impact, plus signal alpha, minus net fees, lands on net P&L. The book is profitable, but the line sizes tell you where to work.
Πnet=9.05.51.2+1.80.4=+3.7 bps\Pi_{\text{net}} = 9.0 - 5.5 - 1.2 + 1.8 - 0.4 = +3.7\ \text{bps}

Read the lines. Gross spread captured is +9.0 bps. Adverse selection (maker mark-outs) is −5.5 bps, more than half the gross spread given back, because a large share of fills came from informed flow that moved the price against the new inventory within seconds. This is the dominant cost and the first thing to attack. Own market impact (taker fills) is −1.2 bps, from crossing the spread to manage inventory. Signal alpha (microprice skew versus a signal-off baseline) is +1.8 bps: skewing quotes toward microprice-implied fair value rather than the mid added measurable P&L, evidence the signal earns its place. Fees and rebates net to −0.4 bps.

The waterfall immediately tells you where the money is and where it leaks: adverse selection (−5.5) is by far the largest line, so the highest-value work is a better fair-value estimate and faster cancels, not chasing more spread. Now slice it. The per-hour heatmap shows the +3.7 bps net hides a +6.0 bps morning, a −1.5 bps midday (adverse selection spikes, spread thin), and a +4.0 bps close. The fix is obvious and otherwise invisible: gate the book off during the toxic midday window and daily net rises toward +5 bps without a single new signal. Per-symbol attribution then reveals one altcoin pair accounts for most of the midday loss: drop or widen it. The total said "fine, keep going"; the attribution said "your gross is healthy, adverse selection is your real cost, and a specific hour on a specific pair is dragging the whole book, fix that first". Only the decomposition is actionable. All figures synthetic.

Where this fits