ArbTide

Methodology: How ArbTide Collects and Calculates Data

Data sources, update frequency, funding rate normalization, arbitrage net spread formula, quality filters and known limitations behind every number on ArbTide.

Updated

ArbTide collects funding rates and bid/ask prices directly from exchange APIs on its own servers, normalizes them to comparable units, and calculates arbitrage spreads net of taker fees. This page documents every step, so each number can be checked and cited.

Data sources

Exchange Type Funding rates Spot prices Perpetual prices
Binance CEX ✓ ✓ ✓
Bybit CEX ✓ ✓ ✓
OKX CEX ✓ ✓ ✓
Bitget CEX ✓ ✓ ✓
Gate CEX ✓ ✓ ✓
KuCoin CEX ✓ ✓ ✓
MEXC CEX ✓ ✓ ✓
BingX CEX ✓ ✓ ✓
HTX CEX ✓ ✓ ✓
Kraken CEX ✓ ✓ ✓
Coinbase International CEX ✓ ✓ ✓
WhiteBIT CEX ✓ – ✓
BTSE CEX ✓ ✓ ✓
XT.COM CEX ✓ ✓ ✓
LBank CEX ✓ – –
WEEX CEX ✓ ✓ ✓
Toobit CEX ✓ ✓ –
Backpack CEX ✓ – –
BigONE CEX – ✓ –
Bitfinex CEX – ✓ ✓
Bitstamp CEX – ✓ –
BtcTurk CEX – ✓ –
CEX.IO CEX – ✓ –
Crypto.com CEX – ✓ ✓
Deepcoin CEX – ✓ ✓
DigiFinex CEX – ✓ ✓
HitBTC CEX – ✓ ✓
Revolut X CEX – ✓ –
Hyperliquid Perp DEX ✓ – ✓
Aster Perp DEX ✓ ✓ ✓
Lighter Perp DEX ✓ – –
Paradex Perp DEX ✓ – ✓
dYdX Perp DEX ✓ – –
Extended Perp DEX ✓ – ✓
Pacifica Perp DEX ✓ – –
WOOFi Pro Perp DEX ✓ – –

Connections use the open-source ccxt library. We request every market of an exchange in a single bulk call, which keeps data consistent and within rate limits.

Update frequency

Data Poll interval Shown as stale after
Funding rates 30 seconds 2 minutes
Bid/ask prices 10 seconds 45 seconds
Funding history Stored every 5 minutes –

Pages are server-rendered on every request from data cached for at most 5 seconds. Open pages refresh themselves in the browser every 15 to 30 seconds.

Funding rate normalization

Exchanges pay funding at different intervals: most CEX contracts every 8 hours, some every 4 or 1 hour, and perp DEXs such as Hyperliquid and dYdX every hour. Every rate is converted to the same units:

  • Hourly rate = funding rate ÷ interval in hours
  • APR = hourly rate × 8,760

When a coin trades against several quote currencies on one exchange, we use USDT first, then USDC, then USD. Only active, linear (stablecoin-margined) perpetual contracts are included.

Average funding rate

Each coin shows three cross-exchange figures:

  • Average APR is weighted by each market's 24h perpetual volume in USD. A thin market with an extreme rate moves it only as much as its volume justifies. When no volume is reported, the plain mean is used.
  • Median APR is the middle value across exchanges and ignores outliers entirely.
  • 8h-equivalent rate is the average APR converted back to an 8-hour funding rate (APR ÷ 8,760 × 8), for comparison with the rate most exchanges quote.

Tables always show each exchange's raw funding rate and its own interval next to the APR, so every figure can be checked against the exchange.

Funding arbitrage spread

For each coin, the spread is the APR of the exchange with the highest funding minus the APR of the exchange with the lowest. The strategy it describes is to go long where funding is lowest and short where it is highest. The spread is gross: trading fees, price basis between venues and changes in funding are not deducted.

Cash and carry

For each coin, we pair the cheapest spot market with every perpetual that pays positive funding and keep the pair with the best 30-day estimate:

  • Basis = (perpetual bid − spot ask) ÷ spot ask
  • Fees = two taker fees on each leg (open and close)
  • Estimated return = funding APR × holding days ÷ 365 + basis − fees
  • Break-even = (fees − basis) ÷ funding APR × 365 days

The estimate assumes funding stays at its current rate and the basis closes at exit. Routes where spot and perpetual are on different exchanges require moving coins or holding inventory on both.

Reverse cash and carry borrow cost

A reverse carry sells spot you borrowed. Only exchanges that lend spot on margin are used for that leg, and coins marked not borrowable are skipped. Every 10 minutes we read the standard (non-VIP) borrow rate from Binance, OKX and Bybit and convert it to an APR. It is subtracted from the funding APR: estimated return = (funding APR − borrow APR) × holding days ÷ 365 + basis − fees. Where the spot exchange does not publish a rate, we use the median of the published rates for that coin as an estimate, marked est.; where no exchange publishes one, the borrow cost is shown as unknown and not subtracted.

Price arbitrage net spread

For each coin and market type (spot or perpetual), we test every pair of exchanges and keep the pair with the widest spread:

Gross spread = (best bid on the sell exchange − best ask on the buy exchange) ÷ best ask

Net spread = gross spread − taker fees

  • Spot: one taker fee on each exchange (buy, then sell).
  • Perpetual: two taker fees on each exchange (open and close), because the position is closed when prices converge.

Taker fees are each exchange's default (non-VIP) rate for that market. Signed-in users can enter their own rates per exchange under Account → Trading fees, and every net spread, max profit, carry estimate and alert they see then uses those rates.

Max size and max profit come from the order books. Every 20 seconds we read 20 levels of both books for the 60 widest routes and walk them together, buying up the asks and selling into the bids, until the next level no longer pays after fees. Max size is where the profit peaks, and max profit is the profit there, minus the transfer fee for spot routes. A + means the books we read ran out before the spread closed, so more size may fit. For routes outside that set, max size falls back to the smaller of the quantities at the best ask and best bid ("· top"). Coin pages also show the net spread after fees at $1,000, $10,000 and $50,000.

Transfer cost (spot routes)

A spot route only works if the coin can leave the buy exchange and arrive on the sell exchange. Every 30 minutes we read each exchange's published networks: the withdrawal fee, and whether withdrawals and deposits are open. For each route we pick the cheapest network that is open for withdrawal on the buy exchange and for deposit on the sell exchange. Network names are matched across exchanges (for example ERC-20, ETH and Ethereum are the same chain).

  • Transfer shows that network and its fee in USD at the buy price.
  • From $X is the trade size at which the fee equals the net spread. Below it, the route loses money.
  • Withdrawals off, Deposits off or No shared network mean the route cannot be completed right now.
  • Unconfirmed means an exchange publishes the fee but not whether the network is open.
  • Unknown means an exchange does not publish this data without an account key. Binance, Bybit, OKX, MEXC and BingX are in this group unless we have a read-only key for them.

Always confirm the network and address on both exchanges before moving funds. Perpetual routes and cash-and-carry need no transfer, because both legs are settled in margin.

Quality filters

A quote is used only if all of these are true:

  1. The market is active and quoted in USDT, USDC or USD.
  2. 24h volume is at least $100,000 (arbitrage) — coin pages with less than $1M perpetual volume are not indexed by search engines.
  3. The exchange's own quote timestamp is less than 60 seconds old.
  4. The order book spread (ask − bid) is below 2%.
  5. For a price route, both quotes were taken within 15 seconds of each other.
  6. The route's gross spread is below 20%. Larger gaps almost always mean two different tokens share a ticker.

Known limitations

  • Transfer costs: withdrawal fees are published by some exchanges only, and only per withdrawal, so gas spikes between readings are not reflected. Transfer time is not modelled, so prices can move while funds are in transit.
  • Depth: books move between readings, and only 20 levels are read, so very large orders can see worse prices than shown.
  • Timing: prices come from REST polling, so two legs can be up to 15 seconds apart. Some exchanges (Bybit, Gate, BigONE, Bitfinex, CEX.IO, Hyperliquid, Aster perpetuals) do not publish quote timestamps, so delayed data from them cannot be detected.
  • Quote currencies: USDT, USDC and USD markets are compared directly, so small stablecoin price differences are part of the spread.
  • Lighter does not state its funding interval in the API; rates are treated as 8-hour equivalent.

Accuracy checks

Every 5 minutes we compare the prices shown on ArbTide with each exchange's live order book and publish the results on the data accuracy page: the median and 95th percentile gap by exchange, and how old our quotes were when checked.

Corrections

Found a number that looks wrong? Every page links to the exchange market it uses, and every page is available as plain markdown by adding .md to its URL.

Frequently asked questions

Where does ArbTide get its data?
Directly from the public APIs of 36 exchanges: Binance, Bybit, OKX, Bitget, Gate, KuCoin, MEXC, BingX, HTX, Kraken, Coinbase International, WhiteBIT, BTSE, XT.COM, LBank, WEEX, Toobit, Backpack, BigONE, Bitfinex, Bitstamp, BtcTurk, CEX.IO, Crypto.com, Deepcoin, DigiFinex, HitBTC, Revolut X, Hyperliquid, Aster, Lighter, Paradex, dYdX, Extended, Pacifica and WOOFi Pro. Data is collected on our servers, never in your browser.
How often is data updated?
Funding rates are polled every 30 seconds and bid/ask prices every 10 seconds per exchange. Pages refresh every 15 to 60 seconds.
How is APR calculated from a funding rate?
APR = (funding rate ÷ funding interval in hours) × 8,760. This makes 8-hour, 4-hour and 1-hour funding directly comparable.
How is the average funding APR calculated?
It is weighted by 24h perpetual volume on each exchange, so small markets with extreme rates do not distort it. The median APR and each exchange's raw rate and interval are shown alongside it.
Does the net spread include all costs?
It includes taker fees. For spot routes, the withdrawal fee of the cheapest open network is shown next to it and subtracted from max profit. Max size and max profit are read from both order books, so they include slippage. Funding paid while a perpetual position is open is not included.