"""信号用例(M8.1):基于选股评分排序 + 技术条件生成交易信号。 信号与回测买入逻辑同源(同一评分引擎、同一口径),保证「为什么 BUY/SELL」可解释。 """ from __future__ import annotations from datetime import date, timedelta import pandas as pd from app.domain.entities.selection import SelectionQuery from app.domain.entities.signal import SignalResult, SignalRules from app.domain.repositories.market import DailyBarRepository, StockRepository from app.quant.selection import factor_columns from app.quant.service import load_daily_df from app.quant.signal import generate_signals from app.quant.universe import filter_stocks, resolve_members class SignalService: def __init__( self, stock_repo: StockRepository, daily_repo: DailyBarRepository, index_repo=None, ) -> None: self._stock_repo = stock_repo self._daily_repo = daily_repo self._index_repo = index_repo def signal(self, query: SelectionQuery, rules: SignalRules) -> SignalResult: as_of = query.as_of or date.today() stocks = filter_stocks( self._stock_repo.list(), query.universe, as_of=as_of, members=resolve_members(self._index_repo, query.universe, as_of), ) if not stocks: return generate_signals(pd.DataFrame(), query, rules, as_of) columns = sorted(factor_columns(query)) daily = load_daily_df( self._daily_repo, [s.symbol for s in stocks], as_of - timedelta(days=query.warmup_days), as_of, columns, adjust=query.price_adjustment, ) return generate_signals(daily, query, rules, as_of)