Bybit Examples¶
Bybit-specific patterns and examples.
Market Types¶
Bybit offers multiple market categories:
| Category | API Type | Description |
|---|---|---|
"spot" | Spot | Spot market trading |
"linear" | Linear | USDT-margined perpetual contracts |
import qldata as qd
# Spot market
spot_df = qd.data("BTCUSDT", source="bybit", category="spot") \
.last(7).resolution("1h").get()
# Linear perpetuals
linear_df = qd.data("BTCUSDT", source="bybit", category="linear") \
.last(7).resolution("1h").get()
Linear Perpetuals¶
Fetch Perpetual Data¶
import qldata as qd
# BTCUSDT perpetual
df = qd.data("BTCUSDT", source="bybit", category="linear") \
.last(30) \
.resolution("1h") \
.clean() \
.get()
print(f"BTCUSDT linear: {len(df)} bars")
Funding Rates¶
import qldata as qd
# Current funding
rate = qd.current_funding_rate("BTCUSDT", source="bybit", category="linear")
print(f"Current rate: {rate:.6f}")
print(f"8h rate: {rate * 100:.4f}%")
print(f"Annualized: {rate * 3 * 365 * 100:.2f}%")
Symbol Info¶
import qldata as qd
info = qd.get_symbol_info("BTCUSDT", source="bybit", category="linear")
print(f"Symbol: {info.symbol}")
print(f"Contract Type: {info.contract_type}")
print(f"Is Perpetual: {info.is_perpetual}")
print(f"Tick Size: {info.filters.tick_size}")
Advanced pybit Usage¶
For features not yet exposed via qldata, use pybit directly:
Order Book Snapshot¶
try:
from pybit.unified_trading import HTTP
except ImportError:
print("Install pybit: pip install pybit")
exit(1)
client = HTTP(testnet=False)
# Get 50-level order book
response = client.get_orderbook(
category="linear",
symbol="BTCUSDT",
limit=50
)
if response["retCode"] == 0:
ob = response["result"]
bids = ob.get("b", [])
asks = ob.get("a", [])
print(f"Bids: {len(bids)} levels")
print(f"Asks: {len(asks)} levels")
if bids and asks:
spread = float(asks[0][0]) - float(bids[0][0])
print(f"Spread: ${spread:.2f}")
Funding Rate History¶
from pybit.unified_trading import HTTP
client = HTTP(testnet=False)
response = client.get_funding_rate_history(
category="linear",
symbol="BTCUSDT",
limit=10
)
if response["retCode"] == 0:
history = response["result"]["list"]
print("Recent Funding Rates:")
for r in history[:5]:
rate = float(r.get("fundingRate", 0))
print(f" {r['fundingRateTimestamp']}: {rate*100:.4f}%")
Open Interest¶
from pybit.unified_trading import HTTP
client = HTTP(testnet=False)
response = client.get_open_interest(
category="linear",
symbol="BTCUSDT",
intervalTime="5min"
)
if response["retCode"] == 0:
oi_list = response["result"]["list"]
if oi_list:
oi = oi_list[0]
print(f"Open Interest: {oi.get('openInterest')}")
Live Streaming¶
import qldata as qd
import time
def on_trade(df):
if df.empty:
return
for _, row in df.iterrows():
print(f"[{row['symbol']}] ${row['price']:.2f} x {row['quantity']}")
stream = qd.stream(["BTCUSDT"], source="bybit", category="linear") \
.resolution("tick") \
.on_data(on_trade) \
.get(start=True)
time.sleep(60)
stream.stop()
Cross-Exchange Comparison¶
import qldata as qd
symbols = ["BTCUSDT", "ETHUSDT"]
for symbol in symbols:
# Bybit data
bybit_df = qd.data(symbol, source="bybit", category="linear") \
.last(7).resolution("1h").clean().get()
# Binance data
binance_df = qd.data(symbol, source="binance", category="usdm") \
.last(7).resolution("1h").clean().get()
# Compare last prices
bybit_price = bybit_df["close"].iloc[-1]
binance_price = binance_df["close"].iloc[-1]
diff = bybit_price - binance_price
print(f"{symbol}:")
print(f" Bybit: ${bybit_price:,.2f}")
print(f" Binance: ${binance_price:,.2f}")
print(f" Diff: ${diff:,.2f}")
Rate Limits¶
Bybit rate limits:
| Type | Limit | Notes |
|---|---|---|
| REST API | 120 req/min | Per endpoint |
| WebSocket | 20 connections/IP | Per IP |
Rate limits are handled automatically:
# This works with many symbols
data = qd.data(["BTCUSDT", "ETHUSDT", "SOLUSDT"], source="bybit") \
.last(30).resolution("1h") \
.get(parallel=True, workers=2) # Lower worker count for Bybit
See Also¶
- Binance Examples - Binance patterns
- Streaming API - Full streaming docs
- Historical Data - Full historical docs