요약: 저는 최근 두 달간 Tardis와 Amberdata를 같은 트레이딩 전략 백엔드에 동시에 올려 비용을 비교했습니다. 같은 호출량을 넣었을 때 월 청구액이 최대 3.4배까지 벌어지는 것을 확인했고, 그 결과를 마이그레이션 플레이북으로 정리했습니다. 결론부터 말하면, "연회비가 무조건 싼 것도, 사용량 기반이 무조건 비싼 것도 아닙니다" — 워크로드 패턴에 따라 정답이 달라집니다.
들어가며: 왜 지금 다시 비용을 따져야 하는가
저는 2024년부터 한국 소재 퀀트 팀에서 시장 데이터 파이프라인을 운영하면서 Tardis의 과거 틱 데이터와 Amberdata의 온체인 지표를 함께 쓰고 있습니다. 두 서비스는 겉보기엔 "둘 다 기관급 암호화폐 데이터"로 묶이지만, 가격 모델은 사실 정반대입니다. Tardis는 월 구독 + 초과량 과금의 하이브리드, Amberdata는 연단위 계약 중심입니다. 같은 데이터 1GB를 받아도 청구액이 $180에서 $612까지 차이가 나는 현상을 직접 측정했고, 이 글에서는 그 수치와 마이그레이션 절차를 공유합니다.
Tardis와 Amberdata 한눈에 비교
| 항목 | Tardis | Amberdata |
|---|---|---|
| 강점 영역 | 과거 틱/호가북/체결 내역 (Binance, Coinbase 등 30여 거래소) | 온체인 데이터 + 정규화 시장 데이터 + 기관용 SLA |
| 가격 모델 | 월 구독 + 초과분 사용량 과금 | 연단위 기관 계약 (분기/연 결제 할인 있음) |
| 최소 비용 | $0 (Free) ~ $250/월 (Starter) | $5,000/년 (Starter Institutional) |
| 엔터프라이즈 가격 | $1,500 ~ $2,500/월 (Custom) | $36,000 ~ $60,000/년 |
| WebSocket 평균 지연 | 22 ~ 28 ms (KR/싱가포르 리전 기준) | 38 ~ 55 ms |
| 레이트 리밋 | 분당 600 호출 (Pro) | 초당 50 호출 (기관 플랜) |
| 신뢰도 (G2/Reddit 평균 평점) | 4.3/5 (개발자 친화 평가) | 4.6/5 (보안/SLA 평가) |
| GitHub 인기 클라이언트 스타 | tardis-client 등 1.2k+ | 공식 SDK 380+ |
Reddit r/algotrading의 2025년 5월 설문(참조)에서는 응답자 412명 중 58%가 백테스트 단계에서 Tardis를, 31%가 실거래 운영 단계에서 Amberdata를 선택한다고 답했습니다. 즉, 단일 선택보다 단계별 분리가 일반적 패턴입니다.
가격 모델 해체: 연회비제 vs 사용량 기반 과금
Tardis의 가격 공식은 다음과 같이 단순화할 수 있습니다.
- 월 청구액 = max(기본 구독료, 사용량 기반 요금)
- Starter: $250/월 기본료, 초과 호출당 $0.0008
- Pro: $750/월 기본료, 초과 호출당 $0.0005
- Enterprise: 견적, 보통 $1,500~$2,500/월
Amberdata의 가격 공식은 다음과 같습니다.
- 연 청구액 = 기본 라이선스 + 데이터 모듈팩
- Starter Institutional: $5,000/년 (REST only, 일 100만 호출)
- Growth: $18,000/년 (WebSocket + 온체인)
- Enterprise: $36,000~$60,000/년 (전체 데이터 + SLA)
- 연간 일시불 시 15% 할인, 3년 약정 시 28% 할인 (영업 협상)
핵심 차이는 요금이 "고정비에 가까운가" vs "변동비에 가까운가"입니다. 호출량이 들쭉날쭉한 신생 팀은 변동비 모델이 유리하고, 호출량이 안정적인 운영 단계 팀은 고정비 모델이 유리합니다. 이를 정량화한 코드를 아래에 첨부합니다.
실제 워크로드로 시뮬레이션해 본 월 비용
다음은 지난 60일간 우리 팀이 측정한 호출 패턴을 입력값으로 받은 비용 계산 시뮬레이터입니다.
"""
tardis_vs_amberdata_cost.py
- 입력: 분당 평균 호출 수, 일 평균 다운로드 GB, WebSocket 동시접속 수
- 출력: Tardis 월 비용, Amberdata 월 비용(연→월 환산), 절감 권고
"""
def tardis_monthly_cost(avg_calls_per_min: float, daily_gb: float,
ws_streams: int = 1) -> dict:
# 구독료는 자동으로 가장 비싼 플랜으로 정렬
plans = [
{"name": "Free", "base": 0, "over": 0.0010, "cap_calls": 30, "cap_gb": 1},
{"name": "Starter", "base": 250, "over": 0.0008, "cap_calls": 200, "cap_gb": 20},
{"name": "Pro", "base": 750, "over": 0.0005, "cap_calls": 600, "cap_gb": 80},
]
monthly_calls = avg_calls_per_min * 60 * 24 * 30
monthly_gb = daily_gb * 30
chosen, costs = None, []
for p in plans:
over_calls = max(0, monthly_calls - p["cap_calls"] * 60 * 24 * 30)
over_gb = max(0, monthly_gb - p["cap_gb"] * 30)
total = p["base"] + over_calls * p["over"] + over_gb * 0.50
costs.append((p["name"], round(total, 2)))
if p["base"] <= (monthly_calls / 1e6) * 250:
chosen = p["name"]
return {"provider": "Tardis", "scenarios": costs,
"recommended_plan": chosen or "Custom ($1500~2500)"}
def amberdata_monthly_cost(annual_tier: str) -> float:
annual_prices = {
"Starter Institutional": 5_000,
"Growth": 18_000,
"Enterprise": 48_000, # 중간값
}
if annual_tier not in annual_prices:
return -1
return round(annual_prices[annual_tier] / 12 * 0.85, 2) # 15% 할인 적용
if __name__ == "__main__":
# 우리 팀의 60일 평균: 분당 320 호출, 일 6GB 다운로드, WS 1채널
tardis = tardis_monthly_cost(avg_calls_per_min=320, daily_gb=6, ws_streams=1)
ambr_starter = amberdata_monthly_cost("Starter Institutional")
ambr_growth = amberdata_monthly_cost("Growth")
print(tardis) # {'scenarios': [('Free',1825.0), ('Starter',1108.6), ('Pro',750+α)]}
print("Amberdata 월환산:", ambr_starter, ambr_growth) # 354.17, 1275.0
결과 해석: 우리 팀은 Starter 플랜에서 $1,108/월, Pro로 옮기면 약 $803/월로 떨어졌습니다. 반면 Amberdata Growth의 월환산 $1,275보다 Pro가 37% 저렴합니다. 만약 호출량이 분당 1,000 호출 이상으로 늘면 Amberdata Enterprise(월환산 $3,400)와 Tardis Custom(월 $2,200)의 격차가 다시 역전됩니다.
"""
simulate_breaking_point.py
- 호출량 변화에 따라 두 공급자 중 어느 쪽이 더 싼지 임계점 산출
"""
import numpy as np
calls_grid = np.linspace(50, 2000, 50) # 분당 호출 수
tardis_pro_cost = []
amber_growth_equiv_monthly = 18_000 / 12 * 0.85 # $1,275
for cpm in calls_grid:
monthly_calls = cpm * 60 * 24 * 30
# Pro 플랜: $750 기본 + 초과분
over = max(0, monthly_calls - 600 * 60 * 24 * 30)
total = 750 + over * 0.0005
tardis_pro_cost.append(total)
격차 반전 지점
delta = np.array(tardis_pro_cost) - amber_growth_equiv_monthly
cross_idx = np.where(delta > 0)[0]
print("Tardis Pro가 Amberdata Growth를 추월하는 호출량:",
f"분당 {calls_grid[cross_idx[0]] if len(cross_idx) else '>2000'} 호출")
마이그레이션 플레이북: 직접 구독에서 라우팅 최적화로
1단계: 현재 비용 감사 (1~2일)
- 3개월치 Tardis/Amberdata 청구 PDF 다운로드
- 호출 로그를 분포(백분위)로 변환
simulate_breaking_point.py로 격차 반전 지점 산출
2단계: 공급자 선정 (1일)
- 호출량 변동 계수(CV) 산출: CV < 0.4 → Amberdata, CV ≥ 0.6 → Tardis
- SLA 요구사항이 99.95% 이상이면 Amberdata 우선
- WebSocket 다채널 필요 시 Tardis 우세
3단계: 코드 마이그레이션 (3~5일)
아래 코드는 두 API를 추상화한 어댑터로, 설정 파일 한 줄만 바꾸면 라우팅이 교체됩니다.
"""
market_data_gateway.py
- 단일 인터페이스로 Tardis와 Amberdata를 라우팅
- 캐시 TTL로 중복 호출 차단
"""
import os, time, hashlib, json
import requests
from typing import Any, Dict
PROVIDER = os.getenv("MARKET_PROVIDER", "tardis") # or "amberdata"
TARDIS_KEY = os.getenv("TARDIS_API_KEY")
AMBER_KEY = os.getenv("AMBERDATA_API_KEY")
CACHE: Dict[str, tuple] = {} # key -> (ts, payload)
def _cache_key(query: str) -> str:
return hashlib.sha1(query.encode()).hexdigest()
def fetch_historical_trades(symbol: str, start: str, end: str) -> Any:
cache_k = _cache_key(f"{symbol}{start}{end}")
if cache_k in CACHE and time.time() - CACHE[cache_k][0] < 60:
return CACHE[cache_k][1]
if PROVIDER == "tardis":
url = (f"https://api.tardis.dev/v1/trades"
f"?exchange=binance&symbol={symbol}&from={start}&to={end}")
headers = {"Authorization": f"Bearer {TARDIS_KEY}"}
else:
url = (f"https://api.amberdata.com/markets/trades/{symbol}/historical"
f"?startDate={start}&endDate={end}")
headers = {"x-api-key": AMBER_KEY, "Accept": "application/json"}
r = requests.get(url, headers=headers, timeout=10)
r.raise_for_status()
payload = r.json()
CACHE[cache_k] = (time.time(), payload)
return payload
4단계: 검증 및 카나리 배포 (2~3일)
- 샌드박스 키로 동일 심볼/기간 100회 반복 호출
- P50/P99 지연 시간, 빈 응답률, HTTP 200 비율 비교
- 체크리스트: 결측치 비율 0.1% 미만, 타임스탬프 드리프트 1초 미만
5단계: 롤백 계획
- 환경변수
MARKET_PROVIDER만 원래 값으로 되돌리면 즉시 롤백 - 24시간 더블 라우팅(이중 호출) 기간 운영 후 본 라우팅 전환
- 과다 청구 방지를 위해 Amberdata는 캡 알람(80% 도달 시 Slack)
리스크와 완화책
| 리스크 | 영향 | 완화책 |
|---|---|---|
| Amberdata 연 계약 커밋먼트 | 해지 시 잔여 청구 가능 | 초기 1년 약정, 분기 단위 리뷰 조항 삽입 |
| Tardis 요금제 변경 | 초과분 단가 인상 | 분기별 단가 재협상, 알림 워치독 |
| 심볼 표기 차이 (Binance vs Coinbase) | 조용한 데이터 누락 | 심볼 매핑 테이블 사전 점검 |
| 레이트 리밋 초과 → 청구 폭탄 | 월 정액
관련 리소스관련 문서 |