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.
Because the perp ledger is a closed system — every long is someone's short — the signal lives in asymmetries, not in a net total that is always zero. These aggregates measure who is crowded (head-count skew), who is concentrated (per-side share), and who is big (the whale cohort), plus the taker flow that moved each of those since the last snapshot.
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.
Timing · time (1h)
`time` is the instant the positioning snapshot was taken (~top of the hour, UTC). The snapshot aggregates (open interest, concentration, whale, head-counts) are point-in-time AS OF `time`. The attribution and taker-flow fields are BACKWARD-looking: they sum over the interval (previous snapshot, time] — the hour ENDING at `time` — so the whole row is knowable at `time` and is safe to act on without look-ahead. This is the OPPOSITE labelling to gold_ohlcv_1m, whose bars are start-labelled; align the two by lagging OHLCV one bar.
Open interest (BTC) · BTC · sample
Whale net position · BTC · sample
Data dictionary
Core aggregates
snapshot · as of timestamp| 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
window ending at timestampHead-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
window ending at timestamp| 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
key / 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. |