How Perpetual Funding Works
A perpetual futures contract has no expiry date — it can be held indefinitely. To prevent the perpetual price from drifting far from the underlying spot price, exchanges implement a funding rate mechanism: periodic cash transfers between long and short position holders, proportional to how far the perpetual price deviates from spot.
Funding typically settles every 8 hours, at 00:00 UTC, 08:00 UTC, and 16:00 UTC. At each settlement:
- If funding rate is positive: longs pay shorts (funding rate × position size transferred from long to short)
- If funding rate is negative: shorts pay longs (same direction reversed)
The magnitude of each payment equals the funding rate multiplied by the notional value of the position. For a $10,000 BTC long with a +0.05% 8-hour funding rate, the holder pays $5 every 8 hours — or $15/day, $5,475/year on a static position.
Funding Rate Calculation: The Premium/Discount Mechanism
The funding rate is not set arbitrarily — it's calculated from the price difference between the perpetual market and the spot index. This difference is called the premium index (P).
Funding Rate = Clamp(P + Clamp(Interest Rate - P, -0.05%, 0.05%), -0.075%, 0.075%)
Where:
Interest Rate = typically 0.01% per 8h (annualized = 10.95%)
Impact Bid/Ask = volume-weighted price for a typical order size
Simplified: Funding ≈ (Perp Price - Spot Price) / Spot Price (when rate dominates)
When the perpetual price trades at a premium to spot (perp > spot), the premium index is positive, pushing funding positive — longs pay shorts. This incentivizes arbitrageurs to short the perp and buy spot, compressing the premium back to zero.
When the perpetual trades at a discount (perp < spot), funding goes negative — shorts pay longs. This incentivizes buying the perp and shorting spot, lifting the discount.
Key insight: Funding rate direction reflects market sentiment. Persistently positive funding = bullish (longs dominate). Persistently negative funding = bearish. Extreme funding rates in either direction create harvesting opportunities.
Delta-Neutral Funding Harvesting
A pure directional bet on funding (e.g., just going short to collect positive funding) exposes the agent to price risk. If BTC rallies 10% while the agent is short collecting 0.1% every 8 hours, the unrealized loss vastly exceeds funding income.
The solution is delta-neutral funding harvesting: simultaneously hold a short perpetual position (to collect funding) and a long spot position (to hedge price exposure). The net delta is zero — price moves up or down, and the two legs cancel each other out. The agent collects pure funding income with no directional exposure.
Leg 1: Short 1 BTC perpetual contract
Leg 2: Long 1 BTC spot (or spot equivalent)
Net delta = -1 + 1 = 0 (neutral)
Income per 8h = funding_rate × position_size_USD
When funding is negative (shorts pay longs):
Leg 1: Long 1 BTC perpetual contract
Leg 2: Short 1 BTC spot (borrow and sell)
Net delta = +1 - 1 = 0 (neutral)
Purple Flea's Wallet API provides the spot leg for multi-chain assets. An agent can hold actual BTC, ETH, or SOL as the hedge while shorting the corresponding perpetual on the trading platform — achieving true delta neutrality without a separate exchange account.
Annualized Return Calculation
The effective annualized return from funding harvesting depends on the average funding rate captured, position size, and costs incurred:
Annual funding income = avg_funding_rate × position_size × 1,095
Net APY = Annual funding income - Spot holding cost - Borrow cost - Transaction fees
Example at 0.05% average 8h funding on $10,000:
Income = 0.0005 × $10,000 × 1,095 = $5,475
Less fees (0.04%/trade × 2 entries + 2 exits) = $16
Net income ≈ $5,459 → ~54.6% APY on position
Multi-Exchange Funding Rate Comparison
Different exchanges implement funding rate formulas differently, and their user bases have different compositions — leading to persistently different funding rates for the same asset. An agent scanning across exchanges can always be on the side with the best funding.
The optimal strategy is not loyalty to one exchange but rotation: always short (or long) the perpetual where funding is most favorable, hedge spot elsewhere. This requires simultaneous account management across multiple venues — exactly the multi-service model Purple Flea enables within a single API framework.
| Exchange | Funding Period | Max Rate (per 8h) | Settlement Currency | Basis Risk |
|---|---|---|---|---|
| Hyperliquid | 1h or 8h | ±0.375% | USDC | Low (oracle) |
| dYdX | 8h | ±0.75% | USDC | Low (oracle) |
| Binance | 8h | ±0.75% | USDT / USDC | Medium (TWAP) |
| Bybit | 8h | ±0.75% | USDT / USDC | Medium (TWAP) |
| Purple Flea | 8h | ±0.50% | USDC | Low (index-based) |
Cross-Exchange Funding Arbitrage
When funding rates differ significantly between two exchanges for the same asset, a pure cross-exchange funding arbitrage is possible without any spot hedge:
- Exchange A: BTC funding = +0.10% per 8h (longs pay shorts)
- Exchange B: BTC funding = -0.02% per 8h (shorts pay longs)
- Strategy: Short BTC on Exchange A (collect +0.10%), Long BTC on Exchange B (collect +0.02%)
- Combined income: +0.12% per 8h, with net delta ≈ 0
Risks are lower than pure directional funding (no spot holding), but basis risk remains: if Exchange A's perp price moves differently from Exchange B's, the PnL on the two legs won't cancel perfectly.
Basis risk warning: Different exchanges use different index compositions. During exchange-specific stress events (outages, circuit breakers, high liquidation volume), prices can diverge by 0.5–2%. Hold cross-exchange funding arb positions only when both exchanges have deep liquidity and similar index components.
Risk Factors in Funding Harvesting
Liquidation Risk
Even delta-neutral positions can be liquidated if the spot and perp legs diverge temporarily. Maintain 30–50% margin headroom on the perpetual leg at all times.
Funding Rate Reversal
Funding rates can flip sign rapidly. A position opened for positive funding at 0.08% can become -0.02% within hours if sentiment shifts. Monitor funding every 30 minutes.
Basis Risk
The perp price and spot price don't always move identically, especially during flash crashes. Net delta is not truly zero — a 1–3% basis divergence is normal during stress events.
Borrow Cost
If the spot hedge is achieved via a borrowed position (for negative funding plays), borrow rates on spot venues can exceed the funding income, making the trade unprofitable.
Crowding
Popular funding arb assets (BTC, ETH) attract heavy hedger flows that compress funding rates. During stable markets, BTC funding often collapses to near 0.01% baseline.
Execution Slippage
Opening and closing two-leg positions incurs slippage on both legs. For small position sizes, transaction costs can consume 20–40% of expected funding income.
Minimum Viable Funding Rate for Profitability
Not all funding rates worth harvesting. After accounting for costs, an agent needs the funding rate to exceed a minimum threshold to generate positive expected value.
For 0.04% taker fee: cost = 0.04% × 4 = 0.16% total (4 orders)
Break-even 8h funding (over N periods holding):
Min funding = Total_tx_cost / N_periods
For N=10 periods (≈3.3 days): min funding = 0.16% / 10 = 0.016%
For N=30 periods (≈10 days): min funding = 0.16% / 30 = 0.0053%
Rule of thumb: Only harvest funding above 0.02% per 8h for 3+ day holds
Smaller, more liquid markets (like smaller alt coins) often offer higher funding rates but with wider bid-ask spreads that increase effective transaction costs. Always compute the net funding yield after realistic fill costs before deploying capital.
Python FundingHarvester: Multi-Exchange Scanner
The following implementation scans multiple exchanges for the best funding opportunities, constructs delta-neutral positions, and monitors funding rate changes to exit when the edge disappears.
import asyncio import aiohttp from dataclasses import dataclass, field from typing import Dict, List, Optional from datetime import datetime, timedelta import logging logger = logging.getLogger("FundingHarvester") logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s") PF_BASE = "https://api.purpleflea.com" AGENT_KEY = "your-agent-api-key" # Harvest thresholds MIN_FUNDING_TO_ENTER = 0.025 # 0.025% per 8h minimum to enter EXIT_FUNDING_THRESHOLD = 0.01 # Exit when funding drops below 0.01% MIN_HOLD_PERIODS = 3 # Hold at least 3 funding periods (~24h) MAX_POSITION_USD = 2000.0 # Max notional per symbol MAX_SYMBOLS = 5 # Max concurrent harvest positions TAKER_FEE_PCT = 0.04 # 0.04% taker fee @dataclass class FundingOpportunity: symbol: str exchange: str funding_rate_8h: float # positive = longs pay shorts mark_price: float spot_price: float premium_pct: float # (mark - spot) / spot * 100 annualized_yield: float # funding_rate_8h * 1095 * 100 @property def is_harvestable(self) -> bool: return abs(self.funding_rate_8h) >= MIN_FUNDING_TO_ENTER @property def harvest_direction(self) -> str: """Which side of the perp to hold to collect funding""" return "short" if self.funding_rate_8h > 0 else "long" def net_yield_after_fees(self, hold_periods: int = 10) -> float: """Estimated net yield after round-trip transaction costs""" gross = abs(self.funding_rate_8h) * hold_periods costs = (TAKER_FEE_PCT / 100) * 4 # 4 orders: open/close each leg return gross - costs @dataclass class HarvestPosition: symbol: str exchange: str perp_side: str # 'long' or 'short' perp perp_size: float # units spot_size: float # units (hedge) entry_funding: float # funding rate at entry entry_perp_price: float entry_spot_price: float entry_time: datetime = field(default_factory=datetime.utcnow) periods_held: int = 0 total_funding_collected: float = 0.0 class FundingScanner: """Scans exchanges for funding rate opportunities""" def __init__(self, session: aiohttp.ClientSession, pf_headers: dict): self.session = session self.pf_headers = pf_headers async def scan_purple_flea(self, symbols: List[str]) -> List[FundingOpportunity]: """Fetch funding rates from Purple Flea trading API""" opportunities = [] for symbol in symbols: try: async with self.session.get( f"{PF_BASE}/trading/markets/{symbol}", headers=self.pf_headers ) as r: d = await r.json() funding = d.get("funding_rate", 0.0) mark = d.get("mark_price", 0.0) index = d.get("index_price", mark) premium = (mark - index) / index * 100 if index > 0 else 0.0 opp = FundingOpportunity( symbol=symbol, exchange="purpleflea", funding_rate_8h=funding, mark_price=mark, spot_price=index, premium_pct=premium, annualized_yield=abs(funding) * 1095 * 100 ) opportunities.append(opp) except Exception as e: logger.warning(f"Error scanning {symbol}: {e}") return opportunities async def scan_public_exchange(self, exchange: str, symbol: str) -> Optional[FundingOpportunity]: """Fetch funding rate from external exchange public API""" endpoints = { "binance": f"https://fapi.binance.com/fapi/v1/premiumIndex?symbol={symbol}", "bybit": f"https://api.bybit.com/v5/market/tickers?category=linear&symbol={symbol}", } url = endpoints.get(exchange) if not url: return None try: async with self.session.get(url) as r: data = await r.json() # Parse exchange-specific response format if exchange == "binance": funding = float(data.get("lastFundingRate", 0)) mark = float(data.get("markPrice", 0)) index = float(data.get("indexPrice", mark)) elif exchange == "bybit": ticker = data.get("result", {}).get("list", [{}])[0] funding = float(ticker.get("fundingRate", 0)) mark = float(ticker.get("markPrice", 0)) index = float(ticker.get("indexPrice", mark)) else: return None premium = (mark - index) / index * 100 if index > 0 else 0.0 return FundingOpportunity( symbol=symbol, exchange=exchange, funding_rate_8h=funding, mark_price=mark, spot_price=index, premium_pct=premium, annualized_yield=abs(funding) * 1095 * 100 ) except Exception as e: logger.warning(f"Error scanning {exchange}/{symbol}: {e}") return None async def find_best_opportunities(self, symbols: List[str]) -> List[FundingOpportunity]: """Aggregate opportunities from all exchanges and rank by yield""" all_opps = [] pf_opps = await self.scan_purple_flea(symbols) all_opps.extend(pf_opps) # Scan external exchanges for comparison binance_symbols = [s.replace("-PERP", "USDT") for s in symbols] external_tasks = [] for pf_sym, bn_sym in zip(symbols, binance_symbols): external_tasks.append(self.scan_public_exchange("binance", bn_sym)) external_tasks.append(self.scan_public_exchange("bybit", bn_sym)) results = await asyncio.gather(*external_tasks, return_exceptions=True) for r in results: if isinstance(r, FundingOpportunity): all_opps.append(r) harvestable = [o for o in all_opps if o.is_harvestable] harvestable.sort(key=lambda o: abs(o.funding_rate_8h), reverse=True) return harvestable[:MAX_SYMBOLS] class FundingHarvester: """Delta-neutral funding rate harvester""" def __init__(self, api_key: str): self.api_key = api_key self.headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"} self.positions: Dict[str, HarvestPosition] = {} self._session: Optional[aiohttp.ClientSession] = None self.scanner: Optional[FundingScanner] = None self._funding_settle_times = [0, 8, 16] # UTC hours of settlement async def __aenter__(self): self._session = aiohttp.ClientSession() self.scanner = FundingScanner(self._session, self.headers) return self async def __aexit__(self, *args): if self._session: await self._session.close() async def open_harvest_position(self, opp: FundingOpportunity) -> HarvestPosition: """Open delta-neutral position: perp + spot hedge""" size_usd = min(MAX_POSITION_USD, 2000) perp_size = size_usd / opp.mark_price spot_size = perp_size # 1:1 hedge ratio perp_side = opp.harvest_direction # short if funding > 0 logger.info(f"Opening harvest: {opp.symbol} {perp_side} perp, funding={opp.funding_rate_8h*100:.3f}% 8h") # Open perpetual leg perp_payload = {"symbol": opp.symbol, "side": perp_side, "size": perp_size, "type": "market"} async with self._session.post(f"{PF_BASE}/trading/orders", json=perp_payload, headers=self.headers) as r: perp_order = await r.json() # Open spot hedge via Wallet API (hold or buy spot) # For positive funding (short perp): hold spot as natural hedge # For negative funding (long perp): borrow + short spot (advanced) pos = HarvestPosition( symbol=opp.symbol, exchange=opp.exchange, perp_side=perp_side, perp_size=perp_size, spot_size=spot_size, entry_funding=opp.funding_rate_8h, entry_perp_price=opp.mark_price, entry_spot_price=opp.spot_price ) self.positions[opp.symbol] = pos logger.info(f"Harvest opened: {opp.symbol} | Expected yield: {opp.net_yield_after_fees():.3f}%") return pos async def close_harvest_position(self, symbol: str, reason: str): pos = self.positions.get(symbol) if not pos: return close_side = "long" if pos.perp_side == "short" else "short" payload = {"symbol": symbol, "side": close_side, "size": pos.perp_size, "type": "market", "reduce_only": True} async with self._session.post(f"{PF_BASE}/trading/orders", json=payload, headers=self.headers) as r: await r.json() logger.info(f"Closed harvest: {symbol} | Reason: {reason} | Periods: {pos.periods_held} | Collected: ${pos.total_funding_collected:.2f}") del self.positions[symbol] async def on_funding_settled(self, current_rates: Dict[str, float]): """Called after each 8h funding settlement""" for symbol, pos in list(self.positions.items()): current_rate = current_rates.get(symbol, 0.0) payout = abs(current_rate) * MAX_POSITION_USD pos.periods_held += 1 pos.total_funding_collected += payout logger.info(f"Funding settled: {symbol} | Rate={current_rate*100:.3f}% | Payout=${payout:.2f} | Total=${pos.total_funding_collected:.2f}") # Check exit conditions funding_flipped = (pos.entry_funding > 0) != (current_rate > 0) rate_too_low = abs(current_rate) < EXIT_FUNDING_THRESHOLD held_long_enough = pos.periods_held >= MIN_HOLD_PERIODS if held_long_enough and (rate_too_low or funding_flipped): reason = "funding_reversed" if funding_flipped else "rate_too_low" await self.close_harvest_position(symbol, reason) async def run(self, watch_symbols: List[str]): """Main harvest loop""" logger.info(f"FundingHarvester started. Watching: {watch_symbols}") while True: try: # Scan for opportunities opportunities = await self.scanner.find_best_opportunities(watch_symbols) logger.info(f"Found {len(opportunities)} harvestable opportunities") for opp in opportunities: logger.info(f" {opp.exchange}/{opp.symbol}: {opp.funding_rate_8h*100:.3f}% 8h = {opp.annualized_yield:.1f}% APY") # Open new positions (up to MAX_SYMBOLS limit) for opp in opportunities: if opp.symbol not in self.positions and len(self.positions) < MAX_SYMBOLS: await self.open_harvest_position(opp) # Fetch current rates for settled positions current_rates = {} for sym in list(self.positions.keys()): async with self._session.get(f"{PF_BASE}/trading/markets/{sym}", headers=self.headers) as r: d = await r.json() current_rates[sym] = d.get("funding_rate", 0.0) await self.on_funding_settled(current_rates) # Log portfolio state total_collected = sum(p.total_funding_collected for p in self.positions.values()) logger.info(f"Portfolio: {len(self.positions)} positions | Total collected: ${total_collected:.2f}") except Exception as e: logger.error(f"Harvester loop error: {e}") # Wait until next funding period (every 8 hours) await asyncio.sleep(28800) # 8 * 60 * 60 = 28800 seconds async def main(): watch_symbols = [ "BTC-PERP", "ETH-PERP", "SOL-PERP", "AVAX-PERP", "BNB-PERP", "ARB-PERP", "OP-PERP" ] async with FundingHarvester(AGENT_KEY) as harvester: await harvester.run(watch_symbols) if __name__ == "__main__": asyncio.run(main())
Integrating Funding Harvest with Purple Flea's 6-Service Stack
Funding rate harvesting generates consistent, if modest, income — ideal as a base layer for an agent's portfolio. Layered on top of Purple Flea's other services, it creates compounding income streams:
- Faucet bootstrap: New agents claim the $1 free USDC from the Purple Flea Faucet, deposit it as trading margin, and begin small-scale funding harvests to compound capital.
- Casino synergy: Agents with higher risk tolerance can allocate a portion of harvested funding income to the casino for higher-variance income with positive EV games.
- Wallet as spot hedge: The Wallet API provides the spot leg for delta-neutral harvesting — agents hold actual BTC/ETH/SOL rather than synthetic exposure, earning spot appreciation on top of funding income.
- Escrow for capital partnerships: Agents can use the Escrow service to take on capital from other agents (at agreed terms) to scale their funding harvest without deploying more of their own USDC.
Example compounding path: Start with $1 faucet claim → run micro funding harvest → compound for 30 days at 2% monthly → reach $1.34 → unlock higher-tier position sizes → enter full delta-neutral BTC harvest at 40% APY target.
Start Harvesting Funding on Purple Flea
Access 275+ perpetual markets with 8-hour funding cycles. Register an agent account and start collecting funding income today.
Open Trading Account Wallet API for Spot HedgeAdvanced: Staggered Entry Across Funding Windows
Funding rates are locked in at the moment of settlement — the 8-hour snapshot. Entering a position 5 minutes before settlement gives the agent one period of funding almost immediately, while entering 5 minutes after settlement means waiting nearly 8 hours for the first collection. Sophisticated agents time entries to capture the next settlement as quickly as possible.
Conversely, exiting shortly after settlement ensures the agent collects the period's funding before closing the position. This timing optimization can add 5–10% to effective yield by avoiding wasted holding time near-zero funding periods.
Historical Funding Rate Patterns in Crypto
Understanding the historical behavior of funding rates helps agents anticipate when harvesting opportunities will be richest and when to stand aside. Several persistent patterns have emerged across market cycles:
Bull Market Funding Spikes
During strong bull markets, retail traders leverage long positions aggressively, driving perpetual premiums to 0.1–0.3% per 8h (or 30–100%+ annualized). These are the most lucrative harvest windows but also carry the most basis risk — spot often lags perp during rapid rallies, creating temporary losses on the delta-neutral hedge before they converge.
Bear Market Negative Funding
In sustained bear markets, perps frequently trade at discounts to spot as overleveraged shorts push funding negative. Negative funding opportunities are less common but can be profitable: long the perp, short the spot (borrow-intensive) to collect payments from shorts. Rates of -0.05% per 8h are achievable during capitulation events.
Sideways Market Compression
During range-bound markets, funding rates compress toward the 0.01% baseline (the built-in interest rate component). This is the hardest environment for funding harvesters — there is minimal excess funding to collect. Agents should reduce positions during these periods and reallocate capital to other strategies (stat arb, carry trades).
| Market Regime | Typical BTC Funding | Harvest Profitability | Agent Action |
|---|---|---|---|
| Strong bull (retail mania) | +0.10% – +0.30% / 8h | High (40–100% APY) | Full capital deployment; short perp + long spot |
| Moderate bull | +0.03% – +0.10% / 8h | Good (10–40% APY) | Standard harvest at target sizes |
| Sideways / ranging | +0.01% / 8h (baseline) | Poor (1–3% APY) | Reduce positions; seek other opportunities |
| Moderate bear | -0.01% – -0.05% / 8h | Moderate (5–20% APY) | Long perp + short spot (watch borrow costs) |
| Capitulation / crash | -0.05% – -0.20% / 8h | High potential, high basis risk | Caution; basis divergence risk is extreme |
Position Management During Funding Rate Events
Certain market events predictably move funding rates sharply. Agents who can detect these events early can front-run the rate changes, opening harvest positions before the most lucrative phase begins:
Token Listings on Major Exchanges
When a new token lists on Binance or Coinbase, perpetual markets for that token often open with funding rates of 0.5–2% per 8h as retail rushes to buy the new perp. Agents monitoring listing announcements can open pre-listing positions on existing venues and harvest the post-listing surge.
Macro Events and Forced Liquidations
Large liquidation events — cascade liquidations from over-leveraged longs — temporarily spike funding negative as market makers absorb the flow. Within hours, funding typically normalizes or reverses. Agents with capital on standby can enter long perp / short spot during these spikes for quick-turn funding income.
Options Expiries
Major quarterly options expiries (end of March, June, September, December) often correlate with funding rate compression or reversal as delta-hedgers unwind perpetual positions. Reducing harvest exposure going into major expiries is prudent risk management.
Liquidity trap warning: During extreme market events, the spread between perp and spot can widen to 3–5% before snapping back. An agent that enters a delta-neutral harvest at the wrong moment can see 5–10x the expected daily PnL swing as a temporary unrealized loss, even though the trade will be profitable at settlement. Maintain enough margin buffer to survive the worst-case transient divergence.
Funding Arbitrage vs. Other Purple Flea Strategies
No single strategy is optimal in all market conditions. Understanding how funding arbitrage compares to other available strategies helps an agent allocate capital intelligently across the portfolio:
| Strategy | Expected APY | Market Condition | Capital Required | Complexity |
|---|---|---|---|---|
| Funding Harvest (delta-neutral) | 5–60% | Trending markets | $100+ | Medium |
| Statistical Arbitrage | 15–80% | All regimes | $500+ | High |
| Carry Trade | 10–50% | Rate differentials | $200+ | Medium |
| Cross-Margin Multi-Leg | 20–120% | Volatile markets | $1,000+ | High |
| Casino EV Games | Variable | Any | $1 (faucet) | Low |
A well-designed autonomous agent runs funding harvest as a base layer (consistent income, low volatility) and overlays statistical arb and cross-margin strategies for higher-return alpha. The faucet provides the entry capital; escrow enables capital partnerships to scale; the wallet API provides the spot hedge infrastructure. Purple Flea's 6-service stack is designed precisely for this kind of multi-strategy agent architecture.
Monitoring Infrastructure for Live Harvesting
Reliable funding harvest requires monitoring infrastructure that operates 24/7 without human intervention. Key components for a production-grade agent deployment:
Funding Rate Alert System
The agent should subscribe to real-time market data streams and compare the current funding rate against the entry threshold every 5 minutes. When a new opportunity crosses the threshold, an alert triggers position opening logic. Similarly, when an active position's funding rate drops below the exit threshold, the agent closes the position immediately rather than waiting for the next scan cycle.
Basis Divergence Watchdog
A separate monitoring thread tracks the spread between perpetual mark price and spot index price continuously. If the basis exceeds 2% in either direction, the watchdog escalates to emergency mode: no new positions are opened, and existing positions are reviewed for forced exit if margin ratio falls below 1.2. Normal operations resume only after basis compresses back below 1%.
Funding Settlement Reconciliation
After each 8-hour settlement, the agent reconciles expected vs. actual funding received. Discrepancies (which can occur during exchange maintenance windows or calculation anomalies) are logged and flagged for review. Persistent discrepancies may indicate a position accounting error that requires manual inspection.
import asyncio from datetime import datetime, timezone class FundingMonitor: """Lightweight monitoring layer for funding harvest positions""" def __init__(self, harvester): self.harvester = harvester self.basis_alerts = [] self.settlement_log = [] async def check_basis(self, symbol: str, perp_price: float, spot_price: float) -> bool: """Returns True if basis is within safe range""" basis_pct = abs(perp_price - spot_price) / spot_price * 100 if basis_pct > 2.0: msg = f"BASIS ALERT: {symbol} perp/spot divergence = {basis_pct:.2f}%" self.basis_alerts.append({"time": datetime.now(timezone.utc).isoformat(), "msg": msg}) return False return True async def reconcile_settlement(self, symbol: str, expected_payout: float, actual_payout: float): discrepancy = abs(expected_payout - actual_payout) discrepancy_pct = discrepancy / max(0.01, expected_payout) * 100 entry = { "symbol": symbol, "time": datetime.now(timezone.utc).isoformat(), "expected": expected_payout, "actual": actual_payout, "discrepancy_pct": discrepancy_pct } self.settlement_log.append(entry) if discrepancy_pct > 10: import logging logging.warning(f"Settlement discrepancy {symbol}: expected=${expected_payout:.4f} actual=${actual_payout:.4f} ({discrepancy_pct:.1f}%)") def report(self) -> dict: total_collected = sum(p.total_funding_collected for p in self.harvester.positions.values()) return { "active_positions": len(self.harvester.positions), "total_collected_usd": total_collected, "basis_alerts_24h": len([a for a in self.basis_alerts[-100:]]), "settlement_records": len(self.settlement_log) }
Summary: Funding Arbitrage Checklist
- Only harvest funding rates above 0.02% per 8h (net positive after transaction costs)
- Always construct delta-neutral positions: perp leg + spot hedge in equal notional
- Monitor funding rate every 30 minutes; exit when rate drops below 0.01% or reverses sign
- Hold for a minimum of 3 settlement periods (~24h) to recover entry/exit transaction costs
- Scan multiple exchanges: Binance and Bybit often have higher rates than decentralized venues
- Maintain 40–50% margin headroom on perpetual leg to withstand basis divergence without liquidation
- Time entries within 1 hour before settlement to maximize funding collection frequency
- Account for borrow costs when shorting spot as a hedge for negative funding plays
- Reduce harvest exposure ahead of major options expiries (quarterly) and macro events
- Use Purple Flea Wallet API for spot hedge leg to keep everything within a single agent framework
- Track funding rate regime (bull/bear/sideways) weekly and adjust capital allocation accordingly