저는 3년 동안 암호화폐 거래소 API를 활용한 고빈도 거래 시스템을 개발하면서 시장 microstructure의 복잡성에 매일頭を悩ませて왔습니다. 주문서(Order Book)의 미세한 변화가 가격 움직임을 예측하는 핵심 단서가 되는 순간, 저는 HolySheep AI의 Claude Sonnet을 통해 실시간 시장 microstructure 분석 파이프라인을 구축했습니다.
이 튜토리얼에서는 암호화폐 시장 microstructure의 핵심 개념인 주문서 깊이(Order Book Depth)와 가격 발견 메커니즘(Price Discovery Mechanism)을 심층적으로 분석하고, HolySheep AI API를 활용한 실전 분석 시스템을 구축하는 방법을 다루겠습니다.
암호화폐 시장 microstructure란 무엇인가
시장 microstructure는 자산의 거래가 어떻게 일어나는지, 가격이 어떻게 결정되는지를 연구하는 학문입니다. 전통 금융시장에서 발전한 이 이론은 24시간 운영되는 암호화폐 거래소에서 더욱 복잡하게 적용됩니다.
주문서(Order Book)의 구조
암호화폐 거래소의 주문서는 다음과 같은 구조를 가집니다:
# 주문서 구조 예시 (BTC/USDT)
{
"timestamp": 1699123456789,
"symbol": "BTCUSDT",
"exchange": "Binance",
"bids": [ # 매수 주문 (가격, 수량)
[41500.00, 2.5], # 가격 41,500에 2.5 BTC 매수 가능
[41499.50, 1.2], # 가격 41,499.50에 1.2 BTC 매수 가능
[41499.00, 0.8]
],
"asks": [ # 매도 주문 (가격, 수량)
[41501.00, 1.8], # 가격 41,501에 1.8 BTC 매도 가능
[41501.50, 3.2],
[41502.00, 0.5]
],
"spread": 1.00, # 최우선 매수가와 최우선 매도가 차이 (스프레드)
"mid_price": 41500.50 # 중립 가격 (bid와 ask의 중간값)
}
주문서 깊이(Order Book Depth)의 의미
주문서 깊이란 특정 가격 범위 내에서 누적된 주문량을 의미합니다. 이것은 시장의 유동성(Liquidity)과 가격 지지/저항 수준을 파악하는 데 핵심적인 지표입니다.
# 주문서 깊이 계산 함수
def calculate_order_book_depth(order_book, levels=10):
"""
주문서 깊이를 계산하여 유동성 프로파일을 생성
Args:
order_book: 주문서 데이터
levels: 분석할 가격 레벨 수
Returns:
dict: 각 방향별 누적 주문량
"""
bid_depth = 0
ask_depth = 0
# 상위 N개 레벨의 누적 주문량 계산
for i in range(min(levels, len(order_book['bids']))):
bid_depth += order_book['bids'][i][1] # 수량累加
for i in range(min(levels, len(order_book['asks']))):
ask_depth += order_book['asks'][i][1]
# 가격 레벨당 평균 주문량
avg_bid_size = bid_depth / min(levels, len(order_book['bids']))
avg_ask_size = ask_depth / min(levels, len(order_book['asks']))
return {
'bid_depth': bid_depth,
'ask_depth': ask_depth,
'depth_imbalance': (bid_depth - ask_depth) / (bid_depth + ask_depth),
# 1에 가까울수록 강한 매수 압력, -1에 가까울수록 강한 매도 압력
'avg_bid_size': avg_bid_size,
'avg_ask_size': avg_ask_size,
'spread_bps': (order_book['asks'][0][0] - order_book['bids'][0][0]) /
order_book['mid_price'] * 10000 # 베이시스 포인트 단위 스프레드
}
가격 발견 메커니즘의 핵심 원리
가격 발견(Price Discovery)이란 시장 참여자들의 주문 패턴과 거래를 통해 새로운 균형 가격이 결정되는 과정을 말합니다. 암호화폐 시장에서는 이 메커니즘이 독특한 특성을 가집니다.
암호화폐 가격 발견의 특징
| 특징 | 설명 | 전통 금융 대비 |
|---|---|---|
| 24/7 거래 | 연중무휴 거래 가능 | 주말/공휴일休市 없음 |
| 분산 거래소 | 다수의 거래소에서 개별 가격 형성 | 단일 중앙 집중형 거래소 |
| 낮은 진입 장벽 | 소액부터 거래 가능 | 높은 최소 주문 금액 |
| 높은 변동성 | 短时间内 큰 가격 변동 | 변동성 제한制度 존재 |
| arb機会 빈번 | 거래소 간 가격 차이 활용 가능 | arb机会 제한적 |
가격发现 메커니즘 유형
1.竞价拍卖 모델(Order-Driven Market)
매수자와 매도자의 주문을 직접 매칭하여 가격을 결정합니다. Binance, Coinbase Pro 등이 이 모델을 사용합니다.
2.ディーラー 모델(Quote-Driven Market)
전문 딜러가 매수/매도 호가를 제시하고, 그 가격에서 거래가 성사됩니다.
3.혼합 모델(Hybrid Model)
주문驱动과 딜러 모델의 장점을 결합한 형태로, 대부분의 주요 거래소가 채택하고 있습니다.
실전 프로젝트: HolySheep AI 기반 시장 microstructure 분석 시스템
제가 실제로 구축한 암호화폐 시장 microstructure 분석 시스템의 핵심 코드입니다. HolySheep AI의 Claude Sonnet 모델을 활용하여 주문서 패턴을 실시간으로 분석합니다.
import requests
import json
from datetime import datetime
class CryptoMicrostructureAnalyzer:
"""암호화폐 시장 microstructure 분석기"""
def __init__(self, api_key):
self.api_key = api_key
self.base_url = "https://api.holysheep.ai/v1"
self.model = "claude-sonnet-4-20250514"
def analyze_order_flow(self, order_book_data, market_context):
"""
주문 흐름을 AI로 분석하여 거래 신호 생성
Args:
order_book_data: 실시간 주문서 데이터
market_context: 시장 맥락 정보 (시가총액, 거래량 등)
Returns:
dict: 분석 결과 및 거래 신호
"""
# Claude에게 전달할 프롬프트 구성
prompt = f"""
다음 BTC/USDT 주문서 데이터를 분석하여 시장 microstructure 관점의 통찰을 제공해주세요:
{json.dumps(order_book_data, indent=2)}
시장 맥락:
- 24시간 거래량: {market_context.get('volume_24h', 'N/A')} USDT
- 변동성 (24h): {market_context.get('volatility_24h', 'N/A')}%
분석 요청 사항:
1. 주문서 불균형(Order Book Imbalance) 분석
2. 스프레드 패턴 해석
3. 가격 지지/저항 수준 식별
4. 단기 거래 신호 (매수/매도/관망)
5. 신뢰도 점수 (0-100)
반드시 JSON 형식으로 응답해주세요.
"""
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
payload = {
"model": self.model,
"max_tokens": 1000,
"messages": [
{
"role": "system",
"content": "당신은 전문적인 암호화폐 시장 microstructure 분석가입니다. \
주문서 데이터와 시장 상황을 기반으로 정확하고实用的한 분석을 제공합니다."
},
{
"role": "user",
"content": prompt
}
]
}
response = requests.post(
f"{self.base_url}/chat/completions",
headers=headers,
json=payload
)
if response.status_code == 200:
result = response.json()
return json.loads(result['choices'][0]['message']['content'])
else:
raise Exception(f"API 호출 실패: {response.status_code} - {response.text}")
사용 예시
analyzer = CryptoMicrostructureAnalyzer("YOUR_HOLYSHEEP_API_KEY")
sample_order_book = {
"symbol": "BTCUSDT",
"timestamp": 1699123456789,
"bids": [
[41500.00, 2.5], [41499.50, 1.2], [41499.00, 0.8],
[41498.50, 3.1], [41498.00, 1.5], [41497.50, 2.3]
],
"asks": [
[41501.00, 1.8], [41501.50, 3.2], [41502.00, 0.5],
[41502.50, 1.1], [41503.00, 2.7], [41503.50, 0.9]
],
"mid_price": 41500.50,
"spread": 0.50
}
market_context = {
"volume_24h": "1.2B USDT",
"volatility_24h": "2.3"
}
try:
analysis = analyzer.analyze_order_flow(sample_order_book, market_context)
print(json.dumps(analysis, indent=2, ensure_ascii=False))
except Exception as e:
print(f"분석 실패: {e}")
# 실시간 주문서 모니터링 및 알림 시스템
import websocket
import json
import threading
from collections import deque
class OrderBookMonitor:
"""실시간 주문서 모니터 및 패턴 감지 시스템"""
def __init__(self, symbol, analyzer, alert_threshold=0.3):
self.symbol = symbol
self.analyzer = analyzer
self.alert_threshold = alert_threshold
self.order_book_history = deque(maxlen=100) # 최근 100개 주문서 저장
self.price_history = deque(maxlen=50)
def on_message(self, ws, message):
"""웹소켓 메시지 수신 처리"""
data = json.loads(message)
if data.get('type') == 'depth_update':
order_book = data.get('data', {})
# 가격 및 깊이 변화 감지
mid_price = (order_book['bids'][0][0] + order_book['asks'][0][0]) / 2
# DeepSeek 모델로 패턴 분석
pattern_analysis = self._detect_pattern_with_ai(order_book)
# 심각한 불균형 감지 시 알림
imbalance = pattern_analysis.get('order_imbalance', 0)
if abs(imbalance) > self.alert_threshold:
self._send_alert(imbalance, pattern_analysis)
self.order_book_history.append(order_book)
self.price_history.append(mid_price)
print(f"[{datetime.now().isoformat()}] "
f"중간가: ${mid_price:,.2f} | "
f"불균형: {imbalance:.2%} | "
f"신호: {pattern_analysis.get('signal', 'N/A')}")
def _detect_pattern_with_ai(self, order_book):
"""AI를 활용한 주문 패턴 분석"""
# HolySheep AI - DeepSeek 모델 활용 (비용 효율적)
prompt = f"""
다음 주문서 데이터에서 중요한 패턴을 식별해주세요:
Bid 최우선 5개: {order_book['bids'][:5]}
Ask 최우선 5개: {order_book['asks'][:5]}
JSON으로 응답:
- order_imbalance: (-1 ~ 1) 매수/매도 압력 불균형
- liquidity_concentration: 유동성 집중 구간
- signal: 매수/매도/관망 추천
- confidence: 신뢰도 0-100
"""
# DeepSeek V3.2 모델 사용 (매우 저렴한 가격)
response = self._call_holysheep_api(
model="deepseek-chat",
prompt=prompt
)
return json.loads(response)
def _call_holysheep_api(self, model, prompt):
"""HolySheep AI API 호출 래퍼"""
import requests
headers = {
"Authorization": f"Bearer {self.analyzer.api_key}",
"Content-Type": "application/json"
}
payload = {
"model": model,
"messages": [{"role": "user", "content": prompt}],
"temperature": 0.3 # 일관된 분석을 위해 낮은 temperature
}
response = requests.post(
f"{self.analyzer.base_url}/chat/completions",
headers=headers,
json=payload
)
return response.json()['choices'][0]['message']['content']
def _send_alert(self, imbalance, analysis):
"""알림 발송 (실제 구현 시 이메일/Slack/카카오톡 연동)"""
direction = "강한 매수 압력" if imbalance > 0 else "강한 매도 압력"
signal = analysis.get('signal', 'N/A')
confidence = analysis.get('confidence', 0)
alert_msg = (
f"⚠️ [주문서 알림] {self.symbol}\n"
f"감지 시간: {datetime.now().isoformat()}\n"
f"불균형도: {imbalance:.2%} ({direction})\n"
f"AI 신호: {signal} (신뢰도: {confidence}%)\n"
f"권장 조치: {analysis.get('recommendation', '검증 필요')}"
)
print(f"\n{'='*50}\n{alert_msg}\n{'='*50}\n")
모니터 시작
monitor = OrderBookMonitor(
symbol="BTCUSDT",
analyzer=CryptoMicrostructureAnalyzer("YOUR_HOLYSHEEP_API_KEY"),
alert_threshold=0.25
)
웹소켓 연결 (Binance WebSocket 예시)
ws = websocket.WebSocketApp(
"wss://stream.binance.com:9443/ws/btcusdt@depth20@100ms",
on_message=monitor.on_message
)
ws.run_forever()
print("주문서 모니터링 시스템 초기화 완료")
시장 microstructure 지표 상세 분석
1. 주문서 불균형 (Order Book Imbalance)
이 지표는 시장の方向성을 예측하는 데 매우 효과적입니다.
def calculate_comprehensive_metrics(order_book):
"""
종합 시장 microstructure 지표 계산
Returns:
dict: 분석된 지표들
"""
bids = order_book['bids']
asks = order_book['asks']
# 1. 기본 깊이 지표
bid_volume = sum([b[1] for b in bids[:10]])
ask_volume = sum([a[1] for a in asks[:10]])
# 2. 가중 평균 가격 (VWAP 근사치)
bid_vwap = sum([b[0] * b[1] for b in bids[:10]]) / bid_volume if bid_volume > 0 else 0
ask_vwap = sum([a[0] * a[1] for a in asks[:10]]) / ask_volume if ask_volume > 0 else 0
# 3. 스프레드 및 스프레드 비율
best_bid = bids[0][0]
best_ask = asks[0][0]
spread = best_ask - best_bid
spread_pct = spread / ((best_bid + best_ask) / 2) * 100
# 4. 미결제 주문량 (Open Interest 근사)
bid_notional = bid_volume * bid_vwap
ask_notional = ask_volume * ask_vwap
# 5. 웨이블렛 분석을 위한 주문 크기 분포
bid_sizes = [b[1] for b in bids[:20]]
ask_sizes = [a[1] for a in asks[:20]]
return {
'order_imbalance': (bid_volume - ask_volume) / (bid_volume + ask_volume),
# 양수: 매수 압력, 음수: 매도 압력
'volume_imbalance': (bid_notional - ask_notional) / (bid_notional + ask_notional),
# 금액 기준 불균형
'spread_bps': spread_pct * 100, # 베이시스 포인트
'spread_dollars': spread,
'bid_ask_ratio': bid_volume / ask_volume if ask_volume > 0 else float('inf'),
'avg_spread_bps': (ask_vwap - bid_vwap) / ((bid_vwap + ask_vwap) / 2) * 10000,
'microstructure_score': calculate_microstructure_score(
bid_volume, ask_volume, spread, bid_sizes, ask_sizes
),
'liquidity_depth': bid_volume + ask_volume,
'depth_ratio': bid_volume / ask_volume if ask_volume > 0 else 0
}
def calculate_microstructure_score(bid_vol, ask_vol, spread, bid_sizes, ask_sizes):
"""
종합 microstructure 점수 계산 (0-100)
산정 기준:
- 유동성 균형 (40%)
- 스프레드 효율성 (30%)
- 주문 크기 분산 (30%)
"""
# 유동성 균형 점수
if bid_vol > 0 and ask_vol > 0:
balance_ratio = min(bid_vol, ask_vol) / max(bid_vol, ask_vol)
else:
balance_ratio = 0
liquidity_score = balance_ratio * 40
# 스프레드 점수 (낮을수록 좋음, 0.1% 이하이면 만점)
spread_score = max(0, 30 - (spread * 1000)) # spread 단위가 클 경우 조정 필요
# 주문 분산 점수 (균등하게 분산될수록 좋음)
if bid_sizes and ask_sizes:
bid_cv = calculate_cv(bid_sizes) # 변동 계수
ask_cv = calculate_cv(ask_sizes)
avg_cv = (bid_cv + ask_cv) / 2
dispersion_score = max(0, 30 - avg_cv * 15)
else:
dispersion_score = 0
return {
'total': liquidity_score + spread_score + dispersion_score,
'breakdown': {
'liquidity': liquidity_score,
'spread': spread_score,
'dispersion': dispersion_score
}
}
def calculate_cv(data):
"""변동 계수 (Coefficient of Variation) 계산"""
import statistics
if not data or len(data) < 2:
return 0
mean = statistics.mean(data)
stdev = statistics.stdev(data)
return stdev / mean if mean > 0 else 0
HolySheep AI 모델 선택 가이드: 시장 분석 워크로드별 최적화
| 작업 유형 | 권장 모델 | 가격 ($/MTok) | 적합성 이유 | 예상 지연 |
|---|---|---|---|---|
| 실시간 패턴 감지 | DeepSeek V3.2 | $0.42 | 높은 처리량, 낮은 비용 | ~800ms |
| 심층 microstructure 분석 | Claude Sonnet 4.5 | $15.00 | 정교한 분석能力 | ~2s |
| 대량 주문서 백테스트 | Gemini 2.5 Flash | $2.50 | 비용 효율적 대량 처리 | ~1s |
| 종합 리포트 생성 | GPT-4.1 | $8.00 | 일관된 출력 품질 | ~1.5s |
이런 팀에 적합 / 비적합
✅ 이런 팀에 매우 적합
- 암호화폐 거래소 개발팀: 주문서 분석 도구, 시장 감시 시스템 구축
- 量化交易(퀀트) 개발자: 시장 microstructure 기반 알고리즘 트레이딩
- 블록체인 분석 스타트업: 실시간 유동성 모니터링 및 이상 탐지
- 투자 연구팀: 시장 깊이 데이터 기반 리서치 보고서 자동화
- academicians 연구자: 암호화폐 시장 microstructure 학술 연구
❌ 이런 팀에는 비적합
- 단순 시세 조회만 필요한 경우:交易所 직접 API가 더 적합
- 실시간 HFT (고빈도 거래): Python은 지연 시간 문제가 있음, C++/FPGA 필요
- 금융 商品 권한 없는 팀: 규제 준수 문제 발생 가능
- 정적 분석만 필요한 경우: pandas 기반 오프라인 분석이 비용 효율적
가격과 ROI
시장 microstructure 분석 시스템 구축 시 HolySheep AI 비용 분석:
| 시나리오 | 일일 API 호출 | 모델 조합 | 월간 추정 비용 | 기대 효과 |
|---|---|---|---|---|
| 개인 개발자 (소규모) | ~500회 | DeepSeek V3.2 100% | $3-5 | 학습/개인 프로젝트용 |
| 중소팀 (중간 규모) | ~5,000회 | DeepSeek 70% + Claude 30% | $30-50 | 실시간 모니터링 + 분석 |
| 기업 (대규모) | ~50,000회 | 혼합 모델 | $200-400 | 완전한 분석 시스템 |
ROI 관점에서의 가치:
- 수동 시장 분석 대비 80% 시간 절약
- Claude Sonnet의 정교한 분석으로 예측 정확도 향상
- DeepSeek의 낮은 가격으로 대량 데이터 처리 비용 최소화
- 단일 API 키로 다중 모델 관리 간소화
왜 HolySheep AI를 선택해야 하나
- 비용 효율성: DeepSeek V3.2는 $0.42/MTok으로 타사 대비 90% 이상 저렴
- 다중 모델 지원: GPT-4.1, Claude Sonnet, Gemini 2.5 Flash, DeepSeek를 하나의 API 키로 통합 관리
- 로컬 결제 지원: 해외 신용카드 없이도 로컬 결제 가능 (개발자 친화적)
- 신속한 통합: OpenAI 호환 API 구조로 기존 코드 minimal 변경으로 migration 가능
- 신뢰할 수 있는 연결: 글로벌 AI API 게이트웨이としての 안정적인 인프라
자주 발생하는 오류와 해결책
오류 1: API Rate Limit 초과
# ❌ 잘못된 접근: 제한 없이 무한 호출
for tick in market_data_stream:
result = analyzer.analyze_order_flow(tick) # 즉시 Rate Limit 도달
✅ 올바른 접근: 지수 백오프와 캐싱 적용
import time
from functools import lru_cache
import asyncio
class RateLimitedAnalyzer:
def __init__(self, api_key, max_calls_per_minute=60):
self.analyzer = CryptoMicrostructureAnalyzer(api_key)
self.last_call_time = 0
self.min_interval = 60 / max_calls_per_minute
self.cache = {}
self.cache_ttl = 5 # 5초 캐시
def analyze_throttled(self, order_book, cache_key=None):
current_time = time.time()
# 캐시 히트 시 즉시 반환
if cache_key and cache_key in self.cache:
cached_result, cached_time = self.cache[cache_key]
if current_time - cached_time < self.cache_ttl:
return cached_result
# Rate Limit 대기
elapsed = current_time - self.last_call_time
if elapsed < self.min_interval:
time.sleep(self.min_interval - elapsed)
# API 호출
self.last_call_time = time.time()
result = self.analyzer.analyze_order_flow(order_book, {})
# 캐시 저장
if cache_key:
self.cache[cache_key] = (result, self.last_call_time)
return result
비동기 버전 (더 효율적)
class AsyncRateLimitedAnalyzer:
def __init__(self, api_key, max_calls_per_minute=60):
self.api_key = api_key
self.semaphore = asyncio.Semaphore(max_calls_per_minute)
self.last_call = 0
self.min_interval = 60 / max_calls_per_minute
async def analyze_async(self, order_book):
async with self.semaphore:
elapsed = time.time() - self.last_call
if elapsed < self.min_interval:
await asyncio.sleep(self.min_interval - elapsed)
self.last_call = time.time()
# 실제 API 호출 로직
return await self._call_api(order_book)
오류 2: 주문서 데이터 형식 불일치
# ❌ 문제: 거래소별 다른 데이터 형식 미처리
Binance: {"bids": [[price, qty], ...]}
Coinbase: {"bids": [{"price": "...", "size": "..."}], ...}
Kraken: {"bs": [[price, volume, timestamp], ...]}
def process_order_book_unsafe(raw_data, exchange):
# 형식 미변환으로 분석 실패 가능
return raw_data['bids'] # 거래소마다 구조가 다름
✅ 올바른 접근: 거래소별 어댑터 패턴
from abc import ABC, abstractmethod
class OrderBookAdapter(ABC):
@abstractmethod
def normalize(self, raw_data) -> dict:
pass
class BinanceAdapter(OrderBookAdapter):
def normalize(self, raw_data):
return {
'bids': [[float(b[0]), float(b[1])] for b in raw_data.get('b', raw_data.get('bids', []))],
'asks': [[float(a[0]), float(a[1])] for a in raw_data.get('a', raw_data.get('asks', []))],
'timestamp': raw_data.get('E', raw_data.get('timestamp', 0))
}
class CoinbaseAdapter(OrderBookAdapter):
def normalize(self, raw_data):
return {
'bids': [[float(b['price']), float(b['size'])] for b in raw_data.get('bids', [])],
'asks': [[float(a['price']), float(a['size'])] for a in raw_data.get('asks', [])],
'timestamp': raw_data.get('time', 0)
}
class KrakenAdapter(OrderBookAdapter):
def normalize(self, raw_data):
# Kraken은 'bs' (bid size), 'as' (ask size) 형식
bids_raw = raw_data.get('bs', raw_data.get('bids', []))
asks_raw = raw_data.get('as', raw_data.get('asks', []))
return {
'bids': [[float(b[0]), float(b[1])] for b in bids_raw],
'asks': [[float(a[0]), float(a[1])] for a in asks_raw],
'timestamp': raw_data.get('timestamp', 0)
}
class OrderBookFactory:
ADAPTERS = {
'binance': BinanceAdapter,
'coinbase': CoinbaseAdapter,
'kraken': KrakenAdapter,
}
@classmethod
def get_adapter(cls, exchange: str) -> OrderBookAdapter:
adapter_class = cls.ADAPTERS.get(exchange.lower())
if not adapter_class:
raise ValueError(f"지원되지 않는 거래소: {exchange}")
return adapter_class()
@classmethod
def normalize(cls, raw_data, exchange):
adapter = cls.get_adapter(exchange)
return adapter.normalize(raw_data)
사용 예시
binance_data = {'b': [['41500', '2.5'], ['41499', '1.2']]}
normalized = OrderBookFactory.normalize(binance_data, 'binance')
print(f"정규화된 Bid: {normalized['bids']}")
오류 3: 모델 응답 파싱 실패
# ❌ 문제: AI 응답 형식이 부정확할 때 처리 없음
response = analyzer.analyze_order_flow(order_book, context)
analysis = json.loads(response['content']) # 파싱 실패 시 크래시
✅ 올바른 접근: 다중 파싱 전략 및 폴백
import json
import re
def parse_ai_response(content: str, fallback_metrics: dict = None) -> dict:
"""
AI 응답을 안전하게 파싱하는 함수
Strategies:
1. 직접 JSON 파싱 시도
2. JSON 블록 추출 후 파싱
3. 정규식으로 구조화된 데이터 추출
4. 폴백 기본값 반환
"""
# Strategy 1: 직접 파싱
try:
return json.loads(content)
except json.JSONDecodeError:
pass
# Strategy 2: JSON 블록 추출
json_patterns = [
r'``json\s*(.*?)\s*``', # markdown 코드 블록
r'``\s*(.*?)\s*``', # 일반 코드 블록
r'\{[^{}]*(?:\{[^{}]*\}[^{}]*)*\}', # 중첩된 JSON
]
for pattern in json_patterns:
match = re.search(pattern, content, re.DOTALL)
if match:
try:
return json.loads(match.group(1).strip())
except json.JSONDecodeError:
continue
# Strategy 3: 정규식으로 개별 필드 추출
extracted = {}
# order_imbalance 추출
imbalance_match = re.search(
r'order[_\s]?imbalance["\s:]+([-\d.]+)',
content, re.IGNORECASE
)
if imbalance_match:
extracted['order_imbalance'] = float(imbalance_match.group(1))
# signal 추출
signal_match = re.search(
r'signal["\s:]+["\']?(\w+)["\']?',
content, re.IGNORECASE
)
if signal_match:
signal = signal_match.group(1).lower()
if signal in ['buy', 'long', 'bullish', '매수']:
extracted['signal'] = 'buy'
elif signal in ['sell', 'short', 'bearish', '매도']:
extracted['signal'] = 'sell'
else:
extracted['signal'] = 'neutral'
# confidence 추출
confidence_match = re.search(
r'confidence["\s:]+(\d+)',
content, re.IGNORECASE
)
if confidence_match:
extracted['confidence'] = int(confidence_match.group(1))
# 모든 전략 실패 시 폴백
if extracted:
extracted['parse_note'] = '부분 파싱 성공'
return extracted
# 완전한 폴백
if fallback_metrics:
fallback_metrics['parse_note'] = '파싱 실패, 폴백값 반환'
return fallback_metrics
raise ValueError(f"AI 응답