Skip to content

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