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:
2026-03-26 16:05:41 +09:00
parent 739a8a2e5d
commit de7921d270
149 changed files with 133353 additions and 3338 deletions

View File

@@ -1,57 +1,115 @@
# Database Configuration
DATABASE_URL=postgresql://user:password@localhost:5432/auto_stock
DB_POOL_SIZE=10
# ═══════════════════════════════════════════════════════════════════════════════
# Auto Stock Trading System — 환경 설정 템플릿
# ═══════════════════════════════════════════════════════════════════════════════
# 이 파일을 복사하여 .env 파일을 만드세요:
# cp .env.example .env
#
# ⚠️ 운영 환경 필수 체크리스트:
# 1. SECRET_KEY를 강력한 랜덤 문자열로 변경 (최소 64자)
# python -c "import secrets; print(secrets.token_urlsafe(64))"
# 2. POSTGRES_PASSWORD를 강력한 비밀번호로 변경
# 3. REDIS_PASSWORD를 설정하고 REDIS_URL에 반영
# 4. DEBUG=false 설정
# 5. CORS_ORIGINS를 실제 도메인만 허용
# 6. BACKEND_HOST=127.0.0.1 (리버스 프록시 사용 시)
# 7. MCP_API_KEY를 강력한 키로 변경
#
# 설정 참조 문서: CLAUDE.md 섹션 1.2, 4.3
# ═══════════════════════════════════════════════════════════════════════════════
# Redis Configuration
REDIS_URL=redis://localhost:6379/0
# ─── 서버 & 환경 ──────────────────────────────────────────────────────────────
BACKEND_HOST=0.0.0.0
BACKEND_PORT=8000
DEBUG=false
LOG_LEVEL=info
# RabbitMQ Configuration
# ─── Telegram 알림 (빈 문자열이면 비활성화) ──────────────────────────────────────
TELEGRAM_BOT_TOKEN=
TELEGRAM_CHAT_ID=
# ─── 보안 ─────────────────────────────────────────────────────────────────────
# ⚠️ 반드시 변경! python -c "import secrets; print(secrets.token_urlsafe(64))"
SECRET_KEY=CHANGE_ME_USE_python_secrets_token_urlsafe_64
ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=30
# ─── 데이터베이스 (PostgreSQL 15) ─────────────────────────────────────────────
# docker-compose에서 사용하는 변수 (⚠️ 비밀번호 변경 필수)
POSTGRES_USER=stock
POSTGRES_PASSWORD=CHANGE_ME_STRONG_PASSWORD
POSTGRES_DB=stock
# SQLAlchemy Async URL (Docker 환경에서는 localhost→postgres 자동 변환)
DATABASE_URL=postgresql+asyncpg://stock:CHANGE_ME_STRONG_PASSWORD@localhost:5432/stock
# ─── Redis 7 ──────────────────────────────────────────────────────────────────
# ⚠️ 운영 환경에서 반드시 비밀번호를 설정하세요
REDIS_PASSWORD=CHANGE_ME_REDIS_PASSWORD
REDIS_URL=redis://:CHANGE_ME_REDIS_PASSWORD@localhost:6379/0
# ─── RabbitMQ 3 ───────────────────────────────────────────────────────────────
RABBITMQ_DEFAULT_USER=guest
RABBITMQ_DEFAULT_PASS=guest
RABBITMQ_URL=amqp://guest:guest@localhost:5672/
# Korea Investment Securities API - Mode Selection
KIS_MODE=virtual # virtual (모의투자) 또는 real (실전투자)
# ─── KIS API (한국투자증권) ───────────────────────────────────────────────────
# KIS_MODE: "virtual" (모의투자) 또는 "real" (실전투자)
KIS_MODE=virtual
# 모의투자 (Virtual Trading)
KIS_VIRTUAL_APP_KEY=your_virtual_app_key_here
KIS_VIRTUAL_APP_SECRET=your_virtual_app_secret_here
KIS_VIRTUAL_ACCOUNT_NO=your_virtual_account_number_here
KIS_VIRTUAL_URL=https://openapivts.koreainvestment.com:29443
KIS_WS_VIRTUAL_URL=wss://openapivts.koreainvestment.com:29443/websocket
# 실전투자 (Real Trading)
KIS_REAL_APP_KEY=your_real_app_key_here
KIS_REAL_APP_SECRET=your_real_app_secret_here
KIS_REAL_ACCOUNT_NO=your_real_account_number_here
KIS_REAL_URL=https://openapi.koreainvestment.com:9443
KIS_WS_REAL_URL=wss://openapi.koreainvestment.com:21000/websocket
# 현재 활성 설정 (KIS_MODE에 따라 자동 선택됨)
KIS_APP_KEY=your_virtual_app_key_here
KIS_APP_SECRET=your_virtual_app_secret_here
KIS_ACCOUNT_NO=your_virtual_account_number_here
KIS_BASE_URL=https://openapivts.koreainvestment.com:29443
# MCP Server Configuration
MCP_SERVER_URL=http://localhost:8001
MCP_API_KEY=your_mcp_api_key_here
# Claude AI Configuration (for MCP Server)
# ─── AI & MCP ─────────────────────────────────────────────────────────────────
# AI_PROVIDER: "gemini" 또는 "claude" (CLAUDE.md 섹션 1.2)
AI_PROVIDER=gemini
ANTHROPIC_API_KEY=your_anthropic_api_key_here
GEMINI_API_KEY=your_gemini_api_key_here
GEMINI_MODEL=gemini-2.0-flash
CLAUDE_MODEL=claude-3-5-sonnet-20241022
CLAUDE_MAX_TOKENS=4096
# Server Configuration
SERVER_HOST=0.0.0.0
SERVER_PORT=8000
DEBUG=false
LOG_LEVEL=info
# MCP 서버 (⚠️ MCP_API_KEY 변경 필수)
MCP_SERVER_URL=http://localhost:8001
MCP_SERVER_HOST=0.0.0.0
MCP_SERVER_PORT=8001
MCP_API_KEY=CHANGE_ME_MCP_API_KEY
MCP_VALIDATION_ENABLED=true
# Security
SECRET_KEY=your_secret_key_here_change_in_production
ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=30
# ─── 외부 API ─────────────────────────────────────────────────────────────────
DATAGOKR_API_KEY=your_data_go_kr_api_key_here
NEWS_API_KEY=
NEWS_ENABLED=true
NEWS_COLLECT_INTERVAL=1800
NEWS_CACHE_TTL=1800
NEWS_BLOCK_SCORE=-0.5
NEWS_REDUCE_SCORE=-0.3
NEWS_MAX_ARTICLES=20
# CORS
# ─── 토큰 절약 모드 ──────────────────────────────────────────────────────────
# true: JSON 압축 + 차트 데이터 30일 제한 (AI 프롬프트 토큰 절약)
TOKEN_SAVE_MODE=true
# ─── 자동매매 ─────────────────────────────────────────────────────────────────
AUTO_TRADE_ENABLED=true
US_TRADING_ENABLED=false
# ─── CORS ─────────────────────────────────────────────────────────────────────
CORS_ORIGINS=http://localhost:3000,http://localhost:5173
# WebSocket
# ─── WebSocket ────────────────────────────────────────────────────────────────
WS_HEARTBEAT_INTERVAL=30
WS_MESSAGE_QUEUE_SIZE=1000
# ─── 프론트엔드 (Vite 빌드 시 주입) ──────────────────────────────────────────
VITE_API_URL=http://localhost:8000
VITE_WS_URL=ws://localhost:8000