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

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

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 horizonsH ∈ {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.

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.
