From c36479f4811db6aaa42a0c2b529138d9909d2c53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=A5=E5=BE=AE?= Date: Thu, 2 Jul 2026 13:50:53 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=AC4=E6=9D=A1CRITICAL=E7=BA=A2=E7=BA=BF?= =?UTF-8?q?=EF=BC=9AGATE=5F9D=5FANALYSIS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 质量门禁新增9维交叉验证检查: - sector_context不空且非neutral - signal_factors≥1个因子 或 tech_snapshot含技术位 不通过→标记review_needed不写入DB 防止模塑科技式空壳策略(无止盈/无行业上下文/无分析过程) --- data/mofin.db-shm | Bin 32768 -> 0 bytes data/mofin.db-wal | Bin 276072 -> 0 bytes data/portfolio.json | 62 +++++++++++++++++++++--------------------- strategy_lifecycle.py | 17 ++++++++++++ 4 files changed, 48 insertions(+), 31 deletions(-) delete mode 100644 data/mofin.db-shm delete mode 100644 data/mofin.db-wal diff --git a/data/mofin.db-shm b/data/mofin.db-shm deleted file mode 100644 index 538323371ad1f0c0da4412e103af1dc416822bc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeI*NlF7z5P;!7&PJngZfA}25a)Rw?jc^lmEZ*gaV_F4Jcqb(?M}$bjd%m~byn$B za1{c7L3O`wihlLJ15`(aJaL?dOhGojzh&U&;p(&SetZA&efOBYc>egx{an93T}IJA z>*H_7aTfBoB#JLfF1=wr6LP468Sh`|KH?q>1r$&~0R7>3Mh~esHKj28fc`6X416KN`^Mt$BaAY}I8#iA>6^36G0y^v7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC37X e6{sP{WbuEcWlJqkKmi35P(T3%6i`5cguov|<~}_D diff --git a/data/mofin.db-wal b/data/mofin.db-wal deleted file mode 100644 index e78d6157e8ad4fa83129a07057d63d86a15e42a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 276072 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 diff --git a/data/portfolio.json b/data/portfolio.json index eaf0c06..31907d7 100644 --- a/data/portfolio.json +++ b/data/portfolio.json @@ -5,9 +5,9 @@ "name": "中际旭创", "shares": 100, "cost": 1316.53, - "price": 1135.18, + "price": 1136.12, "market_value": 113604.0, - "change_pct": -7.19, + "change_pct": -7.12, "currency": "CNY", "position_pct": 15.27, "_currency": "CNY" @@ -29,9 +29,9 @@ "name": "丘钛科技", "shares": 11000, "cost": 13.47, - "price": 5.99, + "price": 5.98, "market_value": 65890.0, - "change_pct": 0.729, + "change_pct": 0.583, "currency": "CNY", "position_pct": 7.97, "_currency": "CNY" @@ -41,9 +41,9 @@ "name": "紫金矿业", "shares": 2400, "cost": 39.89, - "price": 26.35, + "price": 26.34, "market_value": 63048.0, - "change_pct": 4.94, + "change_pct": 4.9, "currency": "CNY", "position_pct": 7.34, "_currency": "CNY" @@ -53,9 +53,9 @@ "name": "海博思创", "shares": 200, "cost": 266.95, - "price": 258.3, + "price": 259.0, "market_value": 51776.0, - "change_pct": -1.75, + "change_pct": -1.48, "currency": "CNY", "position_pct": 6.31, "_currency": "CNY" @@ -65,7 +65,7 @@ "name": "中芯国际", "shares": 300, "cost": 126.07, - "price": 146.32, + "price": 146.33, "market_value": 44112.0, "change_pct": -5.28, "currency": "CNY", @@ -77,9 +77,9 @@ "name": "建滔积层板", "shares": 500, "cost": 88.23, - "price": 72.83, + "price": 73.52, "market_value": 36415.0, - "change_pct": -15.28, + "change_pct": -14.473, "currency": "CNY", "position_pct": 5.28, "_currency": "CNY" @@ -101,9 +101,9 @@ "name": "宁德时代", "shares": 100, "cost": 401.78, - "price": 386.3, + "price": 386.01, "market_value": 38495.0, - "change_pct": 0.64, + "change_pct": 0.57, "currency": "CNY", "position_pct": 4.64, "_currency": "CNY" @@ -113,9 +113,9 @@ "name": "比亚迪股份", "shares": 600, "cost": 104.87, - "price": 68.41, + "price": 68.36, "market_value": 41070.0, - "change_pct": 8.903, + "change_pct": 8.834, "currency": "CNY", "position_pct": 4.62, "_currency": "CNY" @@ -125,9 +125,9 @@ "name": "万科企业", "shares": 19700, "cost": 4.67, - "price": 1.92, + "price": 1.93, "market_value": 38021.0, - "change_pct": 4.717, + "change_pct": 5.19, "currency": "CNY", "position_pct": 4.6, "_currency": "CNY" @@ -149,9 +149,9 @@ "name": "中芯国际", "shares": 500, "cost": 75.94, - "price": 69.88, + "price": 69.62, "market_value": 34635.0, - "change_pct": -9.843, + "change_pct": -10.179, "currency": "CNY", "position_pct": 4.2, "_currency": "CNY" @@ -161,9 +161,9 @@ "name": "长芯博创", "shares": 100, "cost": 231.46, - "price": 225.0, + "price": 226.07, "market_value": 22592.0, - "change_pct": -11.42, + "change_pct": -11.0, "currency": "CNY", "position_pct": 3.2, "_currency": "CNY" @@ -175,7 +175,7 @@ "cost": 12.19, "price": 8.45, "market_value": 20280.0, - "change_pct": 2.13, + "change_pct": 2.14, "currency": "CNY", "position_pct": 2.45, "_currency": "CNY" @@ -185,9 +185,9 @@ "name": "中科电气", "shares": 1400, "cost": 22.29, - "price": 14.33, + "price": 14.31, "market_value": 20062.0, - "change_pct": -0.76, + "change_pct": -0.9, "currency": "CNY", "position_pct": 2.42, "_currency": "CNY" @@ -209,9 +209,9 @@ "name": "法拉电子", "shares": 100, "cost": 147.18, - "price": 164.32, + "price": 164.3, "market_value": 16460.0, - "change_pct": -9.99, + "change_pct": -10.0, "currency": "CNY", "position_pct": 2.3, "_currency": "CNY" @@ -221,20 +221,20 @@ "name": "中国神华", "shares": 500, "cost": 45.89, - "price": 34.26, + "price": 34.13, "market_value": 17115.0, - "change_pct": 1.503, + "change_pct": 1.092, "currency": "CNY", "position_pct": 2.14, "_currency": "CNY" } ], - "total_assets": 902797.0, - "total_mv": 822321.0, + "total_assets": 903265.0, + "total_mv": 822789.0, "stock_value": null, "cash": 80476.0, "frozen_cash": 0.0, "position_pct": 91.09, "currency": "CNY", - "updated_at": "2026-07-02 13:46" + "updated_at": "2026-07-02 13:50" } \ No newline at end of file diff --git a/strategy_lifecycle.py b/strategy_lifecycle.py index 2e67654..5ff3d65 100644 --- a/strategy_lifecycle.py +++ b/strategy_lifecycle.py @@ -89,6 +89,23 @@ STRATEGY_QUALITY_GATES = [ "severity": "HIGH", "fix": "设置 d['currency']='HKD'" }, + # --- 第4条 CRITICAL 红线:9维交叉验证 (2026-07-02 Dad要求) --- + # 策略不能只有价格数字,必须有证据经过了多维分析: + # 横切面: 大盘+行业+个股 | 纵切面: 基本面+消息面+技术面+资金流 + # 代码层面可验证: sector_context(行业) + signal_factors(多因子) 或 tech_snapshot + { + "id": "GATE_9D_ANALYSIS", + "desc": "策略必须经过多维分析(sector_context + signal_factors)", + "check": lambda d: ( + bool(d.get("sector_context") and str(d.get("sector_context","")).strip() not in ("neutral","","N/A","-")) + and ( + bool(d.get("signal_factors") and isinstance(d.get("signal_factors"), (list,tuple)) and len(d["signal_factors"]) >= 1) + or bool(d.get("tech_snapshot") and any(c in str(d.get("tech_snapshot","")) for c in "支撑阻力压强")) + ) + ), + "severity": "CRITICAL", + "fix": "重新运行 reassess_with_context() 完整重评确保 sector_context/signal_factors/tech_snapshot 均已填充" + }, ]