← Blog

2026-05-25

Funding Rates, Rollover Fees, and the Implicit Carry of Traditional Futures

Hyperliquid, Ostium, and CME futures all solve the same problem — compensating holders for the cost of carry. Where that cost lives, how it's calculated, and whether settlement is ever forced determines most of what's different about trading on each venue.

A leveraged long position has a cost of carry — the difference between holding the synthetic and holding the underlying outright. That cost has to go somewhere. In traditional futures it’s embedded in the price. In perpetuals it’s a cash payment. The question is who sets the rate, how often it settles, and whether the position is ever forced to close.

Hyperliquid, Ostium, and CME futures represent three distinct answers to that question. Understanding the differences changes how you think about holding cost, duration risk, and position sizing on each venue.

The implicit carry in traditional futures

A CME front-month futures contract trades at a premium to spot. That premium is the market’s all-in price for leveraged long exposure over the contract’s duration. It contains two components:

  1. Pure financing cost — approximately r × (DTE / 365) at the risk-free rate
  2. Demand premium — the excess that leveraged buyers will pay above financing cost when there’s strong appetite for exposure

You pay this carry through basis decay, not a cash debit. There’s no line item in your P&L that says “carry cost.” If you buy the front-month at a 30 bp premium and close it when the premium has decayed to 10 bps, you’ve paid 20 bps — it simply appears as the difference between your entry price and exit price relative to spot movement. It’s invisible on a daily P&L unless you’re explicitly tracking it.

The carry is fully determinable at entry. Given the current basis and DTE, you can calculate the total carry cost to expiry with reasonable precision. And crucially, that calculation has a hard endpoint: the contract expires on a fixed date, cash-settles to the reference rate, and the position closes whether you wanted it to or not. The forced settlement is what makes the carry calculable — uncertainty is bounded by a known horizon.

Hyperliquid — carry as an explicit spot rate

Perpetuals have no expiry. The funding rate substitutes for basis decay, but with a fundamentally different mechanism.

On Hyperliquid, funding settles every hour. The rate at each interval is determined by how far the perpetual’s mark price has deviated from its spot index. When the perp trades above spot, longs pay shorts — the payment is a direct debit to margin at the settlement timestamp, credited to the other side. When the perp trades at or below spot, longs pay nothing, and may receive payment if the perp is at a discount.

Three things differ from the CME model:

The rate is not fixed at entry. Each hourly interval is a new rate negotiated by the market’s current supply and demand for leveraged exposure. You’re buying a position at an unknown carry rate for an unknown duration.

The target is always zero basis. The CME fair value premium changes with DTE — with 15 days left, fair value is half what it was at 30 days. On Hyperliquid the “correct” price is always spot. The funding mechanism doesn’t decay toward a known endpoint; it oscillates around equilibrium.

There is no forced endpoint. You hold until you choose to close, or until liquidation. The position never demands a decision from you. If funding is expensive, that’s a cost — but it doesn’t force a roll.

The carry is visible and auditable: your trade history shows each hourly settlement. But the total cost over a holding period is unknown at entry. A position entered when funding is running at 0.01%/hr may encounter 0.05%/hr for two weeks before reverting — paying carry at five times the rate you observed when you entered, with no forced resolution.

Ostium — a two-tier system bridging both worlds

Ostium runs two distinct carry mechanisms depending on the asset class. The split is deliberate and reflects the different economics of crypto leverage demand versus real-world asset carry.

For crypto assets (BTC, ETH, SOL): Hourly funding based on open-interest imbalance. When longs and shorts are balanced, funding is near zero. As the imbalance grows, the rate accelerates non-linearly — the mechanism is designed so that large imbalances become expensive quickly, incentivizing arbitrageurs to take the minority side before the rate spikes further. Conceptually similar to Hyperliquid: purely demand-driven, targets equilibrium, zero-sum between traders, no forced settlement.

For real-world assets (commodities, forex, equity indices): A rollover fee explicitly calibrated to the real-world carry cost of the underlying. This is the structurally interesting part.

  • Forex pairs (EUR/USD, GBP/USD): Based on interest rate differentials, using SOFR as the USD rate proxy. The rate is approximately what a bank would charge to fund an equivalent leveraged FX position — typically in the 3–5% annualized range for major pairs.
  • Commodities (crude oil, gold): Derived from the underlying futures curve, specifically the contango or backwardation between consecutive contracts. For a commodity in steep contango, you pay the annualized roll yield as a continuous cash flow. Gold, which often carries significant storage-related carry, has run in the 13–30% annualized range on this basis.
  • Equity indices: SOFR-based cost of carry reflecting borrowing cost and dividend adjustments.

The payment is explicit and cash-settled like a perp funding rate — you see it in your account at each accrual. But the rate is anchored to the same inputs that determine CME basis: interest rate curves and the slope of the underlying futures market. A long crude oil position on Ostium pays approximately what it would cost to roll an equivalent CME crude futures position, made visible as a continuous accrual rather than a silent basis decay.

What forced settlement actually changes

The absence of a settlement date is not merely mechanical — it shifts a specific type of risk.

In a CME trade, if you buy the front-month at 30 bps above spot and hold to expiry, the carry cost is determined: you’ve paid 30 bps, regardless of how the basis moved in between. The contract forces the accounting to close at zero. You knew the outcome at entry within reasonable modeling precision.

In a perpetual position on either venue, there is no such forcing event. Carry uncertainty is open-ended. If funding conditions change after you enter — a broad shift in sentiment, a coordinated short squeeze, a risk-off event that inverts the usual long-heavy skew — your realized carry may differ substantially from what you observed at entry. The position never creates a decision point.

The flip side is roll friction. On CME, holding through an expiry requires a transaction: close the front month, open the next. The roll has a cost — fees plus the calendar spread bid-ask — and it happens on the exchange’s schedule. You may be rolling at an unfavorable moment in the calendar spread, into a widened contango you didn’t choose. Perpetuals let you hold through that moment without action. The carry cost may change, but there’s no forced transaction.

Neither structure is strictly preferable. Bounded carry uncertainty is valuable when you need to model return precisely at entry — a fund with investors and a quarterly reporting cycle may strongly prefer CME’s deterministic carry. Open-ended duration is valuable when your exit timing is uncertain or when you want to avoid roll friction at a fixed calendar date.

Reading the three together

CME FuturesHL / Ostium CryptoOstium RWA
Carry mechanismImplicit in basisExplicit hourly fundingExplicit rollover fee
Rate determined byFinancing cost + demand premiumMarket demand for leverageReal-world rates (SOFR, futures curve)
Rate known at entry?Yes (calculable from basis + DTE)No (changes each interval)Stable, anchored to external rates
Forced settlementYes — monthly expiryNoNo
Roll requiredYes — monthlyNoNo
Carry visible in P&LNo — embedded in priceYes — line item per intervalYes — continuous accrual

The three are not competing approaches so much as solutions optimized for different constraints. CME exists to serve regulated, institutional carry needs where precision and counterparty certainty outweigh flexibility. Hyperliquid funding serves speculative crypto leverage demand where the rate itself is the market clearing mechanism. Ostium’s RWA rollover is the closest thing to a bridge — the carry is made explicit and continuous like a perp, but calibrated to the same real-world inputs that determine the CME basis, making it interpretable to traders who understand either system.

For a trader moving between venues, the most important translation is not the fee level — it’s whether the carry is deterministic at entry or variable throughout the hold. That distinction shapes position sizing, duration planning, and how you think about the risk of holding a position overnight.

Pulling the data with the mackinac Python library

The carry comparisons above don’t have to be theoretical. The mackinac API exposes historical funding rate records for every supported venue, including HL perpetuals and Ostium RWA instruments, going back to inception. The snippet below fetches funding history for hl:ETH and ostium:XAU/USD, computes the annualized average for each, and puts all three venues — including a SOFR-based CME estimate — in the same table. Free access covers the last 12 hours; pass an API key for 30 days of history.

import sys
from datetime import datetime, timedelta, timezone
import pandas as pd
from mackinac import Mackinac
API_KEY = sys.argv[1] if len(sys.argv) > 1 else None
HOURS = 30 * 24 if API_KEY else 12
NOTIONAL = 100_000
SOFR = 0.053
end, start = datetime.now(timezone.utc), datetime.now(timezone.utc) - timedelta(hours=HOURS)
def avg_ann(rates):
return sum(r.ratePct for r in rates) / len(rates) if rates else 0.0
client = Mackinac.from_api_key(API_KEY) if API_KEY else Mackinac()
with client as m:
hl_rates = list(m.history_funding("hl", "ETH", start=start, end=end))
xau_rates = list(m.history_funding("ostium", "XAU/USD", start=start, end=end))
rows = [
("CME ETH (est.)", SOFR * 100, NOTIONAL * SOFR * (HOURS / 8_760), "yes — locked in"),
("HL ETH (perp)", avg_ann(hl_rates), NOTIONAL * avg_ann(hl_rates) / 100 * (HOURS / 8_760), "no — floats"),
("Ostium XAU/USD", avg_ann(xau_rates), NOTIONAL * avg_ann(xau_rates) / 100 * (HOURS / 8_760), "partial — rate-anchored"),
]
df = pd.DataFrame(rows, columns=["venue", "ann_rate_pct", "cost_usd", "known_at_entry"])
df["ann_rate_pct"] = df["ann_rate_pct"].map("{:.2f}%".format)
df["cost_usd"] = df["cost_usd"].map("${:,.2f}".format)
print(df.to_string(index=False))

Output over a 12-hour window:

Carry cost — $100,000 long position, 12h window
venue ann_rate_pct cost_usd known_at_entry
--------------- ------------ ---------- ---------------------
CME ETH (est.) 5.30% $ 7.26 yes — locked in
HL ETH (perp) 0.53% $ 0.73 no — floats
Ostium XAU/USD 5.68% $ 7.78 partial — rate-anchored
954 HL samples 13 XAU/USD samples over 12h
-> pass an API key as the first argument for 30 days of history

The HL rate reflects genuine market conditions at the time — demand for leveraged ETH longs was light, so funding ran well below SOFR. The Ostium gold rate landed close to SOFR, consistent with how gold carry is typically calibrated (storage cost plus financing). Swap in a 30-day window with an API key and you get the full distribution of realized rates for each venue, which is the right input for modeling carry risk rather than quoting a snapshot.