fix: Update universe presets usage for new API structure
This commit is contained in:
@@ -35,7 +35,7 @@ logger = logging.getLogger(__name__)
|
|||||||
_cached_training_data: Optional[Dict[str, Any]] = None
|
_cached_training_data: Optional[Dict[str, Any]] = None
|
||||||
|
|
||||||
|
|
||||||
# ── Pydantic 스키마 ────────────────────────────────────────────────────────────
|
# ── Pydantic 스키마 ──────────────────────────────────────────────────────
|
||||||
|
|
||||||
class GenerateTrainingDataRequest(BaseModel):
|
class GenerateTrainingDataRequest(BaseModel):
|
||||||
stock_codes: List[str] = Field(..., description="대상 종목 코드 목록")
|
stock_codes: List[str] = Field(..., description="대상 종목 코드 목록")
|
||||||
@@ -76,7 +76,7 @@ class RunUniverseBacktestRequest(BaseModel):
|
|||||||
top_n_results: int = Field(20, description="성과 상위 N개만 반환")
|
top_n_results: int = Field(20, description="성과 상위 N개만 반환")
|
||||||
|
|
||||||
|
|
||||||
# ── API 엔드포인트 ─────────────────────────────────────────────────────────────
|
# ── API 엔드포인트 ─────────────────────────────────────────────────────
|
||||||
|
|
||||||
@router.get("/universe-presets")
|
@router.get("/universe-presets")
|
||||||
async def api_get_universe_presets() -> Dict[str, Any]:
|
async def api_get_universe_presets() -> Dict[str, Any]:
|
||||||
@@ -84,33 +84,20 @@ async def api_get_universe_presets() -> Dict[str, Any]:
|
|||||||
사전 정의된 종목 유니버스 프리셋 목록
|
사전 정의된 종목 유니버스 프리셋 목록
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
{'large_cap': {...}, 'kospi_all': {...}, ...}
|
{'large_cap': {'description': '...', 'filter': {...}}, ...}
|
||||||
"""
|
"""
|
||||||
presets = StockUniverse.get_preset_universes()
|
presets = StockUniverse.get_preset_universes()
|
||||||
|
|
||||||
# StockFilter를 dict로 변환
|
# StockFilter를 dict로 변환
|
||||||
from dataclasses import asdict
|
from dataclasses import asdict
|
||||||
return {
|
result = {}
|
||||||
key: {
|
for key, preset_data in presets.items():
|
||||||
**asdict(filter_obj),
|
result[key] = {
|
||||||
"description": _get_preset_description(key)
|
"description": preset_data["description"],
|
||||||
|
"filter": asdict(preset_data["filter"])
|
||||||
}
|
}
|
||||||
for key, filter_obj in presets.items()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
return result
|
||||||
def _get_preset_description(preset_key: str) -> str:
|
|
||||||
"""프리셋 설명"""
|
|
||||||
descriptions = {
|
|
||||||
"all": "전체 종목 (관리종목 제외)",
|
|
||||||
"kospi_all": "KOSPI 전체",
|
|
||||||
"kosdaq_all": "KOSDAQ 전체",
|
|
||||||
"large_cap": "대형주 (KOSPI 시총 1조 이상, 상위 100)",
|
|
||||||
"mid_cap": "중형주 (KOSPI 시총 3천억 이상, 상위 200)",
|
|
||||||
"liquid_kosdaq": "유동성 높은 KOSDAQ (거래량 20만주+, 상위 100)",
|
|
||||||
"penny_stocks": "저가주 (1~5천원, 고거래량, 상위 50)",
|
|
||||||
}
|
|
||||||
return descriptions.get(preset_key, "")
|
|
||||||
|
|
||||||
|
|
||||||
@router.post("/run-universe")
|
@router.post("/run-universe")
|
||||||
@@ -133,7 +120,8 @@ async def api_run_universe_backtest(req: RunUniverseBacktestRequest) -> Dict[str
|
|||||||
if req.universe_preset not in presets:
|
if req.universe_preset not in presets:
|
||||||
raise HTTPException(status_code=400, detail=f"잘못된 유니버스 프리셋: {req.universe_preset}")
|
raise HTTPException(status_code=400, detail=f"잘못된 유니버스 프리셋: {req.universe_preset}")
|
||||||
|
|
||||||
stock_filter = presets[req.universe_preset]
|
# 새로운 구조: {'description': '...', 'filter': StockFilter(...)}
|
||||||
|
stock_filter = presets[req.universe_preset]["filter"]
|
||||||
stock_codes = await StockUniverse.get_filtered_stocks(stock_filter)
|
stock_codes = await StockUniverse.get_filtered_stocks(stock_filter)
|
||||||
|
|
||||||
if not stock_codes:
|
if not stock_codes:
|
||||||
@@ -248,7 +236,7 @@ async def api_generate_training_data(req: GenerateTrainingDataRequest) -> Dict[s
|
|||||||
if "error" in result:
|
if "error" in result:
|
||||||
raise HTTPException(status_code=500, detail=result["error"])
|
raise HTTPException(status_code=500, detail=result["error"])
|
||||||
|
|
||||||
# 데이터 캠싱 (CSV 다운로드용)
|
# 데이터 캐싱 (CSV 다운로드용)
|
||||||
_cached_training_data = result
|
_cached_training_data = result
|
||||||
|
|
||||||
# DataFrame을 직렬화할 수 없으므로 통계만 반환
|
# DataFrame을 직렬화할 수 없으므로 통계만 반환
|
||||||
|
|||||||
Reference in New Issue
Block a user