import os import sys from dotenv import load_dotenv # .env 파일 로드 load_dotenv() class Config: # 1. 기본 설정 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 2. NAS 및 AI 서버 NAS_API_URL = os.getenv("NAS_API_URL", "http://192.168.45.54:18500") OLLAMA_API_URL = os.getenv("OLLAMA_API_URL", "http://localhost:11434") # [최적화] qwen2.5:7b-instruct-q4_K_M: JSON 정확도↑, 속도↑, VRAM 4GB # 14B 원하면: qwen2.5:14b-instruct-q4_K_M (VRAM ~9GB, 품질 더 좋음) OLLAMA_MODEL = os.getenv("OLLAMA_MODEL", "qwen2.5:7b-instruct-q4_K_M") OLLAMA_NUM_CTX = int(os.getenv("OLLAMA_NUM_CTX", "4096")) # 8192→4096 (2배 속도) OLLAMA_NUM_PREDICT = int(os.getenv("OLLAMA_NUM_PREDICT", "200")) # 응답 토큰 제한 OLLAMA_NUM_THREAD = int(os.getenv("OLLAMA_NUM_THREAD", "8")) # CPU 스레드 (9800X3D 최적화) # 3. KIS 한국투자증권 KIS_ENV_TYPE = os.getenv("KIS_ENV_TYPE", "virtual").lower() if KIS_ENV_TYPE == "real": KIS_APP_KEY = os.getenv("KIS_REAL_APP_KEY") KIS_APP_SECRET = os.getenv("KIS_REAL_APP_SECRET") KIS_ACCOUNT = os.getenv("KIS_REAL_ACCOUNT") KIS_IS_VIRTUAL = False KIS_BASE_URL = "https://openapi.koreainvestment.com:9443" else: KIS_APP_KEY = os.getenv("KIS_VIRTUAL_APP_KEY") KIS_APP_SECRET = os.getenv("KIS_VIRTUAL_APP_SECRET") KIS_ACCOUNT = os.getenv("KIS_VIRTUAL_ACCOUNT") KIS_IS_VIRTUAL = True KIS_BASE_URL = "https://openapivts.koreainvestment.com:29443" # 4. 텔레그램 TELEGRAM_BOT_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN") TELEGRAM_CHAT_ID = os.getenv("TELEGRAM_CHAT_ID") # 5. 매매 설정 (상수) MAX_INVESTMENT_PER_STOCK = 3000000 # 종목당 최대 300만원 # 6. 데이터 경로 DATA_DIR = os.path.join(BASE_DIR, "data") if not os.path.exists(DATA_DIR): os.makedirs(DATA_DIR, exist_ok=True) HISTORY_FILE = os.path.join(DATA_DIR, "daily_trade_history.json") WATCHLIST_FILE = os.path.join(DATA_DIR, "watchlist.json") # 모델 체크포인트 디렉토리 MODEL_DIR = os.path.join(DATA_DIR, "models") if not os.path.exists(MODEL_DIR): os.makedirs(MODEL_DIR, exist_ok=True) # 7. IPC 설정 SHM_NAME = "web_ai_bot_ipc" SHM_SIZE = 131072 # 128KB IPC_STALENESS = 600 # 600초 (LSTM 분석 사이클이 길어도 portfolio 명령어 정상 작동) # 8. GPU 설정 VRAM_WARNING_THRESHOLD = 12.0 # GB (14 → 12로 조기 경고) # 9. 프로세스 관리 WATCHDOG_INTERVAL = 30 # 헬스체크 간격(초) MAX_RESTART_COUNT = 3 # 최대 자동 재시작 횟수 # 10. 타임아웃 등 HTTP_TIMEOUT = 10 # 11. LSTM 학습 최적화 # 동일 종목을 이 시간(초) 내에 재학습하지 않음 → CPU/GPU 절약 LSTM_COOLDOWN = int(os.getenv("LSTM_COOLDOWN", "1200")) # 20분 # 체크포인트가 있을 때 빠른 재학습 에포크 수 (기존 50 → 30) LSTM_FAST_EPOCHS = int(os.getenv("LSTM_FAST_EPOCHS", "30")) # 12. CPU 서킷 브레이커 CPU_CIRCUIT_BREAKER_THRESHOLD = 92 # CPU% 이상 시 분석 스킵 CPU_CIRCUIT_BREAKER_CONSECUTIVE = 2 # 연속 N회 초과 시 발동 @staticmethod def validate(): """필수 설정 검증""" missing = [] if not Config.KIS_APP_KEY: missing.append("KIS_APP_KEY") if not Config.KIS_APP_SECRET: missing.append("KIS_APP_SECRET") if missing: print(f"⚠️ [Config] Missing Env Params: {', '.join(missing)}") return False return True