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
|