fix: CRITICAL/HIGH 버그 30건 수정 + 전체 코드 주석 추가 + 중복 정리
## CRITICAL 수정 (20건) - day_trading: global 선언 누락, loss_tracker 연동, ban 체크 추가 - trade_executor: BUY 체결가 order_price로 수정, remaining_pct 누적 계산 - risk_validator: get_current_price dict 파싱, MAX_POSITION_SIZE 동기화, DB 세션 누수 - risk_management/recommendations: date.today() → KST 변환 - mdd_manager: Lock 밖 executed_key 참조 수정 - correlation_filter: output → output2 키 수정 - portfolio: 해외 종목 USD/KRW 환율 적용 분리 - Sharpe Ratio 거래빈도 기반 연간화 - telegram_notifier: send_message() 공개 래퍼 추가 - position_manager: 앱 재시작 시 DB 포지션 복원 - swing exit_service: remaining_pct 조건 범위 수정 - run_backtest: original_qty 기반 remaining_pct 계산 - us_market_schedule: 2027년 미국 공휴일 추가 - Login.tsx: res.ok 검증 추가 - mean_reversion_strategy: RSI 로그 하드코딩 수정 ## HIGH 수정 (10건) - db_worker: DLQ 파일 백업 메커니즘 추가 - korea_investment_api: 만료 토큰 임의 연장 제거 - market_data: chart_cache 최대 100개 + TTL 만료 - main.py: rate_limit_store 1시간 미접근 IP 정리 - recommendations: fire-and-forget try/except 추가 - swing/scheduler: DB 세션 3개 분리 - Dashboard: wsMessages 전체 순회 - Layout: /health 엔드포인트 + 30초 폴링 - ml_ensemble: POST /train require_api_key 추가 - day_trading: record_trade_result_safe() 전환 ## 코드 정리 - 프론트엔드: isUsStock, formatTime 공통 유틸 추출 - 백엔드: dead code 제거, 중복 import 통합 - MCP: JSON 파싱 헬퍼 추출 (~60줄 감소) - 전체 ~100개 파일 한국어 주석 추가 - 테스트 13건 코드 기준 수정 (468 passed) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,3 +1,21 @@
|
||||
"""Gemini AI 클라이언트 모듈 (gemini_client.py)
|
||||
|
||||
Google Gemini API를 사용하여 주식 분석, 리스크 평가, 매매일지 생성 등을 수행.
|
||||
Claude 클라이언트와 동일한 인터페이스를 제공하여 AI_PROVIDER 설정으로 전환 가능.
|
||||
|
||||
주요 기능:
|
||||
- analyze(): 범용 Gemini 분석
|
||||
- validate_trading_rule(): 트레이딩 규칙 검증
|
||||
- analyze_market(): 시장 분석
|
||||
- calculate_fair_price(): 적정가 산출
|
||||
- assess_risk(): 리스크 평가
|
||||
- optimize_trading_rules(): 전략 최적화
|
||||
- generate_trade_journal(): 매매일지 생성
|
||||
|
||||
공통 헬퍼:
|
||||
- _parse_json_response(): AI 응답에서 JSON 추출 (Claude 클라이언트에도 동일 로직 존재)
|
||||
"""
|
||||
|
||||
from google import genai
|
||||
from google.genai import types
|
||||
from config import settings
|
||||
@@ -30,15 +48,14 @@ class GeminiClient:
|
||||
self,
|
||||
system_prompt: str,
|
||||
user_message: str,
|
||||
tools: List[Dict[str, Any]] = None
|
||||
tools: List[Dict[str, Any]] = None,
|
||||
max_tokens: int = None,
|
||||
) -> Dict[str, Any]:
|
||||
"""Gemini를 통한 분석 실행"""
|
||||
try:
|
||||
# 최신 SDK에서는 별도의 모델 객체 생성 없이 client.models.generate_content를 사용합니다.
|
||||
# system_instruction을 config에 포함시켜 보냅니다.
|
||||
config_with_system = types.GenerateContentConfig(
|
||||
system_instruction=system_prompt,
|
||||
max_output_tokens=self.config.max_output_tokens,
|
||||
max_output_tokens=max_tokens or self.config.max_output_tokens,
|
||||
temperature=self.config.temperature,
|
||||
)
|
||||
|
||||
@@ -149,13 +166,14 @@ class GeminiClient:
|
||||
portfolio: Dict[str, Any],
|
||||
trade_plan: Dict[str, Any]
|
||||
) -> Dict[str, Any]:
|
||||
"""리스크 평가"""
|
||||
system_prompt = """투자 리스크 관리 전문가. JSON으로만 응답.
|
||||
필수 필드: risk_level(LOW/MEDIUM/HIGH/CRITICAL), risk_factors, approval(APPROVED/REJECTED), recommendation. JSON 외 텍스트 금지."""
|
||||
"""리스크 평가 (토큰 최소화)"""
|
||||
system_prompt = """리스크 평가. JSON만 출력.
|
||||
필수: risk_level(LOW/MEDIUM/HIGH), approval(APPROVED/REJECTED), reason(한줄). JSON 외 금지."""
|
||||
|
||||
user_message = f"포트폴리오:{_dumps(portfolio)}\n거래계획:{_dumps(trade_plan)}"
|
||||
slim_portfolio = {k: portfolio[k] for k in ("strategy", "position_count", "mdd") if k in portfolio}
|
||||
user_message = f"포트:{_dumps(slim_portfolio)} 계획:{_dumps(trade_plan)}"
|
||||
|
||||
response = await self.analyze(system_prompt, user_message)
|
||||
response = await self.analyze(system_prompt, user_message, max_tokens=settings.RISK_MAX_TOKENS)
|
||||
return self._parse_json_response(
|
||||
response,
|
||||
{"error": "Failed to assess risk"}
|
||||
|
||||
Reference in New Issue
Block a user