Research note 004: BTC funding carry survived its costs — once, on one window
Date: 2026-10-12 · Status: single 90-day window, hourly bars, stated assumptions. Companion to notes 001–003. A positive result with leashed claims: what follows is what one window says, not what a strategy earns.
Question
Can a simple delta-neutral BTC funding trade — long spot, short perp, collecting funding — survive realistic fees and basis drift? The strategy documents nominate this as research target #1 (data-cheap, maker-heavy, honest at small size). This note runs the smallest honest version: buy and hold both legs for one quarter, no timing, no leverage.
Dataset
- Binance public archive (
data.binance.vision), three slices pinned by SHA-256 inresearch/scripts/carry_004.py, which downloads, verifies, and analyzes in one command (stdlib only): futures/um/monthly/fundingRate/BTCUSDT2024-01..03 (273 payments)spot/monthly/klines/BTCUSDT/1h2024-01..03 (2,184 hourly bars)futures/um/monthly/klines/BTCUSDT/1h2024-01..03 (2,184 hourly bars, hour-aligned with spot: 0 mismatched hours checked in analysis)- Not Astra-captured data: this predates the recorder and arrives without capture provenance, so it is analyzed as-is and labeled bronze. Nothing here touches the venue WebSocket path.
Assumptions (all of them, up front)
| Assumption | Value |
|---|---|
| Legs | long $10,000 BTC spot + short $10,000 BTC perp notional |
| Capital | $20,000 unlevered (both legs fully backed) |
| Entry / exit | first / last hourly close of the window, filled in full |
| Fees | 5 bps taker per fill × 4 fills = $20.00 total |
| Borrow | none needed (long spot, short perp; no margin position) |
| Funding credit | each 8h payment × $10k notional, sign-correct for the short |
| Slippage beyond fees | 0 (hourly closes, $10k size — a stated simplification) |
| Liquidation | impossible unlevered; stated, not modeled |
Results
| Measure | Value |
|---|---|
| Window | 2024-01-01 → 2024-03-31, 273 funding payments |
| Mean funding rate | 2.04 bps per 8h payment |
| Funding received, by month | Jan $111.92 · Feb $130.80 · Mar $314.02 |
| Funding received, total | $556.74 |
| Entry / exit fees | $20.00 (3.6% of funding) |
| Basis (perp − spot), entry → exit | $28.27 → $82.99 (premium widened) |
| Basis drift PnL | −$12.88 (widening hurts long-spot/short-perp) |
| Net, 90 days on $20,000 | +$523.85 (+2.62%) |
| Daily Sharpe (analytic floats) | 20.1 — descriptive only, see limits |
Reading
Three facts, none of them a strategy. First, funding did the work and fees barely mattered at this size: $20 of costs against $557 of carry is a 28-to-1 ratio, the opposite of the short-horizon fee death in notes 001–003. Carry lives where turnover dies. Second, the basis worked against the position the whole way — the premium nearly tripled — and the trade still cleared by an order of magnitude, because funding dwarfed drift in this window. A window where the premium compresses instead would read very differently, and the analysis prices exactly that: every dollar of basis widening is −$0.24 at this size. Third, the Sharpe is real arithmetic and almost meaningless as a statistic: 90 days of smooth funding in a bull quarter produce a smooth equity curve by construction. It describes this window; it predicts nothing.
What would strengthen or overturn this: the same computation on a negative-funding regime (a quarter where shorts pay, not collect); entry timing by basis percentile instead of calendar; borrow-inclusive variants for the inverse position; execution at top-of-book rather than closes; and — the honest version of this question — the full loop: record spot and perp live, normalize, replay the fills, and compare predicted carry against collected carry.
Reproduce
python3 research/scripts/carry_004.py --data-dir /tmp/carry004
The script pins nine archive SHA-256 hashes and refuses to run on any other bytes — including the one transcription slip caught during writing, which is exactly the failure mode the pinning exists for.