TradingUpdated

Perp DEX mark price fidelity: deviation from CEX spot reference, live

Median absolute deviation in basis points between each venue's mark price and a Binance spot reference, measured every 60 seconds on ETH, BTC and SOL. Lower means the venue's mark price stays closer to the CEX spot consensus. Oracle-priced venues use a real-time price feed anchored to CEX spot; orderbook venues derive their mark from their own book.

TL;DR. As of , Hyperliquid posts the lowest mark price deviation at 0.040% (p50, 24h) across 6 ranked venues. Source: OpenChainBench, https://openchainbench.com/benchmarks/perp-mark-price-lag.

Every perpetual DEX publishes a mark price: the price used to compute unrealised P&L, trigger liquidations and calculate funding. For a trader, the mark price being far from the real market price is not a minor inconvenience, it is a liquidation risk. A venue whose mark price persistently sits 50 bps above the real price will liquidate a short at a price that never existed on any exchange. This benchmark measures how far each venue's live mark price sits from a Binance spot reference on ETH, BTC and SOL, sampled every 60 seconds. Oracle-priced venues (Gains, GMX v2) source their mark from a real-time price oracle (Pyth, Chainlink) that itself tracks CEX spot continuously; the harness reads the mark each venue actually publishes (Gains' pricing backend, GMX's oracle price API), not the oracle behind it, so their deviation is measured, not assumed. Orderbook venues (Hyperliquid, dYdX, Lighter, Paradex) derive their mark price from their own book, which can temporarily diverge from the broader market during low-liquidity windows or fast-moving events. The benchmark does not attempt to capture sub-second events such as liquidation-triggering wicks, which require websocket resolution to observe. It measures the persistent component: how far a venue's mark price sits from CEX spot on a 60-second polling cadence.

Methodology

The harness polls each venue's published mark price every 60 seconds alongside a Binance spot reference price (best bid/ask mid). Mark price deviation is defined as the absolute value of (mark - reference) / reference x 10000, in basis points. For Gains the harness reads the venue's pricing backend (the price its front end and its trades use); for GMX v2 it reads the oracle price the GMX v2 API publishes for Arbitrum (mid of the min and max prices). For Hyperliquid the harness reads markPx from the metaAndAssetCtxs endpoint. For dYdX v4 it reads indexPrice from the perpetualMarkets indexer endpoint. For Lighter and Paradex it reads the orderbook mid as an approximation of their mark price. The headline metric is the 24h p50 of the deviation series, which captures typical behaviour rather than isolated spikes. The p99 series is exposed for those interested in tail risk. The signed deviation (positive means the venue mark is above the reference) is published separately as perp_mark_deviation_signed_bps.

  • Cadence: every 60 seconds in parallel across all venues. Reference price and venue mark prices are fetched in the same cycle, so the comparison is time-aligned.
  • Reference price: Binance REST /api/v3/ticker/bookTicker for the selected asset (ETHUSDT, BTCUSDT, SOLUSDT). The harness uses the mid of best bid and best ask as the reference.
  • Gains (Gains v8, oracle-priced): GET backend-pricing.eu.gains.trade/charts, the venue's own pricing backend (the price its front end and its trades use), BTC/USD, ETH/USD and SOL/USD pairs. A snapshot older than 60 seconds is treated as a failure, never as a price. Until 2026-09-20 the harness read a Pyth Hermes proxy instead; that endpoint went behind API keys on 2026-08-27 and the row was empty for 24 days.
  • GMX v2 (oracle-priced): GET arbitrum-api.gmxinfra.io/prices/tickers, the oracle price GMX v2 publishes per token on Arbitrum; the harness uses the mid of minPrice and maxPrice, scaled from GMX's 30-decimal fixed point. Same 2026-09-20 switch from the Pyth proxy as Gains.
  • Hyperliquid: POST /info {type:metaAndAssetCtxs} returns markPx per asset. This is the venue's own mark price used for P&L and liquidations, derived from their HyperBFT oracle.
  • dYdX v4: GET /v4/perpetualMarkets from the dYdX indexer returns indexPrice per market. indexPrice is the oracle-anchored price dYdX uses for margin and liquidation calculations.
  • Lighter: orderbook mid computed from GET /api/v1/orderBookOrders best bid and ask. Lighter does not publish a separate mark price endpoint; the orderbook mid is the closest available approximation.
  • Paradex: GET /markets endpoint returns markPrice per instrument on Starknet L2.
  • Deviation formula: abs(mark - reference) / reference x 10000, in basis points. Signed version (mark - reference) / reference x 10000 also published.
  • Failure handling: a venue that errors or times out leaves the previous gauge in place and increments perp_mark_fetch_errors_total. The health gauge drops to 0, flagging the row as stale in the UI.
  • Scope: this bench measures the persistent deviation visible at 60-second polling. Sub-second wick events that resolve within a single poll interval are not captured. The methodology page names this explicitly to avoid overstating what is measured.

Results: 6 venues ranked by Mark price deviation (p50, 24h)

Perp DEX mark price fidelity: deviation from CEX spot reference, live: Mark price deviation per venue (p50, 24h).
№Venuesp50Success
1Hyperliquid0.040%98.61% (n=2880)
2Lighter0.047%99.72% (n=2880)
3dYdX v40.11%97.50% (n=2880)
4Gains0.13%100.00% (n=2880)
5GMX0.13%100.00% (n=2880)
6Paradex0.16%100.00% (n=2880)

Frequently asked

What is the mark price and why does its deviation matter?

The mark price is the price each venue uses to compute unrealised P&L, trigger liquidations and settle funding payments. A mark price that diverges significantly from the real market price creates liquidation risk: a long position can be margin-called at a loss even if the actual market price never touched the liquidation level.

Why do oracle-priced venues structurally win this bench?

Oracle-priced venues (Gains, GMX v2) derive their mark from an external price oracle such as Pyth or Chainlink. Both oracles aggregate from CEX market maker quotes that continuously track Binance spot, so their deviation stays small: today 0.13% bps for Gains and 0.13% bps for GMX v2. Orderbook venues derive their mark from their own book, which can temporarily lag or diverge from the broader market. Whether an oracle venue actually beats the best orderbook venue is what the table shows, not a given.

Where do the Gains and GMX mark prices come from?

From the venues themselves. Gains: its pricing backend (backend-pricing.eu.gains.trade), the price its front end displays and its trades execute at. GMX v2: the oracle price its API publishes for Arbitrum (mid of min and max). Before 2026-09-20 the harness read a Pyth feed as a proxy for both; Pyth's public endpoint went behind API keys on 2026-08-27 and the two rows were empty until the switch.

Does this bench capture scam wicks?

No. Scam wicks that resolve within a single 60-second poll interval are not captured. This bench measures the persistent component of mark price divergence: how far a venue typically sits from CEX spot across a full day of 60-second samples. Sub-second wick analysis requires websocket resolution on both sides simultaneously.

What does the signed deviation metric show?

The signed deviation (positive = venue mark above reference, negative = below) is published as perp_mark_deviation_signed_bps. A persistent positive bias means the venue's mark is above CEX spot, which inflates longs' unrealised P&L while squeezing shorts. A persistent negative bias does the opposite.

Why is Lighter's mark price approximated from the orderbook mid?

Lighter does not expose a dedicated mark price endpoint in its public API. The orderbook best-bid-best-ask mid is the closest available approximation and is used consistently across all cycles.

Source code github.com/ChainBench/OpenChainBench/tree/main/harnesses/perp-mark-price-lag