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:
| Exchange | Futures price | Index |
|---|---|---|
| Binance, USDT perpetual futures | mark price | index price: a weighted spot price from several exchanges. The exchange sends both prices once a second |
| Hyperliquid, main DEX | mark | oracle: a weighted median of spot prices from several CEXs, updated by validators about every 3 seconds |
| Hyperliquid, HIP-3 markets | mark | an 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:
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):
where and are the mean and standard deviation of the window, and 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:
| Markets | Warn | Fire | Lower bound of σ |
|---|---|---|---|
| Binance | basis from 150 bps, or z from 3 with basis from 50 bps | basis from 300 bps, or z from 5 with basis from 100 bps | 4 bps |
| Hyperliquid, main DEX | basis from 100 bps, or z from 3 with basis from 50 bps | basis from 200 bps, or z from 5 with basis from 100 bps | 4 bps |
| Hyperliquid, HIP-3 | basis from 150 bps, or z from 3 | basis from 500 bps, or z from 5 | 10 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
| Column | What it shows |
|---|---|
| Ex | Exchange: Binance or Hyperliquid |
| Symbol | Market. For Hyperliquid, the coin name; for HIP-3, with the DEX name |
| Basis | Average basis of the last closed minute, bps, with sign. The color is the level: orange for warn, red for fire, gray for off |
| Z | Z-score of the minute basis. Empty while the window warms up and in the off state |
| Level | The 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.
| Element | What it shows |
|---|---|
| Columns | Average basis of the bar in bps, or the z-score, depending on the Source setting |
| Column color | Level: blue for normal, orange for warn, red for fire, gray for off |
| Basis min and Basis max | The lowest and highest minute basis within the bar |
| Dashed lines | Warn and fire thresholds for this market type, above and below zero |
| Background | A 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.