Positioning & flow (hourly)
Progold_positioning_1h hourly snapshots, partitioned per (coin, month)
gold_positioning_1h is hourly Hyperliquid open-interest and positioning data, derived from the full two-sided perp ledger — total open interest, long-vs-short account skew, per-side concentration, whale-cohort net position, and the taker flow behind each change. Download the history as Parquet or query it through the Tessera API.
Hourly Hyperliquid positioning aggregates derived from the full two-sided perp ledger: open interest, head-count asymmetry, per-side concentration, whale-cohort net position, snapshot-to-snapshot attribution, and a taker-flow rollup. Because the ledger is a closed system (every long is someone's short), the signal lives in asymmetries — who is crowded, who is concentrated, who is big — not in a net total.
What you'd use it for: Tracking open-interest trends, gauging crowded or concentrated positioning, and spotting squeezes and capitulations from whale and taker-flow shifts.
Open interest (BTC) · BTC · sample
Whale net position · BTC · sample
Data dictionary
Core aggregates
| Column | Type | What it means |
|---|---|---|
time | timestamp[us] | The hour this positioning snapshot was taken (UTC). |
coin | string | Which market this row is for. |
open_interest | float64 | Total size of open positions in the market — how much risk is on the table. Rising OI means new money committing; falling OI means positions being unwound. How it's computed: Two-sided open interest = (long_oi + short_oi)/2. long_oi == short_oi by the ledger identity, so this is the single OI figure. |
n_long_positions | uint32 | How many wallets are currently holding a long. |
n_short_positions | uint32 | How many wallets are currently holding a short. |
n_unique_users | uint32 | How many distinct wallets have a position at all — the breadth of participation. |
account_ls_ratio nullable | float64 | Long accounts divided by short accounts. Above 1 means more wallets are long than short (crowd leaning long by head-count). Extreme readings often mark crowded, vulnerable positioning. How it's computed: n_long_positions / n_short_positions — the long/short *account* ratio (crowd direction by head-count). NULL when no shorts. |
top10_long_share nullable | float64 | How much of the long side is held by its ten biggest accounts — high means the longs are a few whales, not a broad crowd. |
top10_short_share nullable | float64 | The same concentration measure for the short side. |
concentration_skew nullable | float64 | Whether shorts or longs are the more concentrated side (short share minus long share). Positive means the shorts are the whale-heavy side — the ones more prone to a squeeze. How it's computed: top10_short_share - top10_long_share; >0 when shorts are more concentrated than longs. NULL when either side is empty. |
hhi_gross nullable | float64 | A standard market-concentration score over all exposure — high when a handful of accounts dominate the whole book. How it's computed: Herfindahl–Hirschman concentration index over gross exposure. |
whale_net_position | float64 | The net direction of the biggest accounts (top 10% by size). Positive means the whales are net long. This survives the zero-sum ledger because it's a sub-group, so it's a genuine 'smart money' tilt signal. How it's computed: Net signed szi of the top 10% of accounts by |szi| (the whale cohort). Signed: >0 = whales net long. Non-degenerate because it sums over a sub-population, not the whole zero-sum ledger. Divide by open_interest for an OI-relative skew. |
whale_long_account_share nullable | float64 | What fraction of the whale cohort is on the long side, by head-count. How it's computed: Fraction of the whale cohort net long, by head-count. NULL when empty. |
n_whale_accounts | uint32 | How many accounts make up the whale cohort this hour (the top 10% by position size). How it's computed: Whale cohort size = ceil(0.10 * n_unique_users), floored at 1 when non-empty. |
Attribution — what changed since the previous snapshot
Head-count deltas versus the prior hour: how many wallets opened, closed, or flipped sides. This is the raw churn behind the positioning change — useful for telling a quiet drift apart from a violent reshuffle.
| Column | Type | What it means |
|---|---|---|
d_open_interest | float64 | Change in open interest since the previous snapshot — net risk added or removed over the hour. |
n_new_longs | uint32 | Wallets that opened a fresh long this hour. |
n_new_shorts | uint32 | Wallets that opened a fresh short this hour. |
n_closed_longs | uint32 | Wallets that closed a long this hour. |
n_closed_shorts | uint32 | Wallets that closed a short this hour. |
n_flipped_l2s | uint32 | Wallets that flipped from long to short — a sentiment reversal, one wallet at a time. |
n_flipped_s2l | uint32 | Wallets that flipped from short to long. |
Taker-flow rollup — aggressive flow over the hour
| Column | Type | What it means |
|---|---|---|
aggressor_delta_1h nullable | float64 | Net aggressive buy-minus-sell pressure summed over the hour — the hourly version of CVD's slope. How it's computed: Σ aggressor_delta over the window — net taker buy−sell pressure (windowed CVD). |
net_taker_open_1h nullable | float64 | Net new aggressive directional risk: long opens minus short opens by takers. The single headline 'which way is the aggressive money leaning' number for the hour. How it's computed: Σtaker_open_long_vol − Σtaker_open_short_vol — net aggressive new directional risk. The headline signed positioning-flow figure. |
oi_opened nullable | float64 | Aggressive volume that opened positions this hour — flow-implied risk coming on. How it's computed: Σtaker_open_long_vol + Σtaker_open_short_vol — flow-implied OI added. |
oi_closed nullable | float64 | Aggressive volume that closed positions this hour — flow-implied risk coming off. How it's computed: Σtaker_close_long_vol + Σtaker_close_short_vol — flow-implied OI removed. |
flow_vs_snapshot_oi_residual nullable | float64 | The gap between the OI change we saw and the OI change taker flow can explain. What's left is mostly the maker side — passive positioning you can't see directly in the trade tape. How it's computed: d_open_interest − (oi_opened − oi_closed). Reconciles snapshot ΔOI against flow-implied ΔOI (flips folded in); residual ≈ maker-driven OI, unobservable from taker fills. |
taker_flip_l2s_1h nullable | float64 | Aggressive long-to-short flip volume — a capitulation tell (longs giving up and flipping). How it's computed: Aggressive 'Long > Short' flip volume (close-long + open-short legs) — capitulation signal. |
taker_flip_s2l_1h nullable | float64 | Aggressive short-to-long flip volume — a squeeze tell (shorts giving up and flipping). How it's computed: Aggressive 'Short > Long' flip volume (close-short + open-long legs) — short-squeeze signal. |
Provenance
| Column | Type | What it means |
|---|---|---|
bootstrap_source | string | Housekeeping flag for how the first row of the month was seeded from the prior month. Ignore unless auditing continuity. |