Skip to content

Execution

Last price vs midpoint: bid-ask bounce in crypto data

A fixed 99.90/100.10 quote produces alternating trade returns and 0.4899% window volatility. The midpoint stays at 100.00 throughout the worked tape.

A lime sphere arcs between two ivory curved forms above a still central cube against a black background.
Illustration for execution; examples in this article are educational.

The last traded price is the price of the most recent completed transaction in one market. The midpoint is the average of its current best bid and best ask. They answer different questions: trades can alternate between the two quotes while the midpoint stays fixed, producing bid-ask bounce in short-horizon returns. Neither price alone establishes what a new order will fill at.

Before interpreting a small chart move, identify which record changed. A transaction at a different side of the spread, a moving quote and an old trade carried forward can produce very different readings of the same market.

Read the trade and the quote separately

For one venue and instrument, let b be the best bid and a the best ask. The midpoint is M = (b + a) / 2. It uses displayed prices, without weighting their quantities. Last price comes from a completed trade, with its own time and quantity. Neither is a global token price covering every venue.

Coinbase Exchange's ticker documentation illustrates the distinction: its message contains price, best_bid and best_ask as separate fields. The ticker updates when matches happen and can batch cascading matches. A message that includes quotes therefore does not necessarily capture every quote change between trades. These details belong to that particular feed. See Coinbase's Exchange WebSocket channel specification.

Binance Spot documents a separate bookTicker stream for updates to best bid or ask price or quantity. Its raw trade stream has trade price, quantity, trade time and trade ID. Choose the stream that supplies the required observation, then preserve its identifiers and timing conventions. See Binance's Spot market-stream documentation.

The microprice versus midprice guide covers a different comparison: adding displayed quantities to a quote reference. Here, hold the ordinary midpoint fixed and examine what changing transaction sides does to the last-price series.

Build a trade tape with no midpoint movement

Consider a hypothetical ABC/USDT spot market. Throughout six seconds, the best bid stays at 99.90 USDT per ABC and the best ask at 100.10. The midpoint is always 100.00 and the spread is 0.20 USDT, or 20 basis points of the midpoint.

Assume each transaction is small enough that neither best price is exhausted. There are no intervening quote-price changes. Trades occur exactly one second apart for this illustration; actual trading need not follow a regular clock. The table is constructed data, not an observed exchange sample.

Time, UTCTransaction locationLast price, USDT/ABCMidpoint, USDT/ABCLast-price simple return
12:00:00At bid99.90100.00Starting observation
12:00:01At ask100.10100.00+0.2002%
12:00:02At bid99.90100.00−0.1998%
12:00:03At ask100.10100.00+0.2002%
12:00:04At bid99.90100.00−0.1998%
12:00:05At ask100.10100.00+0.2002%
12:00:06At bid99.90100.00−0.1998%

A buyer accepting the ask prints 100.10; a seller accepting the bid prints 99.90. The resulting last-price line repeatedly rises and falls even though neither displayed best price moves.

The first simple return is (100.10 / 99.90) − 1, approximately +0.2002%. The next is (99.90 / 100.10) − 1, approximately −0.1998%. Their magnitudes differ because they use different starting prices. Chaining each pair of price ratios returns to one. The first and last trades are both 99.90, giving a zero endpoint return.

Every midpoint return is zero. The difference between the two series comes entirely from which quote receives the trade in this constructed tape. It does not require a changing view of the token's value.

Recompute the apparent volatility

Use log returns to calculate realized variance for this six-second window. Define each return as the natural logarithm of the current price divided by the previous price. Every upward last-price log return is approximately 0.002000000667; every downward one is its negative.

There are six returns. Squaring removes their signs, so the realized variance is approximately 6 × 0.002000000667² = 0.000024000016. Taking its square root gives 0.004898981, or 0.4899% realized volatility over the six-second window.

That calculation uses the sum of squared returns. It is neither a per-second sample standard deviation nor an annualized figure. The midpoint version of the same calculation gives zero, and the last-price endpoint return is also zero. Positive measured variation can coexist with no net price change.

Now retain only the observations at 12:00:00, 12:00:02, 12:00:04 and 12:00:06. All four last prices are 99.90, so their sampled realized variance is zero too. This does not establish that two seconds is a suitable interval for crypto data. It shows how a sampling grid can conceal the bounce by repeatedly selecting the same side.

The broader measurement problem is documented in Aït-Sahalia, Mykland and Zhang's original microstructure-noise study. Their results distinguish ignoring noise from explicitly modeling it; using fewer observations is not a universal remedy. The realized-volatility sampling guide explains interval comparisons and estimator definitions in more detail.

A reversal is not evidence of a tradable opportunity

In the hypothetical tape, a rule that tests whether last price is above 100.05 becomes true at seconds one, three and five. The same test applied to midpoint is never true. Changing the input definition changes the rule's behavior even though its numeric threshold stays identical.

This is a data-definition test, not evidence that buying or selling those transitions earns money. The tape reports transactions by other participants. It does not establish that you could buy at the bid before the next ask-side print, obtain a passive fill, or sell at that subsequent print. A hypothetical immediate purchase would face the ask and an immediate sale the bid, subject to available size and later changes. Fees require separate treatment. The bid-ask spread worksheet develops that execution-cost boundary.

A simple way to express this example is P = M + e, where P is trade price and e is either −0.10 or +0.10. A trade-price change can therefore come from a midpoint change, a change in the side term, or both. In this example the midpoint contribution is zero throughout.

Richard Roll's original spread paper explains how transactions at bid and ask can induce negative serial dependence in observed price changes under its assumptions. That result does not identify every reversal as spread noise or establish a profitable reversal rule. Our perfectly alternating tape is an arithmetic demonstration; it is not a claim that real order flow alternates predictably.

Last price can also miss a quote move

Extend the hypothetical timeline. After the final trade at 12:00:06, suppose quotes change to a 100.20 bid and 100.40 ask at 12:00:08, with no intervening transaction. The midpoint becomes 100.30, up 0.30% from 100.00. Last price remains 99.90, showing a zero change from the previous trade and now sitting below the current bid.

Those observations are compatible: the last trade is a record of the past, while quotes describe a later state. Forcing last price inside the new spread would replace a historical execution with an invented one. The useful response is to retain both timestamps and label the older trade's age.

Midpoint also has limits. It can be computed from a stale or incorrectly combined bid and ask, and it contains no information about how much can trade near that reference. Following a shock, the time taken for quotes and depth to recover is a separate question covered by crypto liquidity resilience. A flat midpoint alone cannot establish that liquidity has recovered.

Use a worksheet before selecting a price input

Start with the question the data must answer. Then require the observation and checks that make that answer defensible.

Intended questionUseful recordValidation before use
Where did a transaction occur?Individual trade price, quantity and IDPreserve trade time; handle duplicates and corrections
How did the displayed quote reference move?Midpoint from a coherent bid and askCheck both sides, age, venue and instrument
What might an immediate order encounter?Side-specific quotes and depthCheck intended size, fees and execution timing
Did a signal depend on transaction-side bounce?Matched trade and midpoint historiesCompare on the same clock with identical eligibility rules

For a reproducible comparison, save the venue, pair, market type, quote currency, field definition, exchange timestamp when supplied and local receipt time. Keep trade and quote update identifiers separately. A trade ID is not automatically a book-update sequence shared across streams.

Choose how observations reach a regular sampling grid before examining results. If using the latest observation available by each boundary, record its age and apply a declared stale-data policy. Do not attach a future quote to an earlier trade just because its timestamp is closer. A missing or invalid quote should remain visible as missing rather than silently becoming a last-price substitute.

Treat a one-sided book, nonpositive price or crossed bid and ask as a validation exception. Investigate whether an update was missed or two observations were combined incorrectly. Follow the provider's recovery procedure after a feed gap before treating the reconstructed midpoint as current. Correct averaging cannot repair an untrustworthy input state.

Run the seven-row tape through that procedure. Confirm the three upward and three downward last returns, the zero midpoint returns, the 0.4899% window volatility and the zero endpoint return. Then run the no-trade quote update and confirm that only midpoint changes. These two checks catch different mistakes: treating a transaction-side change as a quote move, and treating an unchanged last trade as an unchanged book.

Finally, compare real histories only after matching their price definitions and timestamps. This matters when estimating exposure as well as when inspecting charts: the dollar-neutral versus beta-neutral comparison depends on return measurements whose inputs should be consistent. Keep the trade record, quote reference and modeled execution price explicitly labeled so a small movement can be traced to the event that actually produced it.

Keep the context with the example.

Each worked example is illustrative, with its sources and assumptions in the article. Read our editorial standards for authorship, verification and corrections.