"The funding rate is positive, so the trade is profitable" is the single most common shortcut people take when evaluating funding rate arbitrage — and it's wrong often enough to matter. A positive rate only tells you which direction the payment flows. It says nothing about whether that payment is larger than what it costs to enter and exit the position.
The four-legged round trip
A full delta-neutral cycle is four separate orders: buy spot, open futures short, close spot, close futures. Each one incurs a trading fee. Using Bybit's representative taker fee of 0.055% per order:
open futures short . 0.055%
close spot .......... 0.055%
close futures ....... 0.055%
total round trip .... 0.22% of position size
On a $500 position, that's $1.10 in fees just to open and close — before a single funding payment is counted. Every funding payment collected while the position is open needs to add up to more than that before the trade is worth having made.
Two rates, worked through
Take a funding rate of +0.05% per 8-hour cycle, held for 3 cycles (24 hours):
3 × 0.05% = 0.15% collected — less than the 0.22% round-trip cost. Net: a loss, even though every single funding payment was positive.
Now take +0.10% per cycle, same 3 cycles:
3 × 0.10% = 0.30% collected — above the 0.22% cost. Net: roughly +0.08% after fees.
FundingArb doesn't rely on a manual eyeball check of "does this clear fees" — it requires projected funding income to exceed round-trip fees by a configurable multiple, the FEE_COVERAGE_FACTOR (default 1.5×). At the also-default 3-day expected holding period (9 funding cycles), that works out to an effective minimum entry threshold on Bybit of approximately +0.037% per cycle — below that, the bot doesn't enter, regardless of how the annualized number looks. Both values are tunable in the .env file; see the setup guide for the full config reference.
Why a coverage factor, not just "fees covered"
Breaking exactly even on fees isn't a useful bar — a rate can look like it clears fees on paper and still net out negative once execution slippage, a slightly-early exit, or a partial fill are accounted for. That's why the entry filter requires projected funding to exceed round-trip fees by a configurable multiple, not just match them. It's a deliberate margin of safety, and it's tunable — set it too low and marginal trades get through; set it too high and the bot sits out markets that would have been fine.
Why annualized numbers are the wrong thing to anchor on
A funding rate observed at one moment, projected forward for a year, produces numbers that are easy to misread. A rate spike right after entry, before it normalizes to its typical level, can produce an annualized figure many times higher than what actually accrues over the life of the position. The question that matters isn't "what does this rate annualize to" — it's "does the funding actually collected exceed the fees actually paid, over the time the position is actually held." Those are frequently very different numbers.
The failure mode this doesn't prevent
The fee-coverage filter only runs at entry. It doesn't guarantee an outcome for the life of the position — a rate that clears the filter at entry can still decay toward the exit threshold over time, and in an extended low-rate environment, ongoing costs can exceed income even without any single rate turning negative. See the Risk Scenarios on the main FAQ for how that specific case is handled.