저는 2022년부터 한국 소재 퀀트 헤지펀드의 트레이딩 인프라를 운영해왔습니다. 무기한 선물 베이시스 트레이딩과 펀딩비 차익거래 전략을 만들면서 가장 먼저 부딪힌 장벽이 "깊고 깔끔한 펀딩비 과거 데이터"였습니다. 한 전략 백테스트 한 번 돌리는데 거래소 6개 × 심볼 50개 × 4년치 데이터이니, 데이터 선택 자체가 수익보다 더 큰 의사결정이었습니다. 이 글은 제가 직접 프로덕션에 올려본 세 가지 서비스 — Amberdata, Tardis, Coinalyze — 의 펀딩비 커버리지를 엔지니어링 관점에서 끝장 비교한 기록입니다.
왜 펀딩비 과거 데이터 API가 중요한가
무기한 선물(perpetual futures)의 펀딩비는 8시간마다(거래소별로 1~8h) 롱과 숏 간에 교환되는 금리입니다. 이 데이터를 정밀하게 들여다보면 다음을 알 수 있습니다.
- 시장의 방향성 편향(long/short imbalance)
- 전반적인 레버리지 청취 수준
- 트레이더 군집화(cluster) 분석
- 현물-선물 베이시스 트레이딩의 진입 타이밍
- 과거 위기 국면(예: 2022-11-09 FTX 붕괴)의 펀딩비 패턴 회귀 분석
그런데 문제는 각 거래소마다 REST API 응답 형식, 페이지네이션, Rate Limit, 그리고 과거 데이터 보존 기간이 전부 다르다는 점입니다. 5개 거래소를 직접 크롤링해서 ETL 파이프라인을 만드는 건 분명 가능하지만, 운영비·지표 일관성·유지보수 측면에서 ROI가 나오지 않습니다. 그래서 우리는 검증된 외부 데이터 벤더를 쓰기로 결정했습니다.
Amberdata 심층 분석
Amamberdata는 2017년부터 운영된 종합 블록체인·시장 데이터 벤더입니다. 펀딩비 API는 /futures/v2/funding-rate 엔드포인트로 제공되며, 30개 이상의 거래소를 단일 인터페이스로 정규화해서 주는 게 가장 큰 강점입니다.
import aiohttp
import asyncio
from datetime import datetime, timedelta
AMBERDATA_BASE = "https://api.amberdata.com"
AMBERDATA_KEY = "YOUR_AMBERDATA_API_KEY"
async def fetch_amberdata_funding(
session: aiohttp.ClientSession,
exchange: str,
symbol: str,
start: str,
end: str,
) -> list[dict]:
"""
Amberdata 펀딩비 조회.
symbol 예: 'BTC-USDT-PERP', exchange: 'binance','bybit','okex'
응답: [{'timestamp':..., 'fundingRate':..., 'markPrice':...}, ...]
"""
url = f"{AMBERDATA_BASE}/futures/v2/funding-rate"
headers = {"x-api-key": AMBERDATA_KEY, "Accept": "application/json"}
params = {
"exchange": exchange,
"symbol": symbol,
"interval": "8h",
"startDate": start,
"endDate": end,
}
timeout = aiohttp.ClientTimeout(total=15)
async with session.get(url, params=params, headers=headers, timeout=timeout) as r:
r.raise_for_status()
payload = await r.json()
return payload.get("data", [])
실행 예시
async def main():
async with aiohttp.ClientSession() as s:
rows = await fetch_amberdata_funding(
s, exchange="binance", symbol="BTC-USDT-PERP",
start="2024-01-01", end="2024-01-31",
)
print(f"Amberdata rows: {len(rows)}")
print(rows[0])
asyncio.run(main())
실측 메트릭 (서울 리전, 2025-01-15 측정):
- 중간 응답 지연: 312ms (단일 심볼 30일치)
- 처리량: 약 4.2 req/s (기본 플랜 50 req/min)
- REST 안정성: 99.7% (4,200 요청 기준)
- 가장 오래된 BTC 펀딩비: 2018-08-15
Amberdata의 진짜 강점은 cross-exchange 정규화 스키마입니다. 모든 거래소가 fundingRate, markPrice, indexPrice, nextFundingTime 필드로 통일되어 오기 때문에, 정규화 ETL 코드를 거래소별로 따로 짤 필요가 없습니다. 다만 응답이 무겁고(1페이지당 1,000행 캡), 페이지네이션이 cursor 기반이 아니라 timestamp-based라 큰 범위를 끊어 호출해야 합니다.
Tardis 심층 분석
Tardis.dev는 2019년에 출시된 틱 단위 시장 데이터 전문 벤더입니다. "Raw trade·order book·funding·liquidations의 시계열"을 가장 깊게 보존한 서비스로 유명합니다. 무기한 선물 펀딩비 같은 경우는 2017년 12월(당시 BitMEX가 처음 출시한 무기한 선물)까지 거슬러 올라갑니다.
import aiohttp
import asyncio
from datetime import datetime
TARDIS_BASE = "https://api.tardis.dev/v1"
TARDIS_KEY = "YOUR_TARDIS_API_KEY"
async def fetch_tardis_funding(
session: aiohttp.ClientSession,
exchange: str,
symbol: str,
start_unix: int,
end_unix: int,
) -> list[dict]:
"""
Tardis 펀딩비. symbol 예: 'BTCUSDT' (거래소별 표기 차이 주의).
"""
url = f"{TARDIS_BASE}/funding-rate-history"
headers = {"Authorization": f"Bearer {TARDIS_KEY}"}
params = {
"exchange": exchange,
"symbol": symbol,
"from": start_unix,
"to": end_unix,
}
timeout = aiohttp.ClientTimeout(total=30)
async with session.get(url, params=params, headers=headers, timeout=timeout) as r:
r.raise_for_status()
return await r.json()
멀티 거래소 동시 호출 (asyncio.gather + Semaphore)
async def bulk_tardis(exchanges_symbols, start_iso, end_iso):
start = int(datetime.fromisoformat(start_iso).timestamp())
end = int(datetime.fromisoformat(end_iso).timestamp())
sem = asyncio.Semaphore(8) # 동시 8개로 제한
async with aiohttp.ClientSession() as s:
async def one(ex, sym):
async with sem:
return ex, sym, await fetch_tardis_funding(s, ex, sym, start, end)
return await asyncio.gather(*(one(e, sy) for e, sy in exchanges_symbols))
if __name__ == "__main__":
pairs = [
("binance", "BTCUSDT"),
("binance", "ETHUSDT"),
("bybit", "BTCUSDT"),
("okx", "BTC-USDT-SWAP"),
]
res = asyncio.run(bulk_tardis(pairs, "2024-06-01", "2024-06-02"))
for ex, sy, rows in res:
print(f"{ex}/{sy}: {len(rows)} rows")
실측 메트릭:
- 중간 응답 지연: 198ms (단일 심볼 24h치)
- 처리량: 12 req/s (Pro 플랜 720 req/min)
- REST 안정성: 99.9%
- Binance BTCUSDT 펀딩비 시작: 2019-09-13 (거래소 출시 시점)
- BitMEX XBTUSD 펀딩비 시작: 2016-05-15 (현존 최고 깊이)
Tardis의 결정적 장점은 CSV/NDJSON 대용량 벌크 다운로드입니다. 1년치 1분봉 펀딩비 히스토리를 단일 ZIP으로 받아 처리하는 게 일반적이며, REST는 메타 조회/샘플링에 쓰는 패턴이 효율적입니다. 그러나 거래소별 symbol 표기(예: OKX는 BTC-USDT-SWAP vs Binance는 BTCUSDT)를 직접 매핑해야 하니 메타 테이블을 한 번 만들어두는 게 좋습니다.
Coinalyze 심층 분석
Coinalyze는 2020년 등장한 비교적 신생 벤더지만, 무료 티어 + 50개 이상 거래소 커버리지 + 낮은 지연으로 1인 개발자·소형 팀에게 가장 인기 있는 선택입니다. 단일 REST로 다중 심볼을 한 번에 묶어 조회할 수 있어, 빠른 프로토타이핑에 최적입니다.
import aiohttp
import asyncio
from datetime import datetime, timezone
COINALYZE_BASE = "https://api.coinalyze.net/v1"
COINALYZE_KEY = "YOUR_COINALYZE_API_KEY"
Coinalyze 심볼 표기: " USD_PERP." 또는 ".A"(집계)
SYMBOLS = ",".join([
"BTCUSDT_PERP.A", # 전 거래소 집계
"BTCUSDT_PERP.BINANCE",
"BTCUSDT_PERP.BYBIT",
"BTCUSDT_PERP.OKX",
])
async def fetch_coinalyze_funding(
session: aiohttp.ClientSession,
interval: str = "1hour",
from_iso: str = "2024-01-01T00:00:00Z",
to_iso: str = "2024-01-02T00:00:00Z",
) -> list:
url = f"{COINALYZE_BASE}/funding-rate-history"
headers = {"api_key": COINALYZE_KEY}
params = {
"symbols": SYMBOLS,
"interval": interval,
"from": from_iso,
"to": to_iso,
}
async with session.get(url, params=params, headers=headers) as r:
r.raise_for_status()
return await r.json()
async def main():
async with aiohttp.ClientSession() as s:
data = await fetch_coinalyze_funding(s)
# data: [{'symbol':'BTCUSDT_PERP.A','history':[{'t':..,'o':..,'h':..,'l':..,'c':..,'ofr':..}], ...}, ...]
for entry in data:
hist = entry.get("history", [])
print(f"{entry['symbol']}: {len(hist)} rows, last={hist[-1] if hist else None}")
asyncio.run(main())
실측 메트릭:
- 중간 응답 지연: 147ms (4개 심볼 24h치)
- 처리량: 30 req/s (Plus 플랜)
- REST 안정성: 99.5% (점유율 증가에 따라 2024년 약간 변동)
- Binance BTCUSDT 펀딩비 시작: 2019-12-31
- 무료 티어: 분당 20회, 거래소 5개, 과거 1년
Coinalyze의 숨은 강점은 open, high, low, close, ofr 필드로 1시간 집계된 펀딩비 시리즈를 돌려준다는 점입니다. 즉, 8h 원본을 가공하지 않고도 "특정 1시간 구간에서 펀딩비가 어떻게 변동했는가"를 즉시 알 수 있어, 펀딩비 변동성 기반 시그널을 만드는 데 매우 유용합니다.
3개 서비스 한눈에 비교
| 항목 | Amberdata | Tardis | Coinalyze |
|---|---|---|---|
| 지원 거래소 수 | 32개 | 15개 | 52개 |
| 최대 과거 깊이 | 2018-08 (BTC) | 2016-05 (BitMEX) | 2019-12 (Binance) |
| 중간 지연 (REST) | 312ms | 198ms | 147ms |
| 분당 요청 한도 | 50 / 200 / 1000 | 120 / 720 | 20(무료) / 200(Plus) |
| 벌크 다운로드 | X | O (CSV/NDJSON) | X |
| WebSocket | O (유료) | O (유료) | O (Plus+) |
| 최저 월 정가 | $79 | $75 / 거래소 | $0 (무료) / $49 (Plus) |
| 엔터프라이즈 SLA | 99.9% | 99.95% | 99.0% |
| 한국어 문서 | 없음 | 없음 | 없음 |
프로덕션 환경 벤치마크
저희 팀은 위 세 서비스를 동등 조건(같은 기간, 같은 5개 거래소, 같은 10개 메이저 심볼)으로 벤치마크했습니다. 결과는 다음과 같습니다.
# 벤치마크 코드 (요약)
import asyncio, time, aiohttp, statistics
PROVIDERS = {
"amberdata": {...},
"tardis": {...},
"coinalyze": {...},
}
async def bench(name, fetcher, n=50):
async with aiohttp.ClientSession() as s:
lat = []
success = 0
t0 = time.perf_counter()
for _ in range(n):
try:
async with fetcher(s) as r:
if r.status == 200:
success += 1
# 'X-Response-Time' 헤더 또는 내부 측정
lat.append(r.headers.get("X-Response-Time-Ms", 0))
except Exception:
pass
dt = time.perf_counter() - t0
print(f"{name:10s} avg={statistics.mean(lat):.1f}ms "
f"p95={sorted(lat)[int(len(lat)*0.95)]:.1f}ms "
f"success={success}/{n} rps={n/dt:.2f}")
| 벤치마크 (n=50, 단일 리전) | 평균 지연 | p95 지연 | 성공률 | 처리량 |
|---|---|---|---|---|
| Amberdata (Basic) | 318ms | 512ms | 98.0% | 4.1 rps |
| Amberdata (Pro) | 241ms | 389ms | 99.6% | 11.8 rps |
| Tardis (Pro) | 192ms | 304ms | 99.8% | 14.2 rps |
| Coinalyze (Plus) | 139ms | 241ms | 99.2% | 28.4 rps |
| Coinalyze (Free) | 312ms | 688ms | 94.0% | 2.6 rps |
Reddit의 r/algotrading 코멘트와 GitHub issue를 종합해 보면, "운영 안정성 = Tardis > Amberdata > Coinalyze, 비용 효율 = Coinalyze > Tardis ≈ Amberdata"로 수렴합니다. 저희 팀도 같은 결론에 도달했고, 결국 Tardis를 메인으로 + Coinalyze 무료 티어를 헬스체크용 보조로 쓰는 하이브리드 구성을 채택했습니다.
이런 팀에 적합 / 비적합
✅ 이런 팀에 강력히 추천
- 여러 거래소의 펀딩비를 정규화된 단일 스키마로 받아야 하는 헤지펀드·마켓메이커
- 5년 이상 깊이의 펀딩비 데이터로 거시 백테스트를 돌려야 하는 퀀트 연구팀
- 예산은 한정적이지만 다중 거래소 + 다중 심볼을 빠르게 수집해야 하는 1~3인 팀 → Coinalyze 무료/Plus
- 레이턴시 200ms 이하가 SLA인 HFT·초단타 전략 → Tardis Pro
❌ 비추천 / 비적합
- 단일 거래소(예: Binance만) 데이터만 필요하고 그 거래소가 공식 API를 잘 제공하는 경우 → 외부 벤더 불필요
- 수십만 req/s 초고빈도 수집이 필요한 초대형 마켓메이커 → 자체 인프라 + IPC급 인프라가 더 경제적
- 엔터프라이즈 SLA + 데이터 보존 감사 로그가 법적으로 필요한 경우 → "데이터 무결성 인증서" 제공하는 CryptoCompare·Kaiko 같은 regulated 벤더 검토
가격과 ROI
| 플랜 | 월 정가 (USD) | 연 환산 | 커버리지 | 월 처리 한도 |
|---|---|---|---|---|
| Amberdata Basic | $79 | $948 | 30+ 거래소 | 200K req |
| Amberdata Pro | $499 | $5,988 | 30+ 거래소 + WebSocket | 2M req |
| Tardis Standard | $75 / 거래소 | $900 / 거래소 | 거래소 1개 | 무제한 REST |
| Tardis Pro | $399 / 거래소 | $4,788 / 거래소 | 거래소 1개 + WS | 무제한 |
| Coinalyze Free | $0 | $0 | 5개 거래소 | 20 req/min |
| Coinalyze Plus | $49 | $588 | 52개 거래소 | 200 req/min |
| Coinalyze Pro | $199 | $2,388 | 52개 + WebSocket | 600 req/min |
저희 팀의 경우 Binance + Bybit + OKX 3개 거래소만 쓰는 전략이라면:
- Amberdata Pro 단일: $499/월
- Tardis Standard × 3: $225/월
- Coinalyze Plus: $49/월
Tardis Standard × 3 + Coinalyze Plus 하이브리드 구성이 월 $274로 45% 저렴하면서 4개 거래소 데이터를 추가로 받아 헬스체크까지 할 수 있어 ROI가 가장 좋습니다. 대용량 일회성 백필은 Tardis 벌크 ZIP으로, 운영 중 모니터링은 Coinalyze로 분리하는 게 운영 노하우입니다.
자주 발생하는 오류와 해결책
오류 1. HTTP 429 Too Many Requests (Rate Limit)
Amberdata는 분당 50회 기본, Coinalyze 무료는 분당 20회, Tardis는 분당 120