---
title: "Funding Rates as a Positioning Signal in Perpetual Futures"
description: "0xArchive Research tests funding-adjusted returns across ten Hyperliquid perpetual markets and shows how funding can act as a state-dependent positioning signal."
canonical_url: "https://0xarchive.io/blog/funding-pressure-map-perpetual-futures"
markdown_url: "https://0xarchive.io/blog/funding-pressure-map-perpetual-futures.md"
route: "/blog/funding-pressure-map-perpetual-futures"
robots: "index, follow"
generated_from: "prerendered_html"
---

# Funding Rates as a Positioning Signal in Perpetual Futures
0xArchive Research tests funding-adjusted returns across ten Hyperliquid perpetual markets and shows how funding can act as a state-dependent 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](https://api.0xarchive.io/cms-assets/2026/07/2e7a4067-c6b4-4cef-8f06-c919256e062d.webp)

## 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](https://api.0xarchive.io/cms-assets/2026/07/b13a056a-a6b2-454d-b76c-1e6378843231.webp)

## 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](https://api.0xarchive.io/cms-assets/2026/07/a527f635-73cc-4086-b678-b8413f6d7d55.webp)

## 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:

```python
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.
