From ac408a25ca390dd6edb7bbd976c6fa6461c6b3a8 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 8 Oct 2025 12:21:43 +0800 Subject: [PATCH] add stock existence check and improve logging for missing close price data --- app/features/factors.py | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/app/features/factors.py b/app/features/factors.py index 619d1ed..91565fd 100644 --- a/app/features/factors.py +++ b/app/features/factors.py @@ -457,7 +457,20 @@ def _compute_security_factors( # 数据有效性检查 if not close_series: - LOGGER.debug("缺少收盘价数据 ts_code=%s", ts_code, extra=LOG_EXTRA) + # 如果是因为数据库中没有数据,就用debug级别记录 + if not _check_stock_exists(broker, ts_code, trade_date): + LOGGER.debug( + "股票当日无交易 ts_code=%s date=%s", + ts_code, trade_date, + extra=LOG_EXTRA + ) + else: + # 如果股票存在但缺少收盘价,用warning级别记录 + LOGGER.warning( + "股票数据缺失 ts_code=%s date=%s", + ts_code, trade_date, + extra=LOG_EXTRA + ) return {} turnover_series = _fetch_series_values( @@ -707,6 +720,20 @@ def _valuation_score(value: object, *, scale: float) -> float: return max(0.0, min(1.0, score)) +def _check_stock_exists(broker: DataBroker, ts_code: str, trade_date: str) -> bool: + """检查指定日期股票是否存在交易数据""" + with db_session(read_only=True) as session: + result = session.execute( + """ + SELECT 1 FROM daily + WHERE ts_code = :ts_code + AND trade_date = :trade_date + LIMIT 1 + """, + {"ts_code": ts_code, "trade_date": trade_date} + ).fetchone() + return bool(result) + def _volume_ratio_score(value: object) -> float: """计算量比指标的标准化分数""" try: