""" LSTM 사전학습 + 봇 자동 시작 통합 스크립트 - 구 봇 종료 후 이 스크립트가 백그라운드로 실행됨 - 12개 종목 LSTM 사전학습 → 완료 시 main_server.py 자동 시작 """ import sys import os import time import subprocess import json # 프로젝트 루트를 path에 추가 ROOT = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, ROOT) os.chdir(ROOT) LOG_FILE = os.path.join(ROOT, "warmup.log") def log(msg): ts = time.strftime("%H:%M:%S") line = f"[{ts}] {msg}" print(line, flush=True) with open(LOG_FILE, "a", encoding="utf-8") as f: f.write(line + "\n") def run_warmup(): log("=" * 50) log("LSTM 사전학습 시작 (Warmup)") log("=" * 50) try: from modules.config import Config from modules.services.kis import KISClient from modules.analysis.deep_learning import PricePredictor from modules.services.telegram import TelegramMessenger messenger = TelegramMessenger() messenger.send_message( "🔄 [Bot Restarting]\n" "LSTM 사전학습 중... 완료 후 자동 시작됩니다.\n" f"대상: Watchlist 전체 종목" ) kis = KISClient() with open(Config.WATCHLIST_FILE, "r", encoding="utf-8") as f: watchlist = json.load(f) log(f"대상 종목: {len(watchlist)}개") predictor = PricePredictor() total = len(watchlist) success = 0 failed = 0 total_time = 0.0 for i, (ticker, name) in enumerate(watchlist.items(), 1): log(f"[{i}/{total}] {name} ({ticker}) 학습 중...") try: # 100일 데이터로 LSTM 학습 (기간별시세 API) prices = kis.get_daily_price(ticker, count=100) if not prices or len(prices) < 70: log(f" ⚠️ 데이터 부족 ({len(prices) if prices else 0}개)") failed += 1 continue t0 = time.time() result = predictor.train_and_predict(prices, ticker=ticker) elapsed = time.time() - t0 total_time += elapsed if result: log(f" ✅ {result['epochs']}에포크 | loss={result['loss']:.6f} | " f"{result['change_rate']:+.2f}% | {elapsed:.1f}초") success += 1 else: log(f" ⚠️ 결과 없음 ({elapsed:.1f}초)") failed += 1 # KIS API 과호출 방지 time.sleep(0.5) except Exception as e: log(f" ❌ 오류: {e}") failed += 1 log("=" * 50) log(f"Warmup 완료: 성공 {success}개 / 실패 {failed}개 / 총 {total_time:.0f}초") log("=" * 50) messenger.send_message( f"✅ [Warmup 완료]\n" f"성공: {success}종목 / 실패: {failed}종목\n" f"소요: {total_time/60:.1f}분\n" f"→ 봇 시작 중..." ) return True except Exception as e: log(f"❌ Warmup 실패: {e}") import traceback log(traceback.format_exc()) return False def start_bot(): log("봇 시작: main_server.py") try: # 새 콘솔 창에서 봇 실행 (Windows) if sys.platform == "win32": subprocess.Popen( [sys.executable, "main_server.py"], creationflags=subprocess.CREATE_NEW_CONSOLE, cwd=ROOT ) else: subprocess.Popen( [sys.executable, "main_server.py"], cwd=ROOT ) log("✅ 봇 프로세스 시작 완료") return True except Exception as e: log(f"❌ 봇 시작 실패: {e}") return False if __name__ == "__main__": # warmup.log 초기화 with open(LOG_FILE, "w", encoding="utf-8") as f: f.write(f"Warmup 시작: {time.strftime('%Y-%m-%d %H:%M:%S')}\n") warmup_ok = run_warmup() if warmup_ok: time.sleep(2) start_bot() else: log("⚠️ Warmup 실패. 봇을 수동으로 시작해주세요: python main_server.py")