From 6a6ccc9c57338d8b1290b08dca8f4e329fe2605d Mon Sep 17 00:00:00 2001 From: zephyrdark Date: Tue, 3 Feb 2026 09:01:10 +0900 Subject: [PATCH] feat: add strategy API endpoints - POST /api/strategy/multi-factor - POST /api/strategy/quality - POST /api/strategy/value-momentum Co-Authored-By: Claude Opus 4.5 --- backend/app/api/__init__.py | 3 +- backend/app/api/strategy.py | 63 +++++++++++++++++++++++++++++++++++++ backend/app/main.py | 3 +- 3 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 backend/app/api/strategy.py diff --git a/backend/app/api/__init__.py b/backend/app/api/__init__.py index 6add0a3..d1edb96 100644 --- a/backend/app/api/__init__.py +++ b/backend/app/api/__init__.py @@ -1,5 +1,6 @@ from app.api.auth import router as auth_router from app.api.admin import router as admin_router from app.api.portfolio import router as portfolio_router +from app.api.strategy import router as strategy_router -__all__ = ["auth_router", "admin_router", "portfolio_router"] +__all__ = ["auth_router", "admin_router", "portfolio_router", "strategy_router"] diff --git a/backend/app/api/strategy.py b/backend/app/api/strategy.py new file mode 100644 index 0000000..f1a6331 --- /dev/null +++ b/backend/app/api/strategy.py @@ -0,0 +1,63 @@ +""" +Quant strategy API endpoints. +""" +from fastapi import APIRouter, Depends +from sqlalchemy.orm import Session + +from app.core.database import get_db +from app.api.deps import CurrentUser +from app.schemas.strategy import ( + MultiFactorRequest, QualityRequest, ValueMomentumRequest, StrategyResult, +) +from app.services.strategy import MultiFactorStrategy, QualityStrategy, ValueMomentumStrategy + +router = APIRouter(prefix="/api/strategy", tags=["strategy"]) + + +@router.post("/multi-factor", response_model=StrategyResult) +async def run_multi_factor( + request: MultiFactorRequest, + current_user: CurrentUser, + db: Session = Depends(get_db), +): + """Run multi-factor strategy.""" + strategy = MultiFactorStrategy(db) + return strategy.run( + universe_filter=request.universe, + top_n=request.top_n, + base_date=request.base_date, + weights=request.weights, + ) + + +@router.post("/quality", response_model=StrategyResult) +async def run_quality( + request: QualityRequest, + current_user: CurrentUser, + db: Session = Depends(get_db), +): + """Run super quality strategy.""" + strategy = QualityStrategy(db) + return strategy.run( + universe_filter=request.universe, + top_n=request.top_n, + base_date=request.base_date, + min_fscore=request.min_fscore, + ) + + +@router.post("/value-momentum", response_model=StrategyResult) +async def run_value_momentum( + request: ValueMomentumRequest, + current_user: CurrentUser, + db: Session = Depends(get_db), +): + """Run value-momentum strategy.""" + strategy = ValueMomentumStrategy(db) + return strategy.run( + universe_filter=request.universe, + top_n=request.top_n, + base_date=request.base_date, + value_weight=request.value_weight, + momentum_weight=request.momentum_weight, + ) diff --git a/backend/app/main.py b/backend/app/main.py index b9476b7..44fbc70 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -4,7 +4,7 @@ Galaxy-PO Backend API from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware -from app.api import auth_router, admin_router, portfolio_router +from app.api import auth_router, admin_router, portfolio_router, strategy_router app = FastAPI( title="Galaxy-PO API", @@ -24,6 +24,7 @@ app.add_middleware( app.include_router(auth_router) app.include_router(admin_router) app.include_router(portfolio_router) +app.include_router(strategy_router) @app.get("/health")