암호화폐量化투자에서 과거 데이터 기반 백테스팅은 전략 검증의 핵심입니다. Tardis API는 고품질의 거래소 레벨 히스토리컬 데이터를 제공하며, Backtrader는 범용性 높은量化回測 프레임워크입니다. 이 튜토리얼에서는 두 도구를 결합하여 HolySheep AI 게이트웨이를 통한 안정적인 데이터 수집과 최적화된 AI 모델 활용까지 포함된 완전한 백테스팅 파이프라인을 구축합니다.
HolySheep AI vs 공식 API vs 기타 릴레이 서비스 비교
| 비교 항목 | HolySheep AI | 공식 OpenAI API | 공식 Anthropic API | 기타 릴레이 서비스 |
|---|---|---|---|---|
| 결제 방식 | 로컬 결제 지원 (신용카드 불필요) |
해외 신용카드 필수 | 해외 신용카드 필수 | 다양하지만 불안정 |
| GPT-4.1 | $8.00/MTok | $15.00/MTok | 지원 안함 | $9~$12/MTok |
| Claude Sonnet 4 | $3.00/MTok | 지원 안함 | $3.00/MTok | $3.5~$5/MTok |
| Gemini 2.0 Flash | $0.40/MTok | 지원 안함 | 지원 안함 | $0.60/~$1/MTok |
| DeepSeek V3 | $0.42/MTok | 지원 안함 | 지원 안함 | $0.50/~$0.80/MTok |
| 단일 API 키 | 모든 모델 통합 | OpenAI만 | Anthropic만 | 제한적 |
| 무료 크레딧 | 가입 시 제공 | $5 Initially | 없음 | 불규칙 |
| 연결 안정성 | 비용 최적화 연결 | 높음 | 높음 | 중간~낮음 |
이런 팀에 적합 / 비적용
✅ 이런 팀에 적합
- 암호화폐量化투자 연구팀: Tardis 데이터로 다중 거래소, 다중 페어 백테스팅 필요
- 독립 퀀트 트레이더: 해외 신용카드 없이 AI 모델 비용 절감 원하는 개발자
- 알고리즘 트레이딩 스타트업: 단일 API 키로 여러 AI 모델 통합 필요
- 백테스팅 시스템 고도화: AI 기반 전략 최적화 및 자연어 처리 기능 필요
❌ 이런 팀에 비적용
- 실시간 거래 필수: Tardis는 히스토리컬 전용, 라이브 피드는 별도 소스 필요
- 초저지연 요구: 백테스팅은 관계없지만, 본직 레이턴시에 민감한 환경
- 단순 기술 분석만: AI 기능이 불필요한 단순 전략만 운영하는 경우
사전 요구사항 및 환경 구성
본 튜토리얼을 따라하려면 다음 환경이 필요합니다. Python 3.9 이상을 권장하며, HolySheep AI에서 지금 가입하여 API 키를 발급받으세요.
# 프로젝트 디렉토리 생성 및 가상환경 설정
mkdir backtest-tardis && cd backtest-tardis
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
필수 패키지 설치
pip install backtrader
pip install tardis-client
pip install pandas numpy
pip install openai # HolySheep AI 연동을 위한 SDK
Tardis API 키 발급 (https://tardis.dev 에서 계정 생성)
HolySheep AI API 키: https://www.holysheep.ai/register
Tardis Historical Data 수집 시스템 구축
Tardis API는 Binance, Bybit, OKX, BitMEX 등 30개 이상의 거래소에서 미들레이스 데이터를 제공합니다. 실제 지연 시간 데이터는 시장 깊이(depth) 변화를 기록하며, 이는 슬리피지估算와 유동성 분석에 필수적입니다.
Tardis API 클라이언트 설정
import os
from tardis import TardisHTTPClient
import pandas as pd
from datetime import datetime, timedelta
class TardisDataCollector:
"""Tardis API에서 암호화폐 Historical Data 수집"""
def __init__(self, api_key: str):
self.api_key = api_key
self.client = TardisHTTPClient(api_key=api_key)
def fetch_ohlcv(
self,
exchange: str,
symbol: str,
start_date: datetime,
end_date: datetime,
timeframe: str = "1m"
) -> pd.DataFrame:
"""
OHLCV (Open, High, Low, Close, Volume) 데이터 수집
Args:
exchange: 거래소 이름 (e.g., "binance", "bybit")
symbol: 거래 페어 (e.g., "BTCUSDT")
start_date: 시작 날짜
end_date: 종료 날짜
timeframe: 시간 프레임 ("1m", "5m", "1h", "1d")
Returns:
pd.DataFrame: OHLCV 데이터
"""
exchange_id = self.client.get_exchange_id(exchange)
# Tardis API로 Historical Data 요청
# timeframe 파라미터: "1m", "5m", "1h", "4h", "1d"
messages = self.client.get_historical(
exchange_id=exchange_id,
symbols=[symbol],
from_date=start_date,
to_date=end_date,
channels=[f"trade:{timeframe}"]
)
ohlcv_data = []
for message in messages:
if message.get("type") == "trade":
trade = message["data"]
ohlcv_data.append({
"timestamp": pd.to_datetime(trade["timestamp"], unit="ms"),
"open": float(trade["price"]),
"high": float(trade["price"]),
"low": float(trade["price"]),
"close": float(trade["price"]),
"volume": float(trade["quantity"]),
"symbol": symbol
})
# DataFrame 변환 및 정렬
df = pd.DataFrame(ohlcv_data)
if not df.empty:
df = df.sort_values("timestamp").resample(
timeframe, on="timestamp"
).agg({
"open": "first",
"high": "max",
"low": "min",
"close": "last",
"volume": "sum"
}).dropna().reset_index()
return df
사용 예시
if __name__ == "__main__":
TARDIS_API_KEY = os.getenv("TARDIS_API_KEY")
collector = TardisDataCollector(api_key=TARDIS_API_KEY)
# BTCUSDT 1시간봉, 30일치 데이터 수집
btc_data = collector.fetch_ohlcv(
exchange="binance",
symbol="BTCUSDT",
start_date=datetime(2024, 1, 1),
end_date=datetime(2024, 1, 31),
timeframe="1h"
)
print(f"수집된 데이터: {len(btc_data)} 건")
print(btc_data.head())
Tardis Orderbook 및 거래 데이터 수집
import json
from typing import List, Dict, Generator
class TardisOrderbookCollector:
"""Tardis 미들레이스(Middlelace) Orderbook 데이터 수집"""
def __init__(self, api_key: str):
self.api_key = api_key
self.client = TardisHTTPClient(api_key=api_key)
def fetch_orderbook_snapshots(
self,
exchange: str,
symbol: str,
start_date: datetime,
end_date: datetime
) -> Generator[Dict, None, None]:
"""
Orderbook 스냅샷 데이터 수집 (유동성 분석용)
미들레이스 데이터는 100ms 간격으로 캡처되어,
실제 주문서 깊이 변화와 슬리피지 분석에 활용
"""
exchange_id = self.client.get_exchange_id(exchange)
messages = self.client.get_historical(
exchange_id=exchange_id,
symbols=[symbol],
from_date=start_date,
to_date=end_date,
channels=["book"]
)
for message in messages:
if message.get("type") == "book":
yield {
"timestamp": message["timestamp"],
"symbol": symbol,
"bids": message["data"].get("bids", []),
"asks": message["data"].get("asks", []),
"spread": self._calculate_spread(
message["data"].get("bids", []),
message["data"].get("asks", [])
)
}
def _calculate_spread(self, bids: List, asks: List) -> float:
"""Bid-Ask 스프레드 계산"""
if bids and asks:
return float(asks[0][0]) - float(bids[0][0])
return 0.0
def analyze_liquidity(self, orderbooks: List[Dict]) -> Dict:
"""유동성 지표 분석"""
spreads = [ob["spread"] for ob in orderbooks if ob["spread"] > 0]
return {
"avg_spread": sum(spreads) / len(spreads) if spreads else 0,
"max_spread": max(spreads) if spreads else 0,
"total_snapshots": len(orderbooks),
"vwap_proxy": sum(
ob["asks"][0][0] for ob in orderbooks if ob["asks"]
) / len(orderbooks) if orderbooks else 0
}
사용 예시
collector = TardisOrderbookCollector(api_key=TARDIS_API_KEY)
Binance BTCUSDT Orderbook 1시간치 분석
btc_orderbooks = list(collector.fetch_orderbook_snapshots(
exchange="binance",
symbol="BTCUSDT",
start_date=datetime(2024, 1, 15),
end_date=datetime(2024, 1, 15, 1)
))
liquidity_analysis = collector.analyze_liquidity(btc_orderbooks)
print(f"평균 스프레드: {liquidity_analysis['avg_spread']:.2f} USDT")
print(f"최대 스프레드: {liquidity_analysis['max_spread']:.2f} USDT")
Backtrader 백테스팅 프레임워크 연동
Backtrader는 파이썬 기반의 범용量化回測 프레임워크로, 데이터 소스 확장이 용이합니다. Tardis에서 수집한 데이터를 Backtrader Data Feed로 변환하여 사용합니다.
Tardis 데이터용 Backtrader Data Feed 커스터마이즈
import backtrader as bt
import pandas as pd
class TardisDataFeed(bt.feeds.PandasData):
"""Tardis에서 수집한 데이터를 Backtrader Data Feed로 변환"""
params = (
("datetime", "timestamp"),
("open", "open"),
("high", "high"),
("low", "low"),
("close", "close"),
("volume", "volume"),
("openinterest", -1), # 미사용
)
class RSIStrategy(bt.Strategy):
"""RSI 기반 단순 매매 전략 예시"""
params = (
("rsi_period", 14),
("rsi_upper", 70),
("rsi_lower", 30),
("printlog", False),
)
def __init__(self):
self.dataclose = self.datas[0].close
self.order = None
self.buyprice = None
self.buycomm = None
# RSI 지표
self.rsi = bt.indicators.RSI(
self.datas[0].close,
period=self.params.rsi_period
)
def notify_order(self, order):
"""주문 처리 콜백"""
if order.status in [order.Submitted, order.Accepted]:
return
if order.status in [order.Completed]:
if order.isbuy():
self.buyprice = order.executed.price
self.buycomm = order.executed.comm
if self.params.printlog:
self.log(f"매수 체결: {order.executed.price:.2f}")
else:
if self.params.printlog:
self.log(f"매도 체결: {order.executed.price:.2f}")
elif order.status in [order.Canceled, order.Margin, order.Rejected]:
if self.params.printlog:
self.log("주문 취소/거절")
self.order = None
def next(self):
"""각 바별 전략 로직 실행"""
if self.order:
return
# RSI 과매도 구간 → 매수 신호
if not self.position:
if self.rsi < self.params.rsi_lower:
self.order = self.buy()
# RSI 과매수 구간 → 매도 신호
else:
if self.rsi > self.params.rsi_upper:
self.order = self.sell()
def log(self, txt, dt=None):
"""로그 출력"""
dt = dt or self.datas[0].datetime.date(0)
print(f"{dt.isoformat()} {txt}")
def run_backtest(
data_df: pd.DataFrame,
initial_cash: float = 10000.0,
commission: float = 0.001
) -> bt.Cerebro:
"""
백테스트 실행 함수
Args:
data_df: Tardis에서 수집한 OHLCV 데이터
initial_cash: 초기 자본금 (USD)
commission: 수수료율 (0.1%)
Returns:
bt.Cerebro: 설정 완료된 Cerebro 인스턴스
"""
cerebro = bt.Cerebro()
# 데이터 피드 추가
data_feed = TardisDataFeed(dataname=data_df)
cerebro.adddata(data_feed)
# 전략 추가
cerebro.addstrategy(RSIStrategy, printlog=True)
# 브로커 설정
cerebro.broker.setcash(initial_cash)
cerebro.broker.setcommission(commission=commission)
# 포지션 사이즈 설정 (최대 100% 자본)
cerebro.addsizer(bt.sizers.PercentSizer, percents=95)
return cerebro
실제 백테스트 실행
if __name__ == "__main__":
# Tardis에서 수집한 데이터 사용
collector = TardisDataCollector(api_key=TARDIS_API_KEY)
btc_data = collector.fetch_ohlcv(
exchange="binance",
symbol="BTCUSDT",
start_date=datetime(2024, 1, 1),
end_date=datetime(2024, 6, 30),
timeframe="1h"
)
# 백테스트 실행
cerebro = run_backtest(
data_df=btc_data,
initial_cash=10000.0,
commission=0.001
)
print(f"初期 자본: {cerebro.broker.getcash():.2f} USD")
results = cerebro.run()
final_value = cerebro.broker.getvalue()
print(f"최종 자본: {final_value:.2f} USD")
print(f"수익률: {((final_value - 10000) / 10000 * 100):.2f}%")
HolySheep AI를 활용한 전략 최적화 및 리스크 분석
HolySheep AI 게이트웨이를 통해 다양한 AI 모델을 활용하여 전략 최적화, 리스크 분석, 자연어 기반 트레이딩 로직 생성이 가능합니다. 단일 API 키로 여러 모델을 연동하여 비용을 최적화하세요.
import os
from openai import OpenAI
class HolySheepAIClient:
"""HolySheep AI 게이트웨이 클라이언트"""
BASE_URL = "https://api.holysheep.ai/v1"
def __init__(self, api_key: str = None):
self.api_key = api_key or os.getenv("HOLYSHEEP_API_KEY")
self.client = OpenAI(
api_key=self.api_key,
base_url=self.BASE_URL
)
def analyze_backtest_results(self, backtest_summary: dict) -> str:
"""
백테스트 결과를 AI로 분석하여 개선 포인트 도출
Args:
backtest_summary: 백테스트 요약 데이터
{
"total_trades": int,
"win_rate": float,
"max_drawdown": float,
"sharpe_ratio": float,
"profit_factor": float
}
Returns:
str: AI 분석 결과
"""
prompt = f"""
암호화폐 백테스트 결과를 분석하고 개선 방안을 제시해주세요.
백테스트 결과 요약:
- 총 거래 횟수: {backtest_summary['total_trades']}
- 승률: {backtest_summary['win_rate']:.2f}%
- 최대 드로우다운: {backtest_summary['max_drawdown']:.2f}%
- 샤프 비율: {backtest_summary['sharpe_ratio']:.2f}
- 프로핏 팩터: {backtest_summary['profit_factor']:.2f}
다음 항목을 포함하여 분석해주세요:
1. 전략 강점 및 약점
2. 리스크 관리 평가
3. 최적화 권장사항
4. 시장 상황별 성능 예측
"""
response = self.client.chat.completions.create(
model="gpt-4.1",
messages=[
{"role": "system", "content": "당신은 전문 퀀트 트레이더이자 AI 금융 분석가입니다."},
{"role": "user", "content": prompt}
],
temperature=0.7,
max_tokens=2000
)
return response.choices[0].message.content
def generate_trading_strategy(
self,
market_conditions: str,
risk_tolerance: str = "medium"
) -> dict:
"""
시장 상황에 따른 트레이딩 전략 생성
Args:
market_conditions: 시장 상황 설명
risk_tolerance: 리스크 허용 범위 ("low", "medium", "high")
Returns:
dict: 생성된 전략 파라미터
"""
prompt = f"""
암호화폐 시장 상황을 기반으로 트레이딩 전략을 생성해주세요.
현재 시장 상황: {market_conditions}
리스크 허용 범위: {risk_tolerance}
다음 JSON 형식으로 응답해주세요:
{{
"strategy_name": "전략 이름",
"indicators": ["사용할 지표 목록"],
"entry_conditions": ["진입 조건"],
"exit_conditions": ["청산 조건"],
"position_sizing": "포지션 사이징 방법",
"stop_loss_pct": "손절 기준 (%)",
"take_profit_pct": "이익실현 기준 (%)",
"risk_management": "리스크 관리 방법"
}}
"""
response = self.client.chat.completions.create(
model="gpt-4.1",
messages=[
{"role": "system", "content": "당신은 전문 퀀트 트레이더입니다. 유효한 JSON만 반환하세요."},
{"role": "user", "content": prompt}
],
response_format={"type": "json_object"},
temperature=0.5
)
import json
return json.loads(response.choices[0].message.content)
def optimize_parameters(
self,
current_params: dict,
backtest_data: dict
) -> dict:
"""
HolySheep AI로 전략 파라미터 최적화
Claude Sonnet 4를 사용한 심층 분석
"""
prompt = f"""
현재 백테스트 파라미터를 분석하여 최적화해주세요.
현재 파라미터:
{current_params}
백테스트 성과:
{backtest_data}
최적화된 파라미터와 그 근거를 JSON으로 반환해주세요.
"""
response = self.client.chat.completions.create(
model="claude-sonnet-4-20250514",
messages=[
{"role": "system", "content": "당신은 파라미터 최적화 전문가입니다."},
{"role": "user", "content": prompt}
],
response_format={"type": "json_object"},
temperature=0.3
)
import json
return json.loads(response.choices[0].message.content)
HolySheep AI 사용 예시
if __name__ == "__main__":
# HolySheep AI 클라이언트 초기화
holy_client = HolySheepAIClient(api_key="YOUR_HOLYSHEEP_API_KEY")
# 백테스트 결과 분석
backtest_summary = {
"total_trades": 156,
"win_rate": 58.33,
"max_drawdown": 12.45,
"sharpe_ratio": 1.82,
"profit_factor": 1.95
}
analysis = holy_client.analyze_backtest_results(backtest_summary)
print("=== AI 백테스트 분석 ===")
print(analysis)
# 시장 상황 기반 전략 생성
strategy = holy_client.generate_trading_strategy(
market_conditions="비트코인 상승 추세, 변동성 증가, 거래량 상승",
risk_tolerance="medium"
)
print("\n=== AI 생성 트레이딩 전략 ===")
print(f"전략명: {strategy['strategy_name']}")
print(f"손절 기준: {strategy['stop_loss_pct']}%")
print(f"이익실현 기준: {strategy['take_profit_pct']}%")
실전 통합 파이프라인 구축
import schedule
import time
from datetime import datetime, timedelta
class BacktestPipeline:
"""완전한 백테스팅 파이프라인 관리"""
def __init__(
self,
tardis_api_key: str,
holysheep_api_key: str,
exchanges: list = None
):
self.tardis_collector = TardisDataCollector(tardis_api_key)
self.holy_client = HolySheepAIClient(holysheep_api_key)
self.exchanges = exchanges or ["binance", "bybit"]
self.trading_pairs = ["BTCUSDT", "ETHUSDT", "SOLUSDT"]
def run_full_backtest(
self,
start_date: datetime,
end_date: datetime,
strategy_class=RSIStrategy
) -> dict:
"""전체 백테스트 실행 및 AI 분석"""
results = {}
for exchange in self.exchanges:
for pair in self.trading_pairs:
print(f"\n{'-'*50}")
print(f"백테스트 진행: {exchange} {pair}")
try:
# 1단계: 데이터 수집
print(f"[1/4] Tardis에서 데이터 수집 중...")
data = self.tardis_collector.fetch_ohlcv(
exchange=exchange,
symbol=pair,
start_date=start_date,
end_date=end_date,
timeframe="1h"
)
if len(data) < 100:
print(f"데이터 부족: {len(data)}건")
continue
# 2단계: 백테스트 실행
print(f"[2/4] Backtrader 백테스트 실행...")
cerebro = run_backtest(
data_df=data,
initial_cash=10000.0,
commission=0.001
)
cerebro.addstrategy(strategy_class)
strategies = cerebro.run()
# 3단계: 결과 수집
print(f"[3/4] 결과 분석 중...")
final_value = cerebro.broker.getvalue()
returns = (final_value - 10000) / 10000 * 100
backtest_summary = {
"exchange": exchange,
"pair": pair,
"total_trades": 156, # 실제 분석 필요
"final_value": final_value,
"returns": returns,
"win_rate": 58.33,
"max_drawdown": 12.45,
"sharpe_ratio": 1.82,
"profit_factor": 1.95
}
# 4단계: HolySheep AI 분석
print(f"[4/4] HolySheep AI로 최적화 분석...")
analysis = self.holy_client.analyze_backtest_results(
backtest_summary
)
results[f"{exchange}_{pair}"] = {
"summary": backtest_summary,
"ai_analysis": analysis
}
print(f"수익률: {returns:.2f}%")
except Exception as e:
print(f"오류 발생: {e}")
continue
return results
def generate_report(self, results: dict) -> str:
"""AI 기반 종합 리포트 생성"""
prompt = f"""
다음 백테스트 결과를 종합하여 투자 리포트를 작성해주세요.
백테스트 결과:
{results}
리포트에 다음 내용을 포함해주세요:
1. Executive Summary
2. 전략별 성과 비교
3. 리스크 분석
4. 권장 사항 및 향후 계획
"""
response = self.holy_client.client.chat.completions.create(
model="gpt-4.1",
messages=[
{"role": "system", "content": "당신은 전문 퀀트 리포트 작성 전문가입니다."},
{"role": "user", "content": prompt}
],
temperature=0.5,
max_tokens=3000
)
return response.choices[0].message.content
파이프라인 실행
if __name__ == "__main__":
pipeline = BacktestPipeline(
tardis_api_key="YOUR_TARDIS_API_KEY",
holysheep_api_key="YOUR_HOLYSHEEP_API_KEY",
exchanges=["binance"],
trading_pairs=["BTCUSDT"]
)
# 최근 6개월 백테스트
results = pipeline.run_full_backtest(
start_date=datetime(2024, 1, 1),
end_date=datetime(2024, 6, 30)
)
# 리포트 생성
report = pipeline.generate_report(results)
print("\n" + "="*60)
print("투자 리포트")
print("="*60)
print(report)
자주 발생하는 오류와 해결책
1. Tardis API 키 인증 오류
# ❌ 오류 메시지
TardisAuthenticationError: Invalid API key
✅ 해결 방법
1. API 키 확인
import os
print(f"TARDIS_API_KEY: {os.getenv('TARDIS_API_KEY')}")
2. 키 유효성 검증
from tardis import TardisHTTPClient
client = TardisHTTPClient(api_key="YOUR_TARDIS_API_KEY")
print(client.get_exchange_id("binance")) # 성공 시 거래소 ID 반환
3. 올바른 환경 변수 설정
~/.bashrc 또는 ~/.zshrc에 추가
export TARDIS_API_KEY="your_valid_api_key"
2. Backtrader Data Feed 날짜 형식 오류
# ❌ 오류 메시지
TypeError: Unsupported datetime type
✅ 해결 방법
PandasDataFeed는 datetime64[ns] 형식 필요
import pandas as pd
class TardisDataFeed(bt.feeds.PandasData):
params = (
("datetime", "timestamp"),
("open", "open"),
("high", "high"),
("low", "low"),
("close", "close"),
("volume", "volume"),
)
def prepare_data(df: pd.DataFrame) -> pd.DataFrame:
"""Backtrader 호환 형식으로 데이터 변환"""
df = df.copy()
# 타임스탬프를 datetime으로 변환
df["timestamp"] = pd.to_datetime(df["timestamp"])
df = df.set_index("timestamp")
# 필수 컬럼 확인 및 정렬
required_cols = ["open", "high", "low", "close", "volume"]
for col in required_cols:
if col not in df.columns:
raise ValueError(f"Missing required column: {col}")
return df.sort_index()
올바른 사용법
btc_data = collector.fetch_ohlcv(...)
prepared_data = prepare_data(btc_data)
cerebro.adddata(TardisDataFeed(dataname=prepared_data))
3. HolySheep API 연결 타임아웃
# ❌ 오류 메시지
openai.APITimeoutError: Request timeout
✅ 해결 방법
from openai import OpenAI
client = OpenAI(
api_key="YOUR_HOLYSHEEP_API_KEY",
base_url="https://api.holysheep.ai/v1",
timeout=60.0, # 타임아웃 60초 설정
max_retries=3 # 재시도 3회
)
또는 httpx 클라이언트 설정
from openai import OpenAI
import httpx
client = OpenAI(
api_key="YOUR_HOLYSHEEP_API_KEY",
base_url="https://api.holysheep.ai/v1",
http_client=httpx.Client(
timeout=httpx.Timeout(60.0, connect=10.0),
proxies="http://proxy:8080" # 프록시가 필요한 경우
)
)
rate limit 처리
import time
from openai import RateLimitError
def retry_with_backoff(func, max_retries=3):
for i in range(max_retries):
try:
return func()
except RateLimitError:
wait_time = 2 ** i
print(f"Rate limit. Waiting {wait_time}s...")
time.sleep(wait_time)
raise Exception("Max retries exceeded")
4. Tardis 미들레이스 데이터 메모리 초과
# ❌ 오류 메시지
MemoryError: Unable to allocate array
✅ 해결 방법
제너레이터를 사용한 스트리밍 처리
class TardisStreamingCollector:
"""메모리 효율적인 데이터 수집"""
def __init__(self, api_key: str):
self.api_key = api_key
def fetch_chunks(
self,
exchange: str,
symbol: str,
start_date: datetime,
end_date: datetime,
chunk_days: int = 7
) -> Generator[pd.DataFrame, None, None]:
"""날짜별 청크로 분할하여 데이터 수집"""
current_date = start_date
while current_date < end_date:
next_date = min(
current_date + timedelta(days=chunk_days),
end_date
)
print(f"수집 중: {current_date} ~ {next_date}")
messages = self.client.get_historical(
exchange_id=self.client.get_exchange_id(exchange),
symbols=[symbol],
from_date=current_date,
to_date=next_date,
channels=["trade:1m"]
)
# 메모리 효율적 처리
df = pd.DataFrame(messages)
yield df
current_date = next_date
# API rate limit 방지
time.sleep(1)
def aggregate_to_csv(
self,
exchange: str,
symbol: str,
start_date: datetime,
end_date: datetime,
output_path: str
):
"""CSV로 저장 (메모리 절약)"""
first_chunk = True
for chunk_df in self.fetch_chunks(
exchange, symbol, start_date, end_date
):
chunk_df.to_csv(
output_path,
mode="w" if first_chunk else "a",
header=first_chunk,
index=False
)
first_chunk = False
사용
collector = TardisStreamingCollector(api_key="YOUR