Skip to main content

mts1b-cryptodata

Crypto-data adapters: Binance, Kraken Futures, Uniswap, DeFi protocols.

Repo: github.com/MTS1B/mts1b-cryptodata Layer: 2 Wave: 2 (months 4-7) Depends on: foundation, platform, httpx, ccxt (selective), web3 Audience: mts1b-datalake, mts1b-research

What it is

Crypto-native data adapters that capture what mts1b-marketdata doesn't: perpetual funding rates, open interest, on-chain DEX trades, DeFi protocol state, derivatives spot-vs-futures basis.

Supported sources

SourceSpotPerpsOptionsOIFundingOn-chain
binance
kraken_futures
bybit
okx
deribit
uniswap_v3
defillamaTVL + protocol stats

For Coinbase + Kraken spot, use mts1b-marketdata (general adapters with crypto support).

Module layout

mts1b_cryptodata/
├── binance/
│ ├── spot.py
│ ├── perp.py
│ ├── options.py
│ └── websocket.py
├── kraken_futures/
├── bybit/
├── okx/
├── deribit/
├── uniswap_v3/
│ ├── graph.py # The Graph subgraph queries
│ └── pool.py # direct on-chain via web3
├── defillama/
│ └── client.py
└── unified/
├── funding.py # cross-venue funding rates
└── basis.py # spot-vs-futures basis

API

Funding rates (cross-venue)

from mts1b_cryptodata.unified import funding_rates

rates = await funding_rates(symbol="BTC-USD-PERP", venues=["binance", "kraken_futures", "okx"])
# [
# FundingRate(venue="binance", rate=0.0001, next_at=datetime(...), apr=10.95%),
# FundingRate(venue="kraken_futures", rate=0.0002, next_at=datetime(...), apr=21.90%),
# FundingRate(venue="okx", rate=0.00015, next_at=datetime(...), apr=16.43%),
# ]

Perp open interest

from mts1b_cryptodata.binance.perp import BinancePerp

async with BinancePerp(api_key=None) as bp: # public data, no auth needed
oi = await bp.open_interest("BTCUSDT")
# OpenInterest(symbol="BTCUSDT", oi_usd=8.2e9, oi_contracts=125_000, asof=...)

history = await bp.oi_history("BTCUSDT", interval="1h", days=7)
# pd.Series indexed by ts

Uniswap V3 pools

from mts1b_cryptodata.uniswap_v3 import UniswapV3

async with UniswapV3(chain="ethereum") as uni:
pools = await uni.top_pools(min_tvl_usd=10_000_000)
# [Pool(address=..., token0=..., token1=..., tvl_usd=..., fee_tier=0.003)]

swaps = await uni.recent_swaps(pool="0x...", limit=1000)
# [Swap(tx_hash=..., amount0=..., amount1=..., price=..., timestamp=...)]

DeFi TVL via DefiLlama

from mts1b_cryptodata.defillama import DefiLlama

async with DefiLlama() as dl:
protocols = await dl.protocols(category="Lending")
# [Protocol(name="Aave V3", tvl_usd=..., chains=["Ethereum","Polygon",...])]

tvl = await dl.protocol_tvl("aave-v3", days=30)
# pd.DataFrame: ts, chain, tvl_usd

Funding-rate arbitrage example

# Identify cross-venue funding arb opportunities
from mts1b_cryptodata.unified import funding_arb

opportunities = await funding_arb(
symbol="BTC-USD-PERP",
venues=["binance", "kraken_futures", "okx", "bybit"],
min_spread_apr=0.10, # only spreads > 10% APR
)
# [FundingArb(long_venue="okx", short_venue="binance",
# spread_apr=0.18, holding_costs_apr=0.03, net_edge_apr=0.15)]

WebSocket streaming

async with BinancePerp() as bp:
async for tick in bp.stream_trades("BTCUSDT"):
print(tick.price, tick.volume, tick.side)

Most adapters support WS for trades, book updates, and funding events.

Rate limits + auth

VenuePublic limitAuth needed for
Binance1200 req/minprivate data + WS
Kraken Futures60 req/minprivate
OKX20 req/2sprivate
Bybit50 req/secprivate
Deribit20 req/secprivate
Uniswap V3TheGraph free tiernone

All adapters use mts1b-platform/ratelimit and respect venue limits.

Build + test

pip install -e ".[dev]"
pytest -m unit
pytest -m live --venue=binance

Roadmap

VersionItems
0.1 (Wave 2)7 venues, funding + OI + Uniswap V3 + DefiLlama
0.2 (Wave 2)dYdX, GMX, Perpetual Protocol
0.3 (Wave 3)More chains: Solana DEXes, BSC, Polygon
1.0 (LTS)Stable adapter interface

See also