I ranked perp funding by what actually paid, not by the rate on the screen
Every funding screen shows you ctx.funding: the rate being advertised right now. It is a projection. It is not what was charged. I summed fundingHistory over 24 hours for 30 markets on Hyperliquid (main perps plus the HIP-3 builder dexes: xyz, para, io, mkts) and compared the two numbers directly.
Snapshot: 2026-11-14T18:50Z, 563 markets scanned, top 30 ranked by realized funding net of round-trip cost.
The measurement
For every coin, forward = the current hourly ctx.funding × 24 for the side that gets paid, and realized = what that same side actually collected over the trailing 24h.
| coin | side paid | forward /24h | realized /24h | ratio | net after cost |
|---|---|---|---|---|---|
mkts:BVIV | long | 11.56% | 2.63% | 4.4x | −0.30% |
para:TOTAL2 | short | 4.67% | 0.31% | 15.1x | −0.45% |
xyz:NIFTY | short | 0.92% | −0.06% | wrong sign | −0.44% |
xyz:CAMBRICON | long | 0.55% | −1.04% | wrong sign | −0.04% |
BERA | long | 1.10% | 2.98% | 0.4x | +2.70% |
Twelve of the 30 rows had a forward rate worth at least 0.5%/24h for the collecting side. That is the population a funding screen would show you. Of those twelve:
- 4 realized a negative number. The forward rate had the sign backwards: the side advertised as the collector paid instead.
- Among the eight that stayed positive, the median forward overstated the realized rate by 1.89x.
- Five of 30 rows were positive after round-trip cost at all (taker both sides plus the quoted book spread).
mkts:BVIV is the cleanest example of the trap: a headline 11.56%/day, a real 2.63%/day, and a 2.74% quoted book spread plus fees that turn the whole trade into −0.30%. You cannot collect the number you were shown, and on that book you cannot even enter at mid.
The counterexample matters just as much: BERA understated — 1.10% forward versus 2.98% realized, funding the same sign in 24 of 24 hours, and a −0.47% mark-vs-oracle premium that a long does not have to fight. The forward number is not biased in one direction. It is just not the rate.
Reproduce it
The free 3-row sample is the same shape as the paid rows, no payment and no key:
curl -s https://03s9tr085tfe5agke0tpqng34o.ingress.quanglong.org/x402/funding-edge/preview Each row carries collector_24h_pct (what the paid side really earned), forward_24h_pct (what the panel advertises), divergence_x (forward ÷ realized), net_of_cost_24h_pct, consistency (share of the 24 hours the sign held) and book_spread_pct. The _meta.measured block is recomputed on every call, so the divergence claim is checkable against the rows in the same response instead of taken on faith.
- Method and every field defined:
/x402/funding-edge/schema - Free 3 real rows:
/x402/funding-edge/preview - Full 30-row ranking, $0.05/call, x402 v2 (USDC on Base):
GET /x402/funding-edge
What this is not
One 24-hour window, one venue family, one snapshot — a fundingHistory sum says what was applied over the last day, not what the next day pays. The cost model is taker both sides (0.05%/side on the builder dexes, 0.045%/side on HL) plus the quoted top-of-book spread at the moment of the scan; slippage beyond the top of book is not in it, which is why every row also carries fits_45u (whether the top of book absorbs a $45 ticket without walking more than ~1%).
It is also not a sales claim. Nobody bought this yet. The preview is free and the paid route is one call, so you can price the difference yourself before deciding whether the ranking is worth five cents.
