Borsalar Arası Fonlama Oranı Arbitrajı: Oran Farklılıklarından Nasıl Kazanılır
ETHUSDT'nin fonlama oranı Binance'te %0,01, Bybit'te ise %0,035. Aynı coin, aynı an; ancak oranlar 3,5 kat farklı. Biri daha fazla öder, biri daha az öder. Ve biri bu farktan kâr eder.
Fonlama oranı arbitrajı, kriptoda piyasa yönünden bağımsız olan ender stratejilerden biridir. Fiyatı tahmin etmezsiniz. Kârı, borsalar arasındaki oranların yapısal sapmasından elde edersiniz.
Fonlama Oranları Borsalar Arasında Neden Farklılaşır?
Fonlama oranı, sürekli vadeli işlem sözleşmesinin fiyatını spot fiyata sabitleyen bir mekanizmadır. Her borsa bunu kendi verilerine dayanarak bağımsız olarak hesaplar:
- Trader bileşimi. Binance'te çoğunlukla uzun pozisyon almaya meyilli bireysel yatırımcılar hâkimdir. Bybit ve OKX'te daha fazla profesyonel katılımcı bulunur. Farklı uzun/kısa dengesi, farklı fonlamaya yol açar.
- Hesaplama formülü. Her borsa kendi formülünü kullanır. Binance, prim endeksini ve faiz oranını hesaba katar. Bybit ve OKX de aynı şeyi yapar ancak farklı ağırlıklar ve ortalama dönemleriyle.
- Likidite. Daha az likit borsalarda prim (vadeli ile spot arasındaki fark) daha değişken olduğundan fonlama daha geniş salınımlar yapar.
- Ödeme sıklığı. Çoğu borsa fonlamayı her 8 saatte bir öder (UTC 00:00, 08:00, 16:00). Ancak bazıları (belirli pariteler için Bybit, dYdX) saatlik ödeme yapar; bu da ek fırsatlar doğurur.
Tipik Sapmalar

Sakin piyasada büyük borsalardaki fonlama oranları birbirine yakındır; fark %0,001-0,005 arasındadır. Ancak yüksek volatilite dönemlerinde sapmalar artar:
| Piyasa Fazı | Binance | Bybit | OKX | dYdX | Spread |
|---|---|---|---|---|---|
| Sakin | %0,01 | %0,012 | %0,009 | %0,01 | ~%0,003 |
| Boğa trendi | %0,03 | %0,05 | %0,025 | %0,04 | ~%0,025 |
| Aşırı boğa | %0,1 | %0,2 | %0,08 | %0,15 | ~%0,12 |
| Ayı trendi | -%0,02 | -%0,01 | -%0,025 | -%0,015 | ~%0,015 |
8 saatlik %0,025 spread, günlük %0,075 demektir. 100.000 , aylık ~2.250 $ anlamına gelir.
Temel Arbitraj Mekaniği

Fikir basittir: birinde fonlama alırken diğerinde daha az ödemek için iki borsada ters pozisyonlar açmak.
Örnek
Binance: fonlama oranı = +%0,01 (uzunlar kısalara öder) Bybit: fonlama oranı = +%0,04 (uzunlar kısalara öder)
Adımlar:
- Bybit'te kısa açın — her 8 saatte %0,04 alırsınız
- Binance'te uzun açın — her 8 saatte %0,01 ödersiniz
- Pozisyonlar aynalıdır — fiyat riski nötrdür
- Net kâr: %0,04 - %0,01 = 8 saatte %0,03
Günde (3 ödeme): %0,09. Aylık: ~%2,7. Yönsel risk olmaksızın.
def funding_arbitrage_pnl(
rate_short_exchange: float, # kısa açtığımız borsadaki oran
rate_long_exchange: float, # uzun açtığımız borsadaki oran
position_size: float, # USD cinsinden pozisyon büyüklüğü
payments_per_day: int = 3,
days: int = 30,
) -> float:
"""
Belirli bir süre için fonlama oranı arbitrajı PnL'si.
Pozitif fonlamada: kısa taraf rate_short alır, uzun taraf rate_long öder.
Negatif fonlamada: kısa taraf öder, uzun taraf alır.
"""
spread = rate_short_exchange - rate_long_exchange
daily_pnl = spread * payments_per_day * position_size
return daily_pnl * days
pnl = funding_arbitrage_pnl(0.0004, 0.0001, 100_000, days=30)
Riskler ve Tuzaklar

Strateji "bedava para" gibi görünür. Değildir. Birkaç ciddi risk vardır.
1. Borsalar Arası Fiyat Sapması
Farklı borsalardaki pozisyonlar aynı fiyattan açılmaz. Binance ile Bybit arasındaki spread genellikle %0,01-0,05 düzeyindedir; ancak yüksek volatilite anlarında %0,5-1'e ulaşabilir. Pozisyonları eş zamanlı açmazsanız sapma, fonlama kârını aşabilir.
Çözüm: API üzerinden minimum gecikmeyle eş zamanlı açış. İdeal olarak — her iki borsaya yakın yerleşik sunucular.
2. Fonlama Oranı Değişimleri
Pozisyonları %0,03 spreadle açtınız. Bir saat sonra spread %0,005'e indi ya da tersine döndü. Artık her iki borsada da ödüyor olabilirsiniz.
Çözüm: Gerçek zamanlı spread izleme ve spread eşiğin altına düştüğünde otomatik kapanış.
def should_close(
current_spread: float,
entry_spread: float,
min_spread: float = 0.0001, # %0,01
trading_costs: float = 0.0005, # açış + kapanış için %0,05
) -> bool:
"""
Spread eşiğin altına düştüyse veya mevcut spread işlem
maliyetlerini karşılamıyorsa pozisyonu kapat.
"""
return current_spread < min_spread or current_spread < trading_costs
3. İşlem Komisyonları
İki borsada pozisyon açmak ve kapatmak 4 emir demektir. Maker komisyonu %0,02, taker komisyonu %0,05 olduğunda:
- İyimser senaryo (tümü maker):
- Kötümser senaryo (tümü taker):
Komisyonların başa baş noktasına ulaşması için pozisyonun yeterince uzun tutulması gerekir:
def breakeven_days(
total_commissions_pct: float, # toplam komisyonlar (%)
spread: float, # fonlama oranı spreadi
payments_per_day: int = 3,
) -> float:
daily_income = spread * payments_per_day
return total_commissions_pct / daily_income if daily_income > 0 else float('inf')
4. Marjin Gereksinimleri
Her iki borsadaki pozisyonlar teminat gerektirir. 100.000 $ pozisyon için her borsada 5x kaldıraçla:
- Binance: 20.000 $ teminat
- Bybit: 20.000 $ teminat
- Toplam kilitli: 100.000 **
Sermaye getirisi:
10x kaldıraçta teminat 20.000 $'a düşer, ROC %13,5'e yükselir. Ancak fiyat sapmasından kaynaklanan tasfiye riski de artar.
5. Tasfiye Riski
Varlık fiyatı sert hareket ederse bir pozisyon gerçekleşmemiş zarar üretir. Zararlı pozisyonun bulunduğu borsada marjin sürdürülmesi gerekir. Marjin yetersiz kalırsa — tasfiye. Bu arada diğer borsadaki kâr yardımcı olmaz; farklı bir hesapta bulunur.
Çözüm:
- Marjin rezervi tutun (minimumun en az 2 katı)
- Marjin seviyesi uyarıları ayarlayın
- Otomatik yeniden dengeleme: dengesizlik oluştuğunda borsalar arasında fon transferi yapın
Fonlama Oranı İzleme Sistemi

Arbitrajın ilk adımı veri toplamaktır. İlgilendiğiniz tüm borsalardaki fonlama oranlarını gerçek zamanlı olarak takip etmeniz gerekir.
import asyncio
import ccxt.pro as ccxt
from dataclasses import dataclass
from datetime import datetime
@dataclass
class FundingSnapshot:
exchange: str
symbol: str
rate: float
next_funding_time: datetime
timestamp: datetime
class FundingMonitor:
"""
Birden fazla borsada fonlama oranlarını izler.
"""
def __init__(self, symbols: list[str], exchanges: list[str]):
self.symbols = symbols
self.exchanges = {
name: getattr(ccxt, name)() for name in exchanges
}
self.latest: dict[str, dict[str, FundingSnapshot]] = {}
async def fetch_funding(self, exchange_name: str, exchange, symbol: str):
"""Bir borsadan mevcut fonlama oranını getirir."""
try:
funding = await exchange.fetch_funding_rate(symbol)
return FundingSnapshot(
exchange=exchange_name,
symbol=symbol,
rate=funding['fundingRate'],
next_funding_time=datetime.fromtimestamp(
funding['fundingTimestamp'] / 1000
),
timestamp=datetime.utcnow(),
)
except Exception as e:
print(f"Error fetching {exchange_name} {symbol}: {e}")
return None
async def scan(self) -> list[dict]:
"""
Tüm borsaları tarar ve arbitraj fırsatlarını bulur.
"""
tasks = []
for ex_name, ex in self.exchanges.items():
for symbol in self.symbols:
tasks.append(self.fetch_funding(ex_name, ex, symbol))
snapshots = await asyncio.gather(*tasks)
snapshots = [s for s in snapshots if s is not None]
by_symbol: dict[str, list[FundingSnapshot]] = {}
for s in snapshots:
by_symbol.setdefault(s.symbol, []).append(s)
opportunities = []
for symbol, rates in by_symbol.items():
rates.sort(key=lambda x: x.rate)
lowest = rates[0] # burada uzun aç (daha az öde)
highest = rates[-1] # burada kısa aç (daha fazla al)
spread = highest.rate - lowest.rate
opportunities.append({
'symbol': symbol,
'long_exchange': lowest.exchange,
'long_rate': lowest.rate,
'short_exchange': highest.exchange,
'short_rate': highest.rate,
'spread': spread,
'annualized': spread * 3 * 365 * 100, # yıllıklaştırılmış %
})
return sorted(opportunities, key=lambda x: -x['spread'])
Örnek Çıktı
Symbol | Long @ | Rate | Short @ | Rate | Spread | APR
-----------+-------------+---------+-------------+---------+---------+--------
ETHUSDT | Binance | 0.010% | Bybit | 0.040% | 0.030% | 32.9%
BTCUSDT | OKX | 0.008% | Binance | 0.020% | 0.012% | 13.1%
SOLUSDT | Binance | 0.015% | dYdX | 0.055% | 0.040% | 43.8%
ARBUSDT | Bybit | 0.005% | OKX | 0.030% | 0.025% | 27.4%
Uygulama: Eş Zamanlı Pozisyon Açma

Yönsel risk maruziyetinden kaçınmak için uzun ve kısayı mümkün olduğunca eş zamanlı açmak kritik öneme sahiptir.
import asyncio
async def execute_arbitrage(
long_exchange,
short_exchange,
symbol: str,
size: float,
max_slippage_pct: float = 0.05,
):
"""
İki borsada eş zamanlı olarak uzun ve kısa pozisyon açar.
"""
long_ticker = await long_exchange.fetch_ticker(symbol)
short_ticker = await short_exchange.fetch_ticker(symbol)
price_spread = abs(
long_ticker['ask'] - short_ticker['bid']
) / long_ticker['ask'] * 100
if price_spread > max_slippage_pct:
raise ValueError(
f"Price spread {price_spread:.3f}% exceeds max slippage"
)
long_order, short_order = await asyncio.gather(
long_exchange.create_market_buy_order(symbol, size),
short_exchange.create_market_sell_order(symbol, size),
)
return long_order, short_order
Pozisyon Yönetimi
Açıldıktan sonra sürekli izleme gerekir:
- Fonlama oranı spreadi. Spread eşiğin altına inerse — kapat.
- Marjin bakiyesi. Bir borsadaki marjin güvenli seviyenin altına düşerse — yeniden dengele ya da kapat.
- Fiyat sapması. Bir taraftaki gerçekleşmemiş K&Z limiti aşarsa — kapat.
async def monitor_and_manage(
long_exchange,
short_exchange,
symbol: str,
size: float,
min_spread: float = 0.0001,
max_unrealized_loss_pct: float = 2.0,
check_interval: int = 60,
):
"""
Açık bir arbitraj pozisyonunu izler.
"""
while True:
long_funding = await long_exchange.fetch_funding_rate(symbol)
short_funding = await short_exchange.fetch_funding_rate(symbol)
current_spread = (
short_funding['fundingRate'] - long_funding['fundingRate']
)
long_balance = await long_exchange.fetch_balance()
short_balance = await short_exchange.fetch_balance()
long_positions = await long_exchange.fetch_positions([symbol])
short_positions = await short_exchange.fetch_positions([symbol])
long_upnl = long_positions[0]['unrealizedPnl'] if long_positions else 0
short_upnl = short_positions[0]['unrealizedPnl'] if short_positions else 0
total_upnl_pct = (long_upnl + short_upnl) / size * 100
if current_spread < min_spread:
print(f"Spread collapsed: {current_spread:.4%}")
await close_both(long_exchange, short_exchange, symbol, size)
break
if abs(total_upnl_pct) > max_unrealized_loss_pct:
print(f"Unrealized loss exceeded: {total_upnl_pct:.2f}%")
await close_both(long_exchange, short_exchange, symbol, size)
break
await asyncio.sleep(check_interval)
Gelişmiş Varyantlar
Spot-Perp Arbitrajı

İki borsada vadeli işlem yerine tek bir borsada spot + vadeli işlem kombinasyonunu kullanabilirsiniz:
- Spot al (fonlama yok)
- Sürekli vadeli işlemi kısa yap (oran pozitifken fonlama alırsınız)
Avantaj: her şey tek borsada, marjin yönetimi daha basit. Dezavantaj: yalnızca pozitif fonlamada işe yarar (uzunlar kısalara öder); bu durum boğa piyasasının ~%70'inde gözlemlenir.
def spot_perp_carry(
funding_rate: float, # mevcut fonlama oranı
spot_fee: float = 0.001, # spot komisyon (%0,1)
perp_fee: float = 0.0005, # vadeli komisyon (%0,05)
leverage: int = 1,
) -> dict:
"""
Spot-perp carry trade getirisini hesaplar.
"""
total_fees = (spot_fee + perp_fee) * 2 # açış + kapanış
daily_income = funding_rate * 3
breakeven_days = total_fees / daily_income if daily_income > 0 else float('inf')
return {
'daily_income_pct': daily_income * 100,
'monthly_income_pct': daily_income * 30 * 100,
'annualized_pct': daily_income * 365 * 100,
'total_fees_pct': total_fees * 100,
'breakeven_days': breakeven_days,
}
result = spot_perp_carry(0.0003)
Çok Borsalı Arbitraj

5+ borsayı eş zamanlı izlediğinizde daha avantajlı fırsatlar bulabilirsiniz. Algoritma:
- Tüm borsalardan fonlama oranlarını topla
- Maksimum spreade sahip çifti bul
- Her iki borsadaki likidite ve emir defteri derinliğini kontrol et
- Spread > eşik ise pozisyon aç
- Sürekli yeniden tara: en iyi çift değişirse döndür
def find_best_pair(
rates: dict[str, float], # {"binance": 0.01, "bybit": 0.04, "okx": 0.02}
min_spread: float = 0.0002,
) -> tuple[str, str, float] | None:
"""
Maksimum fonlama oranı spreadine sahip borsa çiftini bulur.
Döndürür: (long_exchange, short_exchange, spread) ya da None.
"""
exchanges = list(rates.keys())
best = None
for i, ex_long in enumerate(exchanges):
for ex_short in exchanges[i+1:]:
if rates[ex_long] < rates[ex_short]:
spread = rates[ex_short] - rates[ex_long]
long_ex, short_ex = ex_long, ex_short
else:
spread = rates[ex_long] - rates[ex_short]
long_ex, short_ex = ex_short, ex_long
if spread >= min_spread:
if best is None or spread > best[2]:
best = (long_ex, short_ex, spread)
return best
Fonlama Oranı Tahmini

Fonlama oranı, prim endeksini — vadeli ile spot fiyat arasındaki farkı — içeren bir formülle hesaplanır. Prim, fonlamaya kıyasla daha sık güncellenir (her dakika vs her 8 saatte bir). Bu, ödeme gerçekleşmeden dakikalar veya saatler önce bir sonraki fonlama oranını tahmin etmenizi sağlar.
def predict_next_funding(
premium_index: float,
interest_rate: float = 0.0001, # 8 saatte %0,01 (standart)
clamp_range: float = 0.0005, # ±%0,05
) -> float:
"""
Mevcut prim endeksine göre bir sonraki fonlama oranını tahmin eder.
Binance formülü: FR = clamp(Premium - Interest, -0.05%, 0.05%) + Interest
"""
diff = premium_index - interest_rate
clamped = max(-clamp_range, min(clamp_range, diff))
return clamped + interest_rate
Tahmin edilen fonlama oranını bilerek, spread henüz diğer arbitrajcıların dikkatini çekmemişken ödeme öncesinde pozisyon açabilirsiniz.
Altyapı Gereksinimleri

Ciddi fonlama oranı arbitrajı için altyapıya ihtiyaç duyarsınız:
| Bileşen | Minimum | Optimal |
|---|---|---|
| Sunucu | Bulut VPS | Borsalara yakın colocation |
| Gecikme | < 500ms | < 50ms |
| API anahtarları | 2 borsa | 5+ borsa |
| Borsa başına sermaye | Her biri 10.000 $ | Her biri 50.000 $+ |
| İzleme | Log + uyarılar | Pano + otomatik yeniden dengeleme |
| Veri | REST API polling | WebSocket streaming |
Farklı Ölçeklerde Ekonomi
| Sermaye | Pozisyon (5x) | Spread %0,03 | Aylık PnL | ROC |
|---|---|---|---|---|
| 10.000 $ | 25.000 $ | %0,03 | ~675 $ | ~%6,75 |
| 50.000 $ | 125.000 $ | %0,03 | ~3.375 $ | ~%6,75 |
| 200.000 $ | 500.000 $ | %0,03 | ~13.500 $ | ~%6,75 |
ROC ölçekten bağımsızdır (yeterli likidite sağlandığında). Ancak 10.000 $ sermayedeki mutlak kâr, altyapı maliyetleri ve harcanan zamanı karşılamayabilir.
Sonuç
Fonlama oranı arbitrajı, yapısal, delta-nötr bir stratejidir. Fiyat tahmini gerektirmez; ancak şunları gerektirir:
- Altyapı — birden fazla borsada oranların gerçek zamanlı izlenmesi
- Uygulama hızı — farklı borsalarda eş zamanlı pozisyon açma
- Risk yönetimi — marjin, fiyat sapması ve spread değişimlerinin kontrolü
- Sermaye — kâr, pozisyon büyüklüğüyle doğru orantılıdır
Fonlama oranı spreadleri sabit değildir. Volatilite dönemlerinde genişler, sakin dönemlerde daralır. Görev, sapmalar varken onları otomatik olarak bulup değerlendirmektir.
Fonlama oranlarının kaldıraçlı stratejileri nasıl etkilediği hakkında daha fazla bilgi için — Fonlama Oranları Kaldıracınızı Öldürüyor: PnL×50x Neden Bir Yanılsamadır makalesine bakın.
Faydalı Bağlantılar
- Binance — Fonlama Oranı Geçmişi
- Binance — Fonlama Oranlarına Giriş
- Bybit — Fonlama Oranlarını Anlamak
- dYdX — Sürekli Vadeli Fonlama Oranı Mekanizması
- Coinglass — Fonlama Oranı Monitörü
Atıf
@article{soloviov2026fundingarbitrage,
author = {Soloviov, Eugen},
title = {Funding Rate Arbitrage Across Exchanges: How to Profit from Rate Differences},
year = {2026},
url = {https://marketmaker.cc/tr/blog/post/funding-rate-arbitrage-cross-exchange},
description = {Kripto borsalarında fonlama oranı arbitrajının nasıl çalıştığı, Binance, Bybit, OKX ve dYdX'te oranların neden farklılaştığı ve bir izleme ile uygulama sisteminin nasıl kurulacağı.}
}
Yazarlar
Trading-systems engineer
Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.