""" Factors & Signals Router. Endpoints for factor analysis, signal generation, and quantitative research. """ from __future__ import annotations from fastapi import APIRouter, Depends from app.dependencies import get_current_user from app.schemas.backtest import ( FactorAnalysisRequest, FactorAnalysisResponse, SignalGenerateRequest, SignalResponse, ) from app.services.factors.engine import factor_engine from app.services.signals.engine import signal_engine router = APIRouter(prefix="/quant", tags=["Quantitative Analysis"]) # ── Factors ────────────────────────────────────────────────────────────── @router.post("/factors/analyze") async def analyze_factors(request: FactorAnalysisRequest): """Compute multi-factor exposures for a universe of tickers.""" result = await factor_engine.compute_factor_exposures( tickers=request.tickers, factors=request.factors, period=request.period, ) return result @router.get("/factors/definitions") async def get_factor_definitions(): """Get metadata for all supported factors.""" return factor_engine.get_factor_definitions() # ── Signals ────────────────────────────────────────────────────────────── @router.post("/signals/generate") async def generate_signals(request: SignalGenerateRequest): """Generate quantitative trading signals for tickers.""" results = await signal_engine.generate_signals( tickers=request.tickers, signal_types=request.signal_types, period=request.period, ) return { "results": [ {"ticker": ticker, "signals": signals} for ticker, signals in results.items() ], "total_signals": sum(len(s) for s in results.values()), }