암호화폐量化交易에서 가장 중요한 것은 신뢰할 수 있는历史데이터와 안정적인 모델 추론을 결합하는 것입니다. 저는 최근 Bybit의 历史逐笔成交데이터를 활용하여 Python 기반 回测시스템을 구축하면서 HolySheep AI를 통합하여 비용을 최적화한 경험을 공유하려 합니다.
Bybit 历史逐笔成交데이터란?
逐笔成交(Trade Tick)은 거래소에서 체결되는 모든 개별 거래를 의미합니다. Unlike K线数据,逐笔数据는 거래의 정확한 시간、가격、량、买方/卖方等信息를 포함하여 高频交易策略开发에 필수적입니다.
Bybit Public Trade API 특징
- 실시간 거래 데이터: WebSocket을 통한 실시간 체결 데이터
- 과거 데이터 조회: REST API로 历史거래 조회 가능
- 고빈도 업데이트: 활발한 거래_pair의 경우 초당 수십 개의 tick 발생
- 비용 무료: Public API이므로 별도 비용 없음
프로젝트 구조와 환경 설정
저는 이 튜토리얼을 위해 다음과 같은 프로젝트 구조를 사용합니다:
bybit_backtest/
├── config/
│ └── settings.py # API 키 및 설정
├── data/
│ ├── raw/ # 원시 tick 데이터
│ └── processed/ # 가공된 데이터
├── src/
│ ├── data_fetcher.py # Bybit 데이터 수집
│ ├── data_processor.py # 데이터 전처리
│ ├── backtest_engine.py # 백테스트 엔진
│ └── signal_generator.py # 거래 신호 생성
├── models/
│ └── strategy.py # 거래 전략
├── main.py # 메인 실행 파일
└── requirements.txt
필수 패키지 설치
pip install pandas numpy requests websockets-client asyncio
pip install ta-lib # 기술적 지표 (설치 실패 시 생략 가능)
pip install holy-sdk # HolySheep AI SDK (선택사항)
Bybit API 데이터 수집 모듈
저는 Bybit의 Public API를 사용하여 历史逐笔成交데이터를 수집합니다. Bybit은 별도 API 키 없이 Public 엔드포인트를 제공합니다.
import requests
import pandas as pd
import time
from datetime import datetime, timedelta
from typing import List, Dict, Optional
import json
from pathlib import Path
class BybitTradeDataFetcher:
"""
Bybit Public Trade API에서 历史逐笔成交데이터를 수집하는 클래스
Bybit Public API 문서: https://bybit-exchange.github.io/docs/v5/public/trade
"""
BASE_URL = "https://api.bybit.com"
def __init__(self, category: str = "spot", limit: int = 1000):
"""
Args:
category: "spot", "linear", "inverse", "option"
limit: 한번 요청당 최대 데이터 수 (최대 1000)
"""
self.category = category
self.limit = min(limit, 1000) # API 제한
def get_recent_trades(self, symbol: str) -> pd.DataFrame:
"""
최근 체결 데이터를 조회합니다 (과거 1시간 이내)
Args:
symbol: 거래_pair (예: "BTCUSDT")
Returns:
DataFrame with columns: trade_time, symbol, price, size, side
"""
endpoint = "/v5/market/recent-trade"
params = {
"category": self.category,
"symbol": symbol,
"limit": self.limit
}
try:
response = requests.get(
f"{self.BASE_URL}{endpoint}",
params=params,
timeout=10
)
response.raise_for_status()
data = response.json()
if data.get("retCode") == 0:
trades = data.get("result", {}).get("list", [])
return self._parse_trades(trades)
else:
print(f"API 오류: {data.get('retMsg')}")
return pd.DataFrame()
except requests.exceptions.RequestException as e:
print(f"네트워크 오류: {e}")
return pd.DataFrame()
def get_historical_trades(
self,
symbol: str,
start_time: Optional[int] = None,
end_time: Optional[int] = None,
days_back: int = 7
) -> pd.DataFrame:
"""
과거 指定时间段의 체결 데이터를 조회합니다
Args:
symbol: 거래_pair
start_time: 시작 시간 (밀리초 타임스탬프)
end_time: 종료 시간 (밀리초 타임스탬프)
days_back: 며칠 전부터 조회할지 (start_time 미지정 시)
Returns:
Historical trade DataFrame
"""
# 시간 설정
if end_time is None:
end_time = int(datetime.now().timestamp() * 1000)
if start_time is None:
start_time = int(
(datetime.now() - timedelta(days=days_back)).timestamp() * 1000
)
all_trades = []
current_start = start_time
print(f"데이터 수집 시작: {datetime.fromtimestamp(start_time/1000)}")
print(f"종료: {datetime.fromtimestamp(end_time/1000)}")
while current_start < end_time:
params = {
"category": self.category,
"symbol": symbol,
"startTime": current_start,
"endTime": end_time,
"limit": self.limit
}
try:
response = requests.get(
f"{self.BASE_URL}/v5/market/recent-trade",
params=params,
timeout=10
)
response.raise_for_status()
data = response.json()
if data.get("retCode") == 0:
trades = data.get("result", {}).get("list", [])
if not trades:
break
all_trades.extend(trades)
# 다음 페이지: 마지막 거래 시간 이후부터 조회
current_start = int(trades[-1]["T"]) + 1
print(f"수집 완료: {len(all_trades)}건")
# Rate limit 방지
time.sleep(0.1)
else:
print(f"API 오류: {data.get('retMsg')}")
break
except Exception as e:
print(f"오류 발생: {e}")
time.sleep(1)
return self._parse_trades(all_trades)
def _parse_trades(self, trades: List[Dict]) -> pd.DataFrame:
"""
API 응답 데이터를 DataFrame으로 변환
"""
if not trades:
return pd.DataFrame()
df = pd.DataFrame(trades)
# 필요한 컬럼만 선택
df = df[['T', 's', 'p', 'v', 'S']].copy()
df.columns = ['trade_time_ms', 'symbol', 'price', 'volume', 'side']
# 데이터 타입 변환
df['trade_time_ms'] = df['trade_time_ms'].astype(int)
df['trade_time'] = pd.to_datetime(df['trade_time_ms'], unit='ms')
df['price'] = df['price'].astype(float)
df['volume'] = df['volume'].astype(float)
# 매수/매도 방향 정리
df['side'] = df['side'].map({'Buy': 'BUY', 'Sell': 'SELL'})
# 시간순 정렬
df = df.sort_values('trade_time_ms').reset_index(drop=True)
return df
def save_to_csv(self, df: pd.DataFrame, filename: str, data_dir: str = "./data/raw"):
"""
수집된 데이터를 CSV로 저장
"""
Path(data_dir).mkdir(parents=True, exist_ok=True)
filepath = Path(data_dir) / filename
df.to_csv(filepath, index=False)
print(f"저장 완료: {filepath}")
return filepath
사용 예시
if __name__ == "__main__":
fetcher = BybitTradeDataFetcher(category="spot", limit=1000)
# 최근 거래 조회
df = fetcher.get_recent_trades("BTCUSDT")
print(df.head())
print(f"총 {len(df)}건 수집")
# 과거 데이터 조회 (과거 3일)
# df_hist = fetcher.get_historical_trades("BTCUSDT", days_back=3)
# fetcher.save_to_csv(df_hist, "btcusdt_trades_3days.csv")
데이터 전처리 및 특성 생성
원시 tick 데이터를 백테스트에 적합한 형태로 가공합니다. 저는 OHLCV 규격화、流动性分析、VWAP 계산 등을 수행합니다.
import pandas as pd
import numpy as np
from typing import Tuple
from dataclasses import dataclass
@dataclass
class TickData:
"""Tick 데이터 컨테이너"""
timestamp: pd.Series
price: pd.Series
volume: pd.Series
side: pd.Series
@dataclass
class OHLCVData:
"""OHLCV 데이터 컨테이너"""
timestamp: pd.Series
open: pd.Series
high: pd.Series
low: pd.Series
close: pd.Series
volume: pd.Series
class TradeDataProcessor:
"""
Bybit에서 수집한 Tick 데이터를 전처리하고
백테스트에 필요한 various features를 생성합니다
"""
def __init__(self, tick_size: float = 0.1):
"""
Args:
tick_size: 해당 거래_pair의 최소 가격 단위
"""
self.tick_size = tick_size
def resample_to_ohlcv(
self,
df: pd.DataFrame,
timeframe: str = "1T"
) -> pd.DataFrame:
"""
Tick 데이터를 指定 timeframe의 OHLCV로 리샘플링
Args:
df: BybitTradeDataFetcher에서 받은 DataFrame
timeframe: Pandas offset string (1T=1분, 5T=5분, 1H=1시간)
Returns:
OHLCV DataFrame
"""
df = df.set_index('trade_time')
ohlcv = pd.DataFrame()
ohlcv['open'] = df['price'].resample(timeframe).first()
ohlcv['high'] = df['price'].resample(timeframe).max()
ohlcv['low'] = df['price'].resample(timeframe).min()
ohlcv['close'] = df['price'].resample(timeframe).last()
ohlcv['volume'] = df['volume'].resample(timeframe).sum()
# 거래 수统计
ohlcv['trade_count'] = df['price'].resample(timeframe).count()
# 매수/매도 거래량 분리
buy_volume = df[df['side'] == 'BUY']['volume'].resample(timeframe).sum()
sell_volume = df[df['side'] == 'SELL']['volume'].resample(timeframe).sum()
ohlcv['buy_volume'] = buy_volume.fillna(0)
ohlcv['sell_volume'] = sell_volume.fillna(0)
# VWAP (Volume Weighted Average Price)
df['pv'] = df['price'] * df['volume']
pvv = df['pv'].resample(timeframe).sum()
vol = df['volume'].resample(timeframe).sum()
ohlcv['vwap'] = (pvv / vol).fillna(method='ffill')
# 결측치 제거
ohlcv = ohlcv.dropna()
return ohlcv.reset_index()
def add_technical_indicators(self, df: pd.DataFrame) -> pd.DataFrame:
"""
기술적 지표를 추가합니다
Args:
df: OHLCV DataFrame
Returns:
기술적 지표가 추가된 DataFrame
"""
# 이동평균선
for period in [5, 10, 20, 50]:
df[f'sma_{period}'] = df['close'].rolling(window=period).mean()
# 지수이동평균선
for period in [12, 26]:
df[f'ema_{period}'] = df['close'].ewm(span=period).mean()
# MACD
ema_12 = df['close'].ewm(span=12).mean()
ema_26 = df['close'].ewm(span=26).mean()
df['macd'] = ema_12 - ema_26
df['macd_signal'] = df['macd'].ewm(span=9).mean()
df['macd_hist'] = df['macd'] - df['macd_signal']
# RSI
delta = df['close'].diff()
gain = (delta.where(delta > 0, 0)).rolling(window=14).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean()
rs = gain / loss
df['rsi'] = 100 - (100 / (1 + rs))
# 볼린저 밴드
bb_period = 20
bb_std = df['close'].rolling(window=bb_period).std()
df['bb_middle'] = df['close'].rolling(window=bb_period).mean()
df['bb_upper'] = df['bb_middle'] + (bb_std * 2)
df['bb_lower'] = df['bb_middle'] - (bb_std * 2)
# 거래량 지표
df['volume_sma_20'] = df['volume'].rolling(window=20).mean()
df['volume_ratio'] = df['volume'] / df['volume_sma_20']
# 변동성
df['atr'] = self._calculate_atr(df, period=14)
return df
def _calculate_atr(self, df: pd.DataFrame, period: int = 14) -> pd.Series:
"""Average True Range 계산"""
high = df['high']
low = df['low']
prev_close = df['close'].shift(1)
tr1 = high - low
tr2 = abs(high - prev_close)
tr3 = abs(low - prev_close)
tr = pd.concat([tr1, tr2, tr3], axis=1).max(axis=1)
atr = tr.rolling(window=period).mean()
return atr
def calculate_micro_features(self, df: pd.DataFrame) -> pd.DataFrame:
"""
Tick 레벨의 미세 특성 계산
Args:
df: Tick DataFrame (trade_time, price, volume, side 포함)
Returns:
Tick 레벨 특성 포함된 DataFrame
"""
df = df.copy()
# 가격 변화
df['price_change'] = df['price'].diff()
df['price_change_pct'] = df['price'].pct_change() * 100
# 거래 강도 (Trade Intensity)
df['volume_ma'] = df['volume'].rolling(window=100).mean()
df['volume_zscore'] = (df['volume'] - df['volume_ma']) / df['volume'].std()
# BUY/SELL 비율
df['is_buy'] = (df['side'] == 'BUY').astype(int)
df['is_sell'] = (df['side'] == 'SELL').astype(int)
df['buy_ratio'] = df['is_buy'].rolling(window=100).mean()
# Delta (순매수压力)
df['delta'] = np.where(df['side'] == 'BUY', df['volume'], -df['volume'])
df['cumulative_delta'] = df['delta'].cumsum()
# 거래 간 시간 간격
df['time_diff'] = df['trade_time'].diff().dt.total_seconds()
return df
def prepare_backtest_data(
self,
tick_df: pd.DataFrame,
timeframes: list = ["1T", "5T", "15T"]
) -> dict:
"""
여러 timeframe의 데이터를 한번에 준비
Returns:
dict: {timeframe: ohlcv_dataframe}
"""
result = {}
for tf in timeframes:
ohlcv = self.resample_to_ohlcv(tick_df, timeframe=tf)
ohlcv = self.add_technical_indicators(ohlcv)
result[tf] = ohlcv
return result
사용 예시
if __name__ == "__main__":
# Tick 데이터 로드
tick_df = pd.read_csv("./data/raw/btcusdt_trades_3days.csv")
tick_df['trade_time'] = pd.to_datetime(tick_df['trade_time'])
processor = TradeDataProcessor()
# OHLCV 변환
ohlcv = processor.resample_to_ohlcv(tick_df, timeframe="5T")
print("OHLCV 데이터 샘플:")
print(ohlcv.head())
# 기술적 지표 추가
ohlcv_with_indicators = processor.add_technical_indicators(ohlcv)
print("\n기술적 지표 포함 데이터:")
print(ohlcv_with_indicators[['trade_time', 'close', 'sma_20', 'rsi', 'macd']].tail())
AI 기반 거래 신호 생성 - HolySheep AI 통합
이제 HolySheep AI를 사용하여 시장 데이터를 분석하고 거래 신호를 생성하는 모듈을 구축합니다. 저는 HolySheep AI를 선택한 이유 중 하나가 복합 모델 통합과 비용 효율성입니다.
월 1,000만 토큰 기준 비용 비교표
| 모델 | 입력 비용 ($/MTok) | 출력 비용 ($/MTok) | 월 1,000만 토큰 (입력+출력 균형) |
월 총 비용 |
|---|---|---|---|---|
| GPT-4.1 | $2.00 | $8.00 | 500만 입력 + 500만 출력 | $2,500 |
| Claude Sonnet 4.5 | $3.00 | $15.00 | 500만 입력 + 500만 출력 | $4,500 |
| Gemini 2.5 Flash | $0.30 | $2.50 | 500만 입력 + 500만 출력 | $700 |
| DeepSeek V3.2 | $0.10 | $0.42 | 500만 입력 + 500만 출력 | $130 |
| HolySheep AI (복합 모델) |
최적화 적용 | 최적화 적용 | DeepSeek 주력 + Gemini 보조 | $130~$500 |
* 실제 비용은 사용 패턴에 따라 달라질 수 있습니다. HolySheep AI는 자동 라우팅을 통해 비용을 최적화합니다.
HolySheep AI 통합 거래 신호 생성기
import os
import requests
import json
from typing import List, Dict, Optional
from dataclasses import dataclass
from datetime import datetime
import pandas as pd
@dataclass
class TradingSignal:
"""거래 신호 데이터 클래스"""
timestamp: datetime
symbol: str
action: str # "BUY", "SELL", "HOLD"
confidence: float # 0.0 ~ 1.0
reasoning: str
model_used: str
class HolySheepAIClient:
"""
HolySheep AI API를 사용하여 AI 기반 거래 분석을 수행하는 클라이언트
HolySheep AI 공식 문서: https://docs.holysheep.ai
"""
def __init__(self, api_key: str):
"""
Args:
api_key: HolySheep AI API 키
"""
self.api_key = api_key
# ✅ HolySheep AI 전용 엔드포인트 사용
self.base_url = "https://api.holysheep.ai/v1"
self.headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
def analyze_market_with_deepseek(
self,
market_data: Dict,
symbol: str = "BTCUSDT"
) -> Dict:
"""
DeepSeek V3.2 모델을 사용하여 시장 분석 수행
DeepSeek는 비용 효율적이며 복잡한 reasoning에 적합
Args:
market_data: 시장 데이터 딕셔너리
symbol: 거래_pair
Returns:
분석 결과 딕셔너리
"""
# 프롬프트 구성
prompt = self._build_analysis_prompt(market_data, symbol)
payload = {
"model": "deepseek-chat", # DeepSeek V3.2
"messages": [
{
"role": "system",
"content": "당신은 전문 암호화폐 트레이더입니다. 주어진 시장 데이터를 분석하고 명확한 거래 신호를 제공합니다."
},
{
"role": "user",
"content": prompt
}
],
"temperature": 0.3, # 일관된 분석을 위해 낮춤
"max_tokens": 500
}
try:
response = requests.post(
f"{self.base_url}/chat/completions",
headers=self.headers,
json=payload,
timeout=30
)
response.raise_for_status()
result = response.json()
return {
"success": True,
"content": result["choices"][0]["message"]["content"],
"model": "DeepSeek V3.2",
"usage": result.get("usage", {})
}
except requests.exceptions.RequestException as e:
return {
"success": False,
"error": str(e),
"model": "DeepSeek V3.2"
}
def analyze_market_with_gemini(
self,
market_data: Dict,
symbol: str = "BTCUSDT"
) -> Dict:
"""
Gemini 2.5 Flash 모델을 사용하여 빠른 시장 분석 수행
고빈도 전략에 적합
Args:
market_data: 시장 데이터 딕셔너리
symbol: 거래_pair
Returns:
분석 결과 딕셔너리
"""
prompt = self._build_analysis_prompt(market_data, symbol)
payload = {
"model": "gemini-2.0-flash", # Gemini 2.5 Flash
"messages": [
{
"role": "user",
"content": f"{prompt}\n\n간결하게 3줄 이내로 분석해 주세요."
}
],
"temperature": 0.2,
"max_tokens": 200
}
try:
response = requests.post(
f"{self.base_url}/chat/completions",
headers=self.headers,
json=payload,
timeout=15
)
response.raise_for_status()
result = response.json()
return {
"success": True,
"content": result["choices"][0]["message"]["content"],
"model": "Gemini 2.5 Flash",
"usage": result.get("usage", {})
}
except requests.exceptions.RequestException as e:
return {
"success": False,
"error": str(e),
"model": "Gemini 2.5 Flash"
}
def _build_analysis_prompt(self, market_data: Dict, symbol: str) -> str:
"""분석용 프롬프트 구성"""
price_info = market_data.get("price", {})
volume_info = market_data.get("volume", {})
indicator_info = market_data.get("indicators", {})
prompt = f"""
{symbol} 시장 분석 요청:
【현재가】
- 현재가: ${price_info.get('current', 'N/A')}
- 오늘 HIGH: ${price_info.get('high', 'N/A')}
- 오늘 LOW: ${price_info.get('low', 'N/A')}
- 전일 종가: ${price_info.get('prev_close', 'N/A')}
【거래량】
- 24h 거래량: {volume_info.get('24h_volume', 'N/A')}
- 거래량 SMA20 대비: {volume_info.get('volume_ratio', 'N/A')}x
【기술적 지표】
- SMA20: ${indicator_info.get('sma_20', 'N/A')}
- RSI(14): {indicator_info.get('rsi', 'N/A')}
- MACD: {indicator_info.get('macd', 'N/A')}
- MACD Signal: {indicator_info.get('macd_signal', 'N/A')}
- 볼린저 상단: ${indicator_info.get('bb_upper', 'N/A')}
- 볼린저 하단: ${indicator_info.get('bb_lower', 'N/A')}
위 데이터를 바탕으로:
1. 현재 시장トレンド判断 (상승/하락/횡보)
2. 적절한 거래 신호 (BUY/SELL/HOLD)
3. 신뢰도 (0~100%)
4. 주요 이유
JSON 형식으로 답변해 주세요.
"""
return prompt
def parse_signal_from_response(self, response: str) -> Dict:
"""AI 응답에서 거래 신호 파싱"""
try:
# JSON 형식 파싱 시도
if "```json" in response:
response = response.split("``json")[1].split("``")[0]
elif "```" in response:
response = response.split("``")[1].split("``")[0]
signal_data = json.loads(response)
return {
"action": signal_data.get("signal", "HOLD"),
"confidence": signal_data.get("confidence", 0) / 100,
"reasoning": signal_data.get("reasoning", ""),
"trend": signal_data.get("trend", "UNKNOWN")
}
except:
# JSON 파싱 실패 시 텍스트 분석
response_lower = response.lower()
if "buy" in response_lower and response_lower.count("buy") > response_lower.count("sell"):
return {"action": "BUY", "confidence": 0.6, "reasoning": response[:200]}
elif "sell" in response_lower:
return {"action": "SELL", "confidence": 0.6, "reasoning": response[:200]}
return {"action": "HOLD", "confidence": 0.5, "reasoning": response[:200]}
class SignalGenerator:
"""
AI 기반 거래 신호 생성기
HolySheep AI를 활용하여 시장 데이터를 분석하고 거래 신호를 생성
"""
def __init__(self, api_key: str, use_model: str = "auto"):
"""
Args:
api_key: HolySheep AI API 키
use_model: 사용할 모델 ("deepseek", "gemini", "auto")
"""
self.holysheep = HolySheepAIClient(api_key)
self.use_model = use_model
def generate_signal(
self,
ohlcv_data: pd.DataFrame,
symbol: str = "BTCUSDT"
) -> TradingSignal:
"""
OHLCV 데이터에서 거래 신호 생성
Args:
ohlcv_data: 현재 OHLCV 데이터 (가장 최근 행)
symbol: 거래_pair
Returns:
TradingSignal 객체
"""
# market_data 구성
latest = ohlcv_data.iloc[-1]
market_data = {
"price": {
"current": latest.get("close"),
"high": latest.get("high"),
"low": latest.get("low"),
"open": latest.get("open"),
"prev_close": ohlcv_data.iloc[-2].get("close") if len(ohlcv_data) > 1 else None
},
"volume": {
"24h_volume": ohlcv_data["volume"].sum(),
"volume_ratio": latest.get("volume_ratio", 1.0)
},
"indicators": {
"sma_20": latest.get("sma_20"),
"rsi": latest.get("rsi"),
"macd": latest.get("macd"),
"macd_signal": latest.get("macd_signal"),
"bb_upper": latest.get("bb_upper"),
"bb_lower": latest.get("bb_lower"),
"atr": latest.get("atr")
}
}
# 모델 선택
if self.use_model == "auto":
# 빈번한 분석에는 Gemini, 중요 결정에는 DeepSeek
response = self.holysheep.analyze_market_with_deepseek(
market_data, symbol
)
elif self.use_model == "gemini":
response = self.holysheep.analyze_market_with_gemini(
market_data, symbol
)
else:
response = self.holysheep.analyze_market_with_deepseek(
market_data, symbol
)
if response["success"]:
parsed = self.holysheep.parse_signal_from_response(
response["content"]
)
return TradingSignal(
timestamp=datetime.now(),
symbol=symbol,
action=parsed["action"],
confidence=parsed["confidence"],
reasoning=parsed["reasoning"],
model_used=response["model"]
)
else:
return TradingSignal(
timestamp=datetime.now(),
symbol=symbol,
action="HOLD",
confidence=0.0,
reasoning=f"API 오류: {response.get('error')}",
model_used="NONE"
)
사용 예시
if __name__ == "__main__":
# HolySheep AI API 키 설정
# 👉 https://www.holysheep.ai/register 에서 무료 크레딧 포함 가입
API_KEY = "YOUR_HOLYSHEEP_API_KEY" # HolySheep AI 키로 교체
if API_KEY == "YOUR_HOLYSHEEP_API_KEY":
print("⚠️ HolySheep AI API 키를 설정해 주세요!")
print("👉 https://www.holysheep.ai/register")
else:
generator = SignalGenerator(API_KEY, use_model="auto")
# 예시 OHLCV 데이터
sample_ohlcv = pd.DataFrame({
"close": [67450, 67520, 67580, 67610, 67650],
"high": [67580, 67650, 67720, 67780, 67800],
"low": [67320, 67400, 67450, 67500, 67550],
"open": [67450, 67450, 67520, 67580, 67610],
"volume": [1250, 1380, 1520, 1680, 1750],
"sma_20": [67350, 67380, 67420, 67460, 67500],
"rsi": [58.5, 59.2, 60.1, 60.8, 61.3],
"macd": [45.2, 52.3, 58.1, 62.4, 68.2],
"macd_signal": [42.1, 44.5, 47.3, 50.4, 54.1],
"volume_ratio": [0.95, 1.05, 1.15, 1.28, 1.33],
"bb_upper": [67950, 67980, 68020, 68080, 68150],
"bb_lower": [66750, 66780, 66820, 66850, 66900],
"atr": [285, 290, 295, 298, 302]
})
signal = generator.generate_signal(sample_ohlcv, "BTCUSDT")
print(f"\n📊 거래 신호 생성 결과")
print(f"시간: {signal.timestamp}")
print(f"종목: {signal.symbol}")
print(f"신호: {signal.action}")
print(f"신뢰도: {signal.confidence:.1%}")
print(f"모델: {signal.model_used}")
print(f"분석: {signal.reasoning[:100]}...")
백테스트 엔진 구현
import pandas as pd
import numpy as np
from typing import List, Dict, Optional, Tuple
from dataclasses import dataclass, field
from datetime import datetime, timedelta
from enum import Enum
class OrderType(Enum):
MARKET = "MARKET"
LIMIT = "LIMIT"
@dataclass
class Order:
"""주문