- BaseStrategy abstract class - MultiFactorStrategy with weighted factors - QualityStrategy with F-Score filtering - ValueMomentumStrategy combining value and momentum Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
43 lines
1.1 KiB
Python
43 lines
1.1 KiB
Python
"""
|
|
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
|