From 1163d0cce104acd2c32b29e837f18e7557ad07bd Mon Sep 17 00:00:00 2001 From: xxm Date: Mon, 17 Aug 2026 09:50:44 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20mcap=5Fquantile=E6=94=B9=E7=94=A8stock?= =?UTF-8?q?=5Ffundamentals.mcap=5Ftotal=E2=80=94=E2=80=94=E5=8E=9Famount?= =?UTF-8?q?=E4=B8=BANone=E5=AF=BC=E8=87=B4=E5=85=A8=E8=BF=94=E5=9B=9E0.3?= =?UTF-8?q?=E8=A2=AB=E6=B1=A0=E6=9D=A1=E4=BB=B6=E6=8C=A1=E6=8E=89(0?= =?UTF-8?q?=E5=80=99=E9=80=89=E6=A0=B9=E5=9B=A0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy/profile-scripts/b_td1_v3_scanner.py | 24 +++++++++++-------- deploy/profile-scripts/s2_panic_v2_scanner.py | 16 ++++++++----- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/deploy/profile-scripts/b_td1_v3_scanner.py b/deploy/profile-scripts/b_td1_v3_scanner.py index 137a5cb0..6c166a62 100644 --- a/deploy/profile-scripts/b_td1_v3_scanner.py +++ b/deploy/profile-scripts/b_td1_v3_scanner.py @@ -51,26 +51,30 @@ def load_regime(): def mcap_quantile(code): - """从 stock_daily 算市值分位(mcap_q 近似)""" + """市值分位(mcap_q):用 stock_fundamentals.mcap_total(总市值,亿元) + 2026-08-17 修复:原用 stock_daily.amount 成交额不可靠(amount=None 导致全返回0.3缺省, + 而池条件 mcap_q<0.3 会挡掉所有——扫描0候选的根因)""" try: conn = sqlite3.connect(str(DB_PATH), timeout=5) row = conn.execute( - "SELECT amount, close FROM stock_daily WHERE code=? ORDER BY date DESC LIMIT 1", + "SELECT mcap_total FROM stock_fundamentals WHERE code=? ORDER BY updated_at DESC LIMIT 1", (code,)).fetchone() + conn.close() if not row or not row[0]: - conn.close() - return 0.3 # 缺省给中值(放宽) - # 全市场今日成交额分位 + return 0.3 # 缺省中值 + # 全市场市值分位(用基本面最新 mcap_total 全量) + conn = sqlite3.connect(str(DB_PATH), timeout=5) rows = conn.execute( - "SELECT amount FROM stock_daily WHERE date=(SELECT MAX(date) FROM stock_daily) AND amount IS NOT NULL" + "SELECT code, mcap_total FROM stock_fundamentals f WHERE updated_at = " + "(SELECT MAX(updated_at) FROM stock_fundamentals f2 WHERE f2.code=f.code)" ).fetchall() conn.close() - amounts = sorted([r[0] for r in rows if r[0]]) - if not amounts: + mcaps = sorted([r[1] for r in rows if r[1] and r[1] > 0]) + if not mcaps: return 0.3 import bisect - pos = bisect.bisect_left(amounts, row[0]) - return round(pos / max(len(amounts), 1), 2) + pos = bisect.bisect_left(mcaps, row[0]) + return round(pos / max(len(mcaps), 1), 2) except Exception: return 0.3 diff --git a/deploy/profile-scripts/s2_panic_v2_scanner.py b/deploy/profile-scripts/s2_panic_v2_scanner.py index e9fd4b68..e8773f67 100644 --- a/deploy/profile-scripts/s2_panic_v2_scanner.py +++ b/deploy/profile-scripts/s2_panic_v2_scanner.py @@ -56,22 +56,26 @@ def load_mkt_rsi(): def mcap_quantile(code): + """市值分位(2026-08-17 改用 stock_fundamentals.mcap_total,原 amount 不可靠)""" try: conn = sqlite3.connect(str(DB_PATH), timeout=5) row = conn.execute( - "SELECT amount FROM stock_daily WHERE code=? ORDER BY date DESC LIMIT 1", (code,)).fetchone() + "SELECT mcap_total FROM stock_fundamentals WHERE code=? ORDER BY updated_at DESC LIMIT 1", + (code,)).fetchone() + conn.close() if not row or not row[0]: - conn.close() return 0.3 + conn = sqlite3.connect(str(DB_PATH), timeout=5) rows = conn.execute( - "SELECT amount FROM stock_daily WHERE date=(SELECT MAX(date) FROM stock_daily) AND amount IS NOT NULL" + "SELECT code, mcap_total FROM stock_fundamentals f WHERE updated_at = " + "(SELECT MAX(updated_at) FROM stock_fundamentals f2 WHERE f2.code=f.code)" ).fetchall() conn.close() - amounts = sorted([r[0] for r in rows if r[0]]) - if not amounts: + mcaps = sorted([r[1] for r in rows if r[1] and r[1] > 0]) + if not mcaps: return 0.3 import bisect - return round(bisect.bisect_left(amounts, row[0]) / max(len(amounts), 1), 2) + return round(bisect.bisect_left(mcaps, row[0]) / max(len(mcaps), 1), 2) except Exception: return 0.3