How the 51-sector heatmap is computed, what the colors mean, and the three readings that trip people up.
On the same day, some sectors are all green and others all red. But is the sector moving, or is one leader carrying it? The heatmap compares 51 sectors across seven timeframes, and both its colors and its numbers come with conditions — read how they are built before you read the colors.
Sector rotation is Blave's sector-performance heatmap: every USDT-margined Binance perpetual gets a sector label, each sector's move is computed over seven timeframes, and the result is drawn as shaded cells. Rows are sectors; columns are 1h, 8h, 24h, 3d, 7d, 30d and 90d.
The computation has three steps:
| Step | What it does |
|---|---|
| 1. Label | Each coin gets a sector from a hand-maintained table. Measured 2026-09-15: of 718 USDT perpetuals, 707 matched a label and 11 did not. |
| 2. Coin move | Take 5-minute closes over the last 100 days, compute each bar's return, then sum the returns inside the timeframe. |
| 3. Sector value | Average the members' moves, weighted by each coin's open-interest notional value in USDT. Not equal-weight, not market-cap weight. |
Two things to know up front. Sectors are not mutually exclusive: a coin can sit in several, for example ETH in both ETH and Layer 1, SOL in both Layer 1 and SOL Eco. And the table is not only crypto — Binance's tokenized US and Hong Kong equities, ETFs and commodities (gold, silver, crude) are in there too, and they track those perpetual contracts, not the underlying market's session or close.
The table is maintained by hand and has been updated roughly every one to three months over the past year, so the members in an old screenshot are not necessarily the members today.
These three are where the heatmap gets misread most often — run through them before you look at the colors.
Sector values are weighted by OI notional, and OI is heavily concentrated. Measured 2026-09-15 16:15 UTC:
| Sector | Largest member's share of the sector's OI |
|---|---|
| Layer 1 | ETH 78.6% (SOL 10.9%) |
| SOL Eco | SOL 73.5% |
| Yield | BTW 78.5% |
| Meme | DOGE 30.2% |
| AI | WLD 17.0% (TAO 15.8%) |
Almost four-fifths of the Layer 1 cell is ETH. To tell a broad move from a leader-only move, open the sector's token page: most members green is a different market from the top name green and the rest red.
You will often hear the heatmap described as money rotating between sectors. It cannot answer that — the calculation contains no volume and no flows, only price returns and the open-interest value used as the weight. Rising prices usually come with buying, but they are not the same thing, and nothing here separates new money from short covering.
There are 13 color steps, and the thresholds are not fixed percentages. An assumed annual volatility is scaled down to each timeframe, and the steps sit at 0.5, 1, 1.5, 2, 2.5 and 3 times that number, with everything past 3 capped at the darkest shade. So every column has its own thresholds:
| Timeframe | Faintest shade starts near | Darkest (capped) near |
|---|---|---|
| 1h | ±0.4% | ±2.4% |
| 24h | ±2.0% | ±11.8% |
| 7d | ±5.2% | ±31.2% |
| 30d | ±10.8% | ±64.5% |
| 90d | ±18.6% | ±111.7% |
Thresholds for the sector overview, derived from the page's constants rather than measured. The token page assumes a larger volatility, so its thresholds are about 1.33× the table above and the same move is shaded differently on the two pages.
Reading across a row compares how far a sector has travelled relative to its own normal in windows of different length — not how big the moves are.
A sector's move is built from summed 5-minute returns, not from "price now ÷ price N days ago − 1". For majors over short and medium windows the two are nearly identical; over long windows they drift; for high-volatility small caps over long windows they break.
Measured 2026-09-15 16:15 UTC, majors sit one to two percentage points apart:
| Cell | Shown | True return | Gap (true − shown) |
|---|---|---|---|
| BTC 90d | +16.40% | +15.88% | −0.52pp |
| BTC 30d | +19.44% | +20.64% | +1.20pp |
At the same moment one small cap's 90d cell computed to −390%, which no real return can be: that is what summing does in a long, volatile window.
Two practical consequences. The heatmap itself hides it, because the shading caps at three volatility units. And the distortion is carried into the sector average whenever a distorted member holds a meaningful weight.
One more effect pushes the same way: the weight is the current OI value, and OI value moves with price. A coin that just ran up gets a larger weight at the same time — weighting by the outcome, and the longer the timeframe the more it shows.
So treat the long columns as an ordering of what is moving, not as return figures.
None of the three sketches below is backed by an official strategy or a backtest. They are starting points to validate yourself. Data comes from GET /sector_rotation/get_overview_data (API plan required), which returns each sector's move across the seven timeframes plus its member list.
The heatmap says the sector is up; the token page says how many members are. Requiring both "sector positive" and "more than half the members positive" filters out the leader-only case.
import requests
r = requests.get("https://api.blave.org/sector_rotation/get_overview_data", headers=hdrs)
sectors = r.json()["data"]
s = sectors["Layer 1"]
tf = "24h"
# is the sector up over 24h
sector_up = s["data"][tf]["pct_change"] > 0
# what share of members are up (breadth)
ups = [t for t in s["symbols"].values() if t["data"][tf]["pct_change"] > 0]
breadth = len(ups) / len(s["symbols"])
print(sector_up, round(breadth, 2)) # green with breadth 0.3 = the leader alone
A sector red over 30 days and green over 24 hours is one shape of a laggard starting to move; deep green over 30 days and red over 24 hours is a leader cooling off. This is a reading, not a rule — and remember the distortion above: use the 30d and 90d numbers for ordering only.
short_tf, long_tf = "24h", "30d"
rows = []
for name, s in sectors.items():
short = s["data"][short_tf]["pct_change"]
long_ = s["data"][long_tf]["pct_change"]
if short > 0 and long_ < 0: # long-term laggard turning up
rows.append((name, short, long_))
rows.sort(key=lambda x: -x[1])
print(rows[:5])
If you already run a strategy on one coin, you can add "the coin's sector is positive over a short timeframe" as a condition and only accept entries when the sector agrees. It changes no entry or exit logic, it only removes trades — whether that pays has to come out of your own backtest, not from the assumption that a filter helps. Market Sentiment is another filter of the same kind: it reads one coin's premium to the index rather than the relative strength of a group.
def sector_ok(sectors, token, tf="8h"):
# a coin can belong to several sectors; any one positive passes
for s in sectors.values():
if token in s["symbols"] and s["data"][tf]["pct_change"] > 0:
return True
return False
| Timeframe | Good for | Watch out |
|---|---|---|
| 1h, 8h | Intraday rotation, reaction after an event | The snapshot refreshes hourly, so the 1h column can lag by up to an hour — it is not a live quote |
| 24h, 3d | Swing-level ordering of strength | The most usable range; distortion is still small here |
| 7d, 30d | Medium-term trend, where a sector stands | Summing distortion appears; use for ordering |
| 90d | Long-run themes | Largest distortion, and the weights are today's OI; do not read as returns |
The examples here use 24h and 8h because those columns track real returns most closely and match the horizons most people actually hold.
The history page — a year of cumulative sector returns as lines — runs on a different calculation: daily returns compounded, today's OI weights applied across the whole year, only coins that still exist (delisted coins are absent for the entire line), and days before listing counted as 0%. New sectors therefore start as flat lines; the tokenized-equity sectors, for instance, have little data before early 2026. Read it as relative movement between sectors, not as a performance record you could have captured.
These are ideas for combinations, not verified conclusions:
| Pair with | Why |
|---|---|
| Sector Rotation + Whale Hunter | Sectors show which group is moving; use Whale Hunter to see whether a single coin's open interest and volume are unusually large. |
| Sector Rotation + Market Sentiment | Sectors are the relative strength of a group of coins; Market Sentiment is one coin's premium to the index — different questions. |
| Sector Rotation + Liquidation | When a sector turns red quickly, check the liquidation indicator to see whether forced selling was part of it. |