Skip to main content

Perp/Index Divergence

A screener of the gap between the perpetual futures price and the index on Binance and Hyperliquid: basis in basis points, z-score against the last four hours, and an alert level.

What it is​

Every perpetual future has an index: the price of the underlying asset built from the spot markets of several exchanges. In a calm market the futures price stays close to the index. When a future moves noticeably away from the index, it is most often the future itself being pushed: moving the spot of a dozen exchanges costs more than moving the order book of one contract.

Perp/Index Divergence measures this gap for all markets at once and compares it with the usual level for each instrument.

Price sources:

ExchangeFutures priceIndex
Binance, USDT perpetual futuresmark priceindex price: a weighted spot price from several exchanges. The exchange sends both prices once a second
Hyperliquid, main DEXmarkoracle: a weighted median of spot prices from several CEXs, updated by validators about every 3 seconds
Hyperliquid, HIP-3 marketsmarkan oracle set by the DEX deployer. For stocks it stands still outside the US trading session, while the perp trades around the clock

The widget is part of the Max plan because it shows the whole market at once. The chart indicator is available from Pro because it shows a single coin. The widget opens from the "Screeners → Microstructure → Perp/Index Divergence" menu, and the [SFM] Perp index divergence indicator ([SF] PID in the chart legend) is added to a Binance or Hyperliquid futures chart.

Calculation​

Basis​

On every price update:

Basis=Mark−IndexIndex×104Basis = \frac{Mark - Index}{Index} × 10^4

The basis is measured in basis points: 100 bps = 1%. Positive means the future is above the index, negative means below. Within a minute the basis values are averaged, and the table shows the average of the last closed minute.

Z-score​

For each market the server keeps a rolling window of average minute basis values over the last 240 minutes (4 hours):

Z=Basis−μ240max⁡(σ240,σmin)Z = \frac{Basis - \mu_{240}}{\max(\sigma_{240}, \sigma_{min})}

where μ240\mu_{240} and σ240\sigma_{240} are the mean and standard deviation of the window, and σmin\sigma_{min} is a lower bound for the deviation. Without it, on a market where the basis stays within one point for weeks, any half-point move would give a huge z. The current minute enters the window only after it closes, so it is compared with a window that does not include itself.

Z is computed once the window holds at least 60 minutes. After a restart the service fills the window from the minute history of mark and index, so the warm-up is usually short.

Levels​

The level is set by the server. Warn or Fire turns on if either of two conditions holds: the absolute basis is above the absolute threshold, or the absolute z is above the z threshold with a large enough basis. The second condition exists because on a market with a deviation of 6 bps, z = 3 is a move of only about twenty points.

Thresholds as of 12 Nov 2026:

MarketsWarnFireLower bound of σ
Binancebasis from 150 bps, or z from 3 with basis from 50 bpsbasis from 300 bps, or z from 5 with basis from 100 bps4 bps
Hyperliquid, main DEXbasis from 100 bps, or z from 3 with basis from 50 bpsbasis from 200 bps, or z from 5 with basis from 100 bps4 bps
Hyperliquid, HIP-3basis from 150 bps, or z from 3basis from 500 bps, or z from 510 bps

Off (Oracle stale) happens only on HIP-3 markets: the oracle has not changed for 10 minutes or more. In this state the basis drifts on its own, because the perp trades while the oracle stands still. Z is not used, the absolute thresholds are doubled, and such minutes do not enter the window.

A level increase is published immediately, without waiting for the end of the minute. A decrease is published only when the minute closes, so that the level does not flicker.

Widget​

ColumnWhat it shows
ExExchange: Binance or Hyperliquid
SymbolMarket. For Hyperliquid, the coin name; for HIP-3, with the DEX name
BasisAverage basis of the last closed minute, bps, with sign. The color is the level: orange for warn, red for fire, gray for off
ZZ-score of the minute basis. Empty while the window warms up and in the off state
LevelThe level computed by the server: fire, warn, off, or empty for normal

By default the table is sorted by absolute basis in descending order. The table updates once a minute. A market that missed a minute keeps its last value while it is no older than five minutes.

The filters open with the funnel button in the widget header:

  • exchange toggles: Binance and Hyperliquid, both on by default;
  • Symbol: search by market name;
  • Level: Fire, Warn, Normal, Oracle stale; several can be selected;
  • |Basis| bps: absolute basis greater than the value entered;
  • |Z|: absolute z greater than the value entered.

The global filters of the control panel are computed on Binance markets. Only the manipulation filter applies to Hyperliquid, by its own values. With any other global filter on, Hyperliquid markets are hidden, since they have no such data. The blacklist applies to both exchanges.

Sound​

If sound is on in the widget header, the widget reports a market that has risen to fire: a pop-up notification, an entry in the alert history and a voice message. If there are several such markets, it reports the one with the largest basis. Markets in the off state and rises only to warn give no signal: on some markets warn stays on permanently.

Indicator​

[SFM] Perp index divergence draws columns below the chart.

ElementWhat it shows
ColumnsAverage basis of the bar in bps, or the z-score, depending on the Source setting
Column colorLevel: blue for normal, orange for warn, red for fire, gray for off
Basis min and Basis maxThe lowest and highest minute basis within the bar
Dashed linesWarn and fire thresholds for this market type, above and below zero
BackgroundA bar where the level rose: orange for a rise to warn, red for a rise to fire

The dashed thresholds are only a guide. The column color comes from the level set by the server, and the server also takes z and the off state into account.

On timeframes longer than one minute the bar is built from minutes: the basis is the average of minute averages, z is the largest by absolute value, the level is the highest within the bar. The indicator works on the 1m, 5m, 15m, 30m, 1h, 4h and 1D timeframes. There is no history on 3m.

Settings:

  • Symbol: the market to take data from. By default, the chart market.
  • Source: what to draw: Basis, bps (default) or Z-score.
  • Highlight level rise: highlight the background of bars where the level rose. On by default.

How to read it​

  • Fire on a liquid market: the future has moved noticeably away from spot. This is a reason to look at the order book, the tape and the manipulation monitor: who is pushing the contract, and how.
  • Positive: the future is above the index, futures buyers are more aggressive than spot. Negative: the opposite.
  • A permanent warn with an almost unchanged basis: the market has a permanent premium or discount to the index, not an event. Such markets have a small z: for them this is normal.
  • Off: not a signal. The HIP-3 oracle stands still, and the basis drifts with the perp.

Limitations​

  • Binance and Hyperliquid only. There is no Aster index in the platform data.
  • The thresholds were calibrated on a few days of live data in September 2026 and may change.
  • Binance mark is a median that includes the index itself. So the Binance basis shows the gap between mark and index, not the gap between the last trade price and the index.
  • There is no public backtest of the model yet. We do not claim that after fire the price returns to the index or continues the move.