fix: 자동매매 신뢰성·소액계좌 안전배치 5종

감사에서 드러난 신뢰성·조용한실패 버그 수정. 전략값(§5)·시그니처(§4) 불변.

① KIS API 신뢰성(korea_investment_api, config): 스로틀에 _throttle_lock 추가로
   thundering herd(8코루틴 동시발사) 제거, API_TIMEOUT 10→20초, circuit_breaker
   임계 15→7, 재시도 백오프 지터. → 시간당 121건 실패의 근원 완화.
② portfolio summary 보존(portfolio): 잔고 API 실패 시 summary가 영영 None으로
   남아 현금 0→매수 스킵되던 것을, 최초 실패 시 holdings 기반 부분 summary로 채움.
③ output2 빈리스트 가드: KIS가 output2=[] 반환 시 IndexError로 MDD 업데이트가
   조용히 스킵(하방보호 비활성)되던 것 방어. swing/scheduler·adaptive_strategy
   (실버그) + daytrading 2곳(정규화). trade_executor:555는 load-bearing 가드라
   의도적 미변경.
④ MIN_BUY_AMOUNT config화+소액완화(trade_executor, config): 하드코딩 50만을
   MIN_BUY_AMOUNT_KRW로. 자산 833만↓ 계좌가 전종목 차단되던 것을 자산 대비로
   완화(큰 계좌는 기존 50만 하한 불변).
⑤ adaptive 서브버그(adaptive_strategy): fallback 시 _last_update_ts 갱신(refresh
   남발 방지), force_mode_override 전체필드(crisis의 max_daily_trades=0 실제 적용),
   get_event_loop→get_running_loop.

검증: code-verifier 통과(CONFIRMED 버그/회귀 없음, 4개 위험지점 안전), pytest 442 통과.
(day_trading.py·entry_service.py는 소량 인접 선재편집 포함 — 검증 완료.)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HBmzf1HDnvFHLraJ8eaaKJ
This commit is contained in:
2026-09-16 16:59:59 +09:00
parent 5b80223777
commit 408bcce62e
8 changed files with 117 additions and 43 deletions

View File

@@ -148,6 +148,11 @@ class Settings(BaseSettings):
MIN_PRICE_KRW: int = 5000 # 국내 5,000원 이하 매수 금지
MIN_PRICE_USD: float = 4.0 # 미국 $4 이하 매수 금지
# 최소 매수 금액 가드 (수수료 대비 비효율 방지, trade_executor._execute_buy)
# 큰 계좌는 이 값이 그대로 하한으로 사용되고, 소액 계좌는 자산 대비로 완화된다
# (trade_executor._MIN_BUY_AMOUNT 산출 로직 참고).
MIN_BUY_AMOUNT_KRW: float = 500_000 # 기존 하드코딩 _MIN_BUY_AMOUNT와 동일한 기본값
# 연속 손실 관리 (섹션 5.5)
CONSECUTIVE_LOSS_BAN_COUNT: int = 3 # 3회 연속 손실
CONSECUTIVE_LOSS_BAN_DAYS: int = 30 # 30거래일 진입 금지
@@ -309,7 +314,7 @@ class Settings(BaseSettings):
API_RETRY_BACKOFF: float = 2.0 # 지수 백오프 배율
API_MIN_REQUEST_INTERVAL: float = 0.15 # 최소 요청 간격 (초) — 기존 0.5→0.15 (캐시+커넥션풀로 부하 감소)
API_MAX_CONCURRENT_REQUESTS: int = 8 # 동시 최대 요청 수 (기존 4→8, 커넥션풀로 안정적)
API_TIMEOUT: float = 10.0 # API 타임아웃 (초) — 기존 30→10 (블로킹 방지)
API_TIMEOUT: float = 20.0 # API 타임아웃 (초) — 기존 30→10→20 (KIS 느린 조회가 10초 넘어 ReadTimeout 폭증 완화, connect는 10초 유지)
API_ERROR_THRESHOLD: float = 0.3 # 오류율 임계값 (30%)
API_MONITORING_WINDOW: int = 100 # 모니터링 윈도우 (최근 N개 요청)