""" Base strategy class. """ from abc import ABC, abstractmethod from datetime import date from typing import List from sqlalchemy.orm import Session from app.schemas.strategy import StockFactor, StrategyResult, UniverseFilter from app.services.factor_calculator import FactorCalculator class BaseStrategy(ABC): """Base class for quant strategies.""" strategy_name: str = "base" def __init__(self, db: Session): self.db = db self.factor_calc = FactorCalculator(db) def get_universe(self, filter: UniverseFilter) -> List: """Get filtered stock universe.""" return self.factor_calc.get_universe( markets=filter.markets, min_market_cap=filter.min_market_cap, max_market_cap=filter.max_market_cap, exclude_stock_types=filter.exclude_stock_types, exclude_sectors=filter.exclude_sectors, ) @abstractmethod def run( self, universe_filter: UniverseFilter, top_n: int, base_date: date = None, **kwargs, ) -> StrategyResult: """Run the strategy and return ranked stocks.""" pass