Back to Blog

Funding Rates as a Positioning Signal

Funding Rates as a Positioning Signal

0xArchive Research · Funding Rate Alpha, Part 1 of 3

This is Part 1 of a three-part series on a funding signal computed from public Hyperliquid data. We start with the funding rate and define a funding-adjusted return: realized price return minus cumulative funding paid. We then test whether the signal contains information about forward returns.

  • Funding on Hyperliquid is an anchoring mechanism, premium plus interest, that may contain positioning information. We treat that as a research hypothesis, not a pricing identity.
  • The rate-normalized funding-adjusted return is a proxy for long-side mark-price return net of funding, not exact position-level PnL.
  • The notional-weighted version uses oracle_price for funding flow and mark_price for PnL, matching Hyperliquid's settlement formula.
  • Lag-1 autocorrelation of the funding-adjusted return is 0.71 to 0.99, but much of it reflects rolling-window overlap. First-difference autocorrelation is substantially lower.
  • Pooled across the universe, the signal shows a weak mean-reversion relationship with forward returns. Part 2 shows why that average is incomplete.

Funding as an anchoring mechanism

A perpetual has no expiry. Funding acts as a continuous anchoring mechanism between the perpetual and its reference market. On Hyperliquid, the funding rate is:

Funding Rate (F) = Average Premium Index (P) + clamp(interest_rate - P, -0.0005, 0.0005)

The premium reflects the mark-oracle basis, meaning the mark price's premium or discount to the oracle. The interest component is fixed at 0.01% per 8 hours, and the venue settles funding once per hour.

The funding payment is:

payment = position_size × oracle_price × funding_rate

Research hypothesis: funding may contain positioning information. When longs pay shorts persistently, it can indicate directional skew or crowding in positioning. We test whether the funding-adjusted return predicts forward returns. We do not claim funding is a pricing identity for expected next-period returns.

Funding settlement on Hyperliquid

parameter value
Funding interval 8-hour
Payout cadence hourly
Funding notional position_size × oracle_price × funding_rate
Direction (premium) longs pay shorts when the perp trades rich
Direction (discount) shorts pay longs when the perp trades cheap
0xArchive 15m buckets average hourly rate observed in each bucket, not a separate settlement

0xArchive API: /v1/hyperliquid/funding/{symbol}, with start and end in Unix ms and interval ∈ {5m, 15m, 30m, 1h, 4h, 1d}.

The funding-adjusted return (rate-normalized)

Over a lookback window of W hours:

realized_return(t, W)          = mark_price(t) / mark_price(t - W) - 1
cumulative_funding_paid(t, W)  = sum of hourly funding settlements over [t-W, t]
funding_adjusted_return(t, W)  = realized_return(t, W) - cumulative_funding_paid(t, W)

This is a rate-normalized proxy for the mark-price return of a long net of funding over [t-W, t]. It is not an exact account-level PnL identity: simple returns, changing notional, settlement timing, and compounding still matter.

Z-score against a 30-day rolling window:

funding_adjusted_return_z(t, W) = (funding_adjusted_return(t, W) - 30d rolling mean) / 30d rolling std

BTC mark price, hourly settlement events, and standardized carry-adjusted return over the final 72 hours of the sample

Why the unit matters

The funding-adjusted return above is rate-normalized. It treats 1 bps of carry-adjusted return as equivalent regardless of the underlying notional base. But funding accrues on notional. A 10 bps rate on $100M is not the same event as 10 bps on $10B.

0xArchive API: /v1/hyperliquid/openinterest/{symbol} returns open_interest, mark_price, oracle_price, plus market-state fields.

fact detail
What OI is sum of outstanding matched open positions
What OI changes identify nothing directional by themselves; every matched position has a long and a short

The notional-weighted funding-adjusted signal

The reformulation changes the unit, not the logic. The notional-weighted funding flow uses oracle_price, matching Hyperliquid's settlement, while the unrealized PnL proxy uses mark_price, the return basis used in the backtest:

oracle_notional_oi(t)            = open_interest(t) × oracle_price(t)
mark_notional_oi(t)              = open_interest(t) × mark_price(t)
settlement_rate(t)               = mean of the four completed 15m buckets, booked once hourly
funding_flow(t)                  = settlement_rate(t) × oracle_notional_oi(t)
cum_funding_flow(W)              = sum of hourly funding events over W
unrealized_pnl_long(W)           = mark_notional_oi(t-W) × realized_return(W)
funding_adjusted_pnl_proxy(W)    = unrealized_pnl_long - cum_funding_flow
funding_adjusted_pnl_z(W)        = (funding_adjusted_pnl_proxy - 30d rolling mean) / 30d rolling std

Funding pressure map across price, funding flow, and standardized carry-adjusted return

Data

BTC, ETH, and SOL on Hyperliquid for the persistence question; expanded to ten symbols (BTC/ETH/SOL/AVAX/LINK/DOGE/ARB/OP/NEAR/APT) for the notional-weighted analysis.

  • Fixed sample from May 2023 through 2026-07-10T23:59:59.999Z.
  • Funding and open interest come from 0xArchive. Mark price and oracle price both come from the OI endpoint.
  • Lookbacks W ∈ {6, 12, 24, 48, 72, 168} hours; forward horizons H ∈ {1, 4, 24, 72} hours.

Autocorrelation: what it does and doesn't tell us

The funding-adjusted return has high lag-1 autocorrelation, but much of this reflects rolling-window overlap. A 24-hour rolling statistic at time t and time t+1h share 23 of 24 input hours. The autocorrelation inflates with window length:

symbol W=6h W=24h W=72h W=168h diff(W=24h)
BTC 0.71 0.92 0.97 0.99 -0.19
ETH 0.79 0.94 0.98 0.99 -0.09
SOL 0.82 0.95 0.98 0.99 +0.003

The diff column shows autocorrelation of first differences, which removes most of the rolling-window overlap. Values near zero or modestly negative indicate that the incremental change is much less persistent than the rolling level. High raw autocorrelation is evidence of a slow-moving construction, but does not by itself establish independent predictive information.

Carry-adjusted return persistence versus first-difference persistence

What the pooled relationship hides

Pooled across the ten-symbol universe, corr(funding_adjusted_pnl_z, fwd_return) is commonly negative, roughly -0.02 to -0.12 across the relevant cells. The signal behaves as a weak mean-reversion signal.

A naive reader would conclude: long Q1, short Q5, exit on mean reversion to zero. That conclusion is incomplete in a way the rest of this series turns on.

Next: the pooled mean-reversion relationship is a composition effect from mixing market states. Conditioning on the signs of open-interest change and price change reveals state-dependent relationships.

Reproduce this analysis

The corrected execution uses a fixed publication cutoff and reconstructs one funding event per completed hour:

def hourly_settlement_rates(rate):
    numeric = rate.sort_index()
    hourly = numeric.resample("1h", label="left", closed="left")
    mean_rate = hourly.mean().where(hourly.count() == 4)
    mean_rate.index = mean_rate.index + pd.Timedelta(hours=1)
    return mean_rate.reindex(numeric.index).fillna(0.0)

funding_settlement_rate = hourly_settlement_rates(df["funding_rate"])
funding_flow = funding_settlement_rate * df["open_interest"] * df["oracle_price"]

The publication sample is frozen at 2026-07-10T23:59:59.999Z.

Funding Rate Alpha · Part 1 of 3

Next in the series: Regime Mixing in Perpetual Futures Signals.