""" TensorFlow 예측 API 엔드포인트 - GET /predict/{stock_code}: 단일 종목 주가 방향 예측 (LSTM) - GET /predict/batch: 복수 종목 일괄 예측 - GET /status: TF 모델 로드 상태 확인 """ from fastapi import APIRouter, HTTPException, Query from typing import List import logging logger = logging.getLogger(__name__) router = APIRouter() def _get_predictor(): try: from app.services.tensorflow_predictor import TensorFlowPredictor, TensorFlowNotAvailable try: return TensorFlowPredictor() except TensorFlowNotAvailable as e: raise HTTPException(status_code=503, detail=f"TensorFlow predictor unavailable: {e}") except Exception as e: raise HTTPException(status_code=503, detail=f"TensorFlow unavailable: {e}") @router.get("/tf-predictions") async def get_tensorflow_predictions( codes: str = Query("005930,000660,035420", description="Comma-separated stock codes"), top: int = Query(10, ge=1, le=50, description="Top N by expected return") ): predictor = _get_predictor() stock_codes: List[str] = [c.strip() for c in codes.split(",") if c.strip()] results = [] for code in stock_codes: pred = await predictor.predict_stock(code) results.append(pred) # Filter out errors, sort by expected_return valid = [r for r in results if isinstance(r, dict) and "expected_return" in r] valid.sort(key=lambda x: x.get("expected_return", 0.0), reverse=True) return { "total": len(valid), "requested": stock_codes, "predictions": valid[:top], "errors": [r for r in results if "error" in r] }