From 15d18a76e2cd28a424f84325bb3cb1240adf4792 Mon Sep 17 00:00:00 2001 From: zlt Date: Thu, 17 Sep 2026 11:24:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B9=E6=A1=88=E5=89=AF=E6=9C=AC=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=EF=BC=9A=E5=A4=8D=E5=AE=A1=E8=AE=B0=E5=BD=95=E4=B8=8E?= =?UTF-8?q?=E4=B8=8A=E7=BA=BF=E5=8D=8F=E5=90=8C=E9=98=B6=E6=AE=B5=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=96=B9=E6=A1=88=EF=BC=882026-09-17=EF=BC=89?= =?UTF-8?q?=EF=BC=8C=E9=80=89=E8=82=A1=E8=AE=A1=E5=88=92=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E6=96=B9=E6=A1=88=E4=BA=94=E5=A4=84=E6=96=87=E5=AD=97=E4=BF=AE?= =?UTF-8?q?=E8=AE=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5.1 --- ...Šçº¿ä¸ŽååŒé˜¶æ®µå·¥ä½œæ–¹æ¡ˆä¸Žè§„格书_2026-09-17.md | 265 ++++++++++++++++++ docs/评审记录_2026-09-17.md | 111 ++++++++ docs/选股计划调整方案_2026-09-17.md | 10 +- 3 files changed, 381 insertions(+), 5 deletions(-) create mode 100644 docs/上线与ååŒé˜¶æ®µå·¥ä½œæ–¹æ¡ˆä¸Žè§„格书_2026-09-17.md create mode 100644 docs/评审记录_2026-09-17.md diff --git a/docs/上线与ååŒé˜¶æ®µå·¥ä½œæ–¹æ¡ˆä¸Žè§„格书_2026-09-17.md b/docs/上线与ååŒé˜¶æ®µå·¥ä½œæ–¹æ¡ˆä¸Žè§„格书_2026-09-17.md new file mode 100644 index 0000000..0c6536f --- /dev/null +++ b/docs/上线与ååŒé˜¶æ®µå·¥ä½œæ–¹æ¡ˆä¸Žè§„格书_2026-09-17.md @@ -0,0 +1,265 @@ +# 上线与ååŒé˜¶æ®µå·¥ä½œæ–¹æ¡ˆä¸Žè§„格书(2026-09-17):修å¤å°åŒ…ã€æŒä»“管ç†ç³»ç»ŸåŒåºã€å‘¨æŠ¥åº•本 + +> 2026-09-17 下åˆå†™ï¼Œä¾›æ‹æ¿ä¸Žå¼€å‘。承接两份规格书:《选股计划调整方案与规格书_2026-09-17》(排åºè½´æ¢è´¨åœ°ï¼Œä»£ç å·²äº¤ä»˜ï¼Œå¤å®¡è§ `docs/评审记录_2026-09-17.md`)与《部署与判收阶段方案与规格书_2026-09-16》(数æ®åŸºåº§ 09-18ã€09-22ã€09-29 三个部署日,原样ä¸åŠ¨ï¼‰ã€‚ +> å¼€å‘者å¯ä»¥æ˜¯äººï¼Œä¹Ÿå¯ä»¥æ˜¯å¤§æ¨¡åž‹ã€‚写法éµå®ˆ `.claude/output-styles/readable-chinese.md`。第一到第å一节是正文,附录是实现细节,标了「å¯ä¸è¯»ã€ï¼Œä½†å¼€å‘者动手å‰å¿…须读对应工作包的附录。 +> 基线:选股系统仓库 `main` 4d7ca55ï¼ˆéšæœ¬æ–¹æ¡ˆæŽ¨é€ï¼‰ï¼Œé€‰è‚¡ç³»ç»Ÿæœºå™¨åœåœ¨ 3d3f317,等 09-21 拉。数æ®åŸºåº§ `master` 79abcf2ã€å¼€å‘分支 `nextphase-2026-09` 末尾为本方案副本æäº¤ï¼ŒåŸºåº§æœºåœåœ¨ 3f45294,等 09-18 拉。æŒä»“管ç†ç³»ç»Ÿä»“库 `main` åœåœ¨ a78e737 之åŽçš„æ–‡æ¡£æäº¤ï¼Œæœºå™¨ä¸Šçš„ä»£ç æœªåŠ¨ã€‚ +> 本文件是四个仓库é€å­—åŒæ­¥çš„副本之一,改一份è¦åŒæ­¥å…¶ä½™ã€‚ + +--- + +## 一ã€è¿™ä¸€é˜¶æ®µä¸ºæœ€ç»ˆç›®æ ‡ä¹°ä»€ä¹ˆ + +排åºè½´æ¢è´¨åœ°çš„代ç å·²ç»å†™å®Œå¹¶å¤å®¡ã€‚è¿™ä¸€é˜¶æ®µè¦æŠŠå®ƒå¹²å‡€åœ°ä¸Šçº¿ï¼Œå¹¶è®©ä¸‹æ¸¸çœŸæ­£åƒåˆ°è¿™ä¸ªåºã€‚买三样东西。 + +1. **09-22 的第一份质地åºè®¡åˆ’,两æ¡è·¯ç»™å‡ºåŒä¸€ä»½ã€‚** å¤å®¡æŸ¥å‡ºè£…é…路与快照路对"å·²å¯åЍæˆå‘˜"的主题é™é¢åˆ¤å®šä¸ä¸€è‡´ï¼ŒåŒä¸€å¤© md 与接å£å¯èƒ½ç»™å‡ºä¸åŒçš„å‰äºŒå。修å¤å°åŒ…把截å–规则收æˆä¸€å¤„实现,å†ä¸Šçº¿ã€‚ +2. **æŒä»“管ç†ç³»ç»Ÿçš„候选åºä¸Žé€‰è‚¡ç³»ç»ŸåŒä¸€ä¸ªåºã€‚** 今天它拿到三百åªå‰ç¼€åŽè‡ªå·±æŒ‰"基本é¢ç«‹åœºæ¡¶ã€åŽŸå§‹åˆ†"é‡æŽ’ï¼Œä¸¤è¾¹æ˜¯ä¸¤å¥—è´¨åœ°åºå„排å„的。ååŒé¡¹è®©å®ƒåœ¨ä¸Šæ¸¸æ˜¯è´¨åœ°è½´æ—¶æŒ‰ä¸Šæ¸¸å次排ã€å…³æŽ‰è‡ªå·±çš„分桶,选股系统ã€å…¥æ± ã€æŒä»“管ç†ç³»ç»Ÿä¸‰å¤„åŒæºã€‚è¿™æ¡ 09-17 的规格书里标为"妿‰¹",本方案就是那次审批的规格。 +3. **09-25 起的周报读的是当天真正出过的计划。** 周报现在把æ¯ä¸ªè®¡åˆ’æ—¥é‡æ–°è£…é…一éï¼Œç”¨çš„æ˜¯è·‘å‘¨æŠ¥é‚£ä¸€åˆ»çš„è¯„æžæŠ¥å‘Šã€‚å››å‘¨å¤æ ¸æ¯”的是两份åå•è°æ›´å¥½ï¼Œä¸¤ä»½éƒ½åº”该是当天è½ç›˜çš„那份。这一æ¡è¦æ‹æ¿ã€‚ + +--- + +## 二ã€åŽŸåˆ™ + +沿用五æ¡ï¼šåР䏿”¹ï¼›å¼€å…³å…³æŽ‰é€å­—å›žæ—§ï¼›åŒæ—¥é‡è·‘结果一致;ä¸åšå›žæµ‹ã€å› å­åˆæˆã€IC;评价åªç”¨å€™é€‰å•å¤ç›˜å‘¨æŠ¥ã€‚本阶段å†å®ˆä¸¤æ¡ã€‚ + +1. 一处规则一处实现。两æ¡è·¯è¦åŒä¸€ä¸ªç»“果,就让两æ¡è·¯è°ƒåŒä¸€ä¸ªå‡½æ•°ï¼Œä¸åœ¨ä¸¤å¤„å„写一éå†é å•测钉。 +2. 下游按上游的åºï¼Œä¸å„è‡ªå‘æ˜Žåºã€‚ä¸Šæ¸¸ç»™äº†åæ¬¡ä¸Žä¸»è½´å,下游读它,ä¸é‡æŽ’。 + +--- + +## 三ã€åšå“ªå‡ ä»¶äº‹ + +三个工作包。甲在选股系统仓库,乙在æŒä»“管ç†ç³»ç»Ÿä»“åº“å¤–åŠ é€‰è‚¡ç³»ç»Ÿçš„ä¸€å¤„å°æ”¹ï¼Œä¸™åœ¨é€‰è‚¡ç³»ç»Ÿä»“库ã€è¦æ‹æ¿ã€‚ + +### 工作包甲:修å¤å°åŒ…(选股系统仓库,必åšï¼‰ + +对应评审记录第四节的三处必改,一个æäº¤ï¼Œ09-18 å¤å®¡å޿ލé€ï¼Œ09-21 拉。 + +1. **主题é™é¢çš„æˆªå–规则收æˆä¸€å¤„。** 新建一个模å—级纯函数åš"按主题é™é¢æˆªå–",`collect` 里的 `_pick` 与模å—级的 `pick_rows` éƒ½è°ƒå®ƒï¼Œåªæ˜¯å„自告诉它怎么从一æ¡è®°å½•å–ä¸»é¢˜ã€‚ä¸»é¢˜çš„å–æ³•与 `_row` 写 `evidence` çš„å–æ³•åŒæºï¼Œå«å·²åЍæˆå‘˜è§†å›¾çš„补充。这样已å¯åЍæˆå‘˜åœ¨ä¸¤æ¡è·¯ä¸Šéƒ½ç®—进所在主题ã€å—é™é¢ï¼›æ²¡æœ‰ä¸»é¢˜çš„行在质地轴下å…é™é¢ã€ä¸è®¡æ•°ã€‚ä¸ºä»€ä¹ˆè¿™æ ·æ”¹ï¼šä¸æ˜¯ç»™è£…é…路加一个"å·²å¯åЍæˆå‘˜ä¹Ÿç®—主题"的特判,而是让两æ¡è·¯æ ¹æœ¬æ²¡æœ‰ç¬¬äºŒä»½è§„则。 +2. **`encoding` å¥åªåœ¨è´¨åœ°è½´ä¸‹è¿½åŠ ã€‚** 旧轴下这å¥è¯ä¸Žå®žé™…次åºç›¸å,æŒä»“管ç†ç³»ç»Ÿä¼šæŠŠå®ƒåŽŸæ ·å±•ç¤ºç»™äººçœ‹ã€‚ +3. **交接文档补一段。** 在 `docs/交接_2026-09-10.md` 末尾加一节带日期的补记,å°è´¦é‚£ä¸€è¡Œæ”¹æˆ 063ï¼Œå››ä»“åº“åŒæ­¥ã€‚ +4. **啿µ‹ã€‚** `test_plan_rank_axis.py` 加两例:已å¯åЍæˆå‘˜åœ¨ä¸¤æ¡è·¯ä¸Šéƒ½ç®—进所在主题;无主题行在质地轴下å…é™é¢ã€åœ¨æ—§è½´ä¸‹å½’"无传导"桶计数。`test_plan_snapshot.py` 里"拿真实快照é€è¡Œæ¯”对"那一例ä¸åŠ¨ï¼Œå®ƒåœ¨éƒ¨ç½²æœºä¸Šæ˜¯è¿™ä»¶äº‹çš„æœ€ç»ˆè¯»æ•°ã€‚ + +细节è§é™„录甲。 + +### 工作包乙:æŒä»“管ç†ç³»ç»ŸæŒ‰ä¸Šæ¸¸å次排(æŒä»“管ç†ç³»ç»Ÿä»“库,å¦åŠ é€‰è‚¡ç³»ç»Ÿä¸€å¤„å°æ”¹ï¼‰ + +**åšä»€ä¹ˆã€‚** æŒä»“管ç†ç³»ç»Ÿå–候选时,上游计划带 `rank_axis` 为 quality å°±æŒ‰ä¸Šæ¸¸åæ¬¡å‡åºæŽ’,ä¸å†æŒ‰ç«‹åœºæ¡¶ä¸ŽåŽŸå§‹åˆ†é‡æŽ’ï¼›ä¸Šæ¸¸æ²¡å¸¦è¿™ä¸ªé”®ï¼ˆæ—§è®¡åˆ’ã€æˆ–选股系统回退)就走现在的路。一个开关,默认开,é ä¸Šæ¸¸çš„键自门控,所以 09-22 之å‰å®ƒä»€ä¹ˆéƒ½ä¸æ”¹ã€‚ + +**为什么。** å…¥æ± å·²ç»æ”¹æˆ"æ–°åºé‡Œè¢«æŒ‡å‘çš„å‰äº”å",选股系统的候选å•å·²ç»æ˜¯è´¨åœ°åºã€‚æŒä»“管ç†ç³»ç»Ÿè‹¥ä»æŒ‰è‡ªå·±çš„立场桶排,三处里就它一处是å¦ä¸€ä¸ªåºï¼Œå››å‘¨å¤æ ¸æ—¶è¯´ä¸æ¸…它拿到的å‰ä¸‰å为什么与选股系统的å‰ä¸‰åä¸ä¸€æ ·ã€‚它的立场桶本æ¥å°±æ˜¯åœ¨æ²¡æœ‰ä¸Šæ¸¸è´¨åœ°åºæ—¶çš„æ›¿ä»£å“,上游有了,替代å“退场。 + +**六件事。** + +1. 计划应答归一时把æ¯è¡Œæ–°åŠ çš„å››ä¸ªé”®ä¸Žé¡¶å±‚çš„ `rank_axis`ã€`rank_rule` 带进æ¥ï¼Œç¼ºå°±æ˜¯ç©ºã€‚ +2. å€™é€‰é€‰æ‹©å‡½æ•°åŠ ä¸€ä¸ªå‚æ•°"æŒ‰ä¸Šæ¸¸åæ¬¡æŽ’",åªåœ¨è®¡åˆ’çš„ `rank_axis` 为 quality 时生效,生效时排åºé”®æ˜¯ä¸Šæ¸¸å次å‡åºã€åŒå次按原始分é™åºï¼Œç«‹åœºæ¡¶ä¸å†å‚与。返回里加一键写明本次用的是哪ç§åºã€‚ +3. 傿•°è¡¨åŠ  `PMS_PLAN_RANK_BY_UPSTREAM`,默认开,说明文字写清自门控。 +4. å册快照的元数æ®é‡Œå†™ä¸€é”® `rank_mode`,让选股系统的周报能还原当天交付åå•çš„åºã€‚ +5. 选股系统 `plan_review.pms_roster` 读到元数æ®é‡Œ `rank_mode` 为 upstream 时按åå†Œé‡Œçš„åæ¬¡å‡åºå–å‰ N,å¦åˆ™æŒ‰åŽŸå§‹åˆ†é™åºå–å‰ Nï¼ˆä»Šå¤©çš„å†™æ³•ï¼‰ã€‚è¿™ä¸€å¤„å°æ”¹æ”¾åœ¨é€‰è‚¡ç³»ç»Ÿä»“库,éšå·¥ä½œåŒ…丙或å•独一个æäº¤ã€‚ +6. 啿µ‹ã€å°è´¦ã€å¯¹æŽ¥è¯´æ˜Žã€‚既有的 `scripts/test_batch29_units.py` 里已有按质地分桶的三例,æ—边加三例。å°è´¦ä¸€æ¡ï¼Œç¼–å· 016。æŒä»“管ç†ç³»ç»Ÿçš„对接说明加一段"å‰ç¼€æ•ˆåº”",与选股系统下游对接说明那段åŒä¹‰ã€‚ + +**上线。** æŒä»“管ç†ç³»ç»Ÿåœ¨é€‰è‚¡ç³»ç»Ÿæœºå™¨ä¸Šï¼Œæºç æŒ‚载进容器,改代ç åªè¦é‡å¯è¿›ç¨‹ï¼Œé‡å¯è¦ç”¨æˆ·åŒæ„ã€æ”¶ç›˜åŽåšã€‚放在 09-23 收盘åŽï¼Œå‰ææ˜¯ 09-22 的六处读数干净。ä¸ä¸Ž 09-21 的选股系统拉代ç åŒä¸€å¤©ï¼Œé¿å…ä¸¤å¤„åŒæ—¶å˜åŒ–è¯´ä¸æ¸…。 + +细节è§é™„录乙。 + +### å·¥ä½œåŒ…ä¸™ï¼šå‘¨æŠ¥æ”¹è¯»å½“æ—¥å¿«ç…§ï¼ˆé€‰è‚¡ç³»ç»Ÿä»“åº“ï¼Œæ‹æ¿ç‚¹ä¸€ï¼‰ + +**åšä»€ä¹ˆã€‚** 周报对æ¯ä¸ªè®¡åˆ’日先找当天的 JSON 快照,读它的全é‡ä¸»æ¦œä¸Žè§‚察档行ã€å€™é€‰å•ã€å…³æ³¨å•;快照ä¸å­˜åœ¨æˆ–读ä¸å‡ºæ‰å›žè½åˆ°çŽ°åœ¨çš„é‡æ–°è£…é…。加开关 `PLAN_REVIEW_SOURCE`,默认 snapshot,设 live å›žä»Šå¤©çš„åšæ³•。周报第一节注记æ¯å¤©ç”¨çš„æ˜¯å“ªç§åº•本。 + +**为什么。** 釿–°è£…é…ç”¨çš„æ˜¯è·‘å‘¨æŠ¥é‚£ä¸€åˆ»çš„è¯„æžæŠ¥å‘Šï¼Œè¯„æžæŸ¥è¯¢å–æ¯åªç¥¨æœ€æ–°ä¸€æ¬¡è¿è¡Œã€ä¸æŒ‰æ—¥æœŸæˆªæ–­ï¼Œæ‰€ä»¥ 09-22 çš„åå•在 09-25 算会用上 09-24 çš„æŠ¥å‘Šã€‚å››å‘¨å¤æ ¸æ¯”的是当天真正出过的两份åå•。快照è½ç›˜æ—¶çš„æ³¨é‡Šå†™ç€"它是å¤ç›˜ä¸Žå¯¹è´¦çš„唯一底本",周报应该读它。 + +**它改å˜ä»€ä¹ˆã€‚** 从 09-02 有快照那天起的所有周报åå•éƒ½æ”¹æŒ‰å¿«ç…§å–æ•°ï¼Œä¸Žä¹‹å‰å‘¨æŠ¥çš„å£å¾„ä¸åŒã€‚09-25 之å‰ä¸ä¼šæœ‰äººæ¯”对旧å£å¾„,所以现在切最çœäº‹ã€‚æ—§å£å¾„é å¼€å…³éšæ—¶èƒ½å›žã€‚ + +细节è§é™„录丙。 + +### å·²æŽ’å®šã€æœ¬æ–¹æ¡ˆä¸æ”¹çš„事 + +æ•°æ®åŸºåº§ä¸‰ä¸ªéƒ¨ç½²æ—¥æŒ‰ã€Šéƒ¨ç½²ä¸Žåˆ¤æ”¶é˜¶æ®µæ–¹æ¡ˆä¸Žè§„格书_2026-09-16》附录甲ã€ä¹™ã€ä¸™æ‰§è¡Œï¼Œ09-28 建议级å°åŒ…å¤å®¡ï¼ˆæ‹æ¿ç‚¹å一)与 09-30 判收读数ä¸å˜ã€‚选股系统 09-21 拉代ç ä¸ŽæŽ¥å£å®¹å™¨é‡å¯æŒ‰ã€Šé€‰è‚¡è®¡åˆ’调整方案_2026-09-17》第四节执行。 + +--- + +## å››ã€æ—¥ç¨‹ + +北京时间。æ¯å¤©åªå†™è¿™ä¸€é˜¶æ®µæ–°å¢žæˆ–改动的事,数æ®åŸºåº§çš„部署日åªåˆ—å字。 + +| 日期 | 星期 | åšä»€ä¹ˆ | +|---|---|---| +| 09-17 | 三 | å¤å®¡å®Œæˆã€‚å¼€å‘者åšå·¥ä½œåŒ…甲,一个æäº¤ï¼›æ‹æ¿ç‚¹ä¸€é€šè¿‡åˆ™å·¥ä½œåŒ…丙并进åŒä¸€ä¸ªæäº¤ | +| 09-18 | å›› | ä¸Šåˆæˆ‘å¤å®¡å·¥ä½œåŒ…甲(å«ä¸™ï¼‰ï¼Œé€šè¿‡å³æŽ¨é€ã€‚æ”¶ç›˜åŽæ•°æ®åŸºåº§ 09-18 部署窗(附录甲,原样)。开å‘者开始工作包乙 | +| 09-19 | å…­ | 工作包乙交付,å«é€‰è‚¡ç³»ç»Ÿé‚£ä¸€å¤„å°æ”¹ã€‚我å¤å®¡ | +| 09-21 | 一 | 收盘åŽé€‰è‚¡ç³»ç»Ÿæœºå™¨æ‹‰ä»£ç ï¼ŒæŽ¥å£å®¹å™¨é‡å¯å¹¶é¢„热,ç»å®¡æ‰¹ï¼Œé¿å¼€ä¸ƒç‚¹åˆ°ä¸ƒç‚¹åŠä¸Žå…«ç‚¹åŠåˆ°ä¹ç‚¹é›¶äº” | +| 09-22 | 二 | 07:15 åŽæ ¸é¦–份质地åºè®¡åˆ’çš„å…­å¤„è¯»æ•°ï¼Œå†æ ¸"两æ¡è·¯åŒä¸€ä»½å‰äºŒå"ã€‚æ”¶ç›˜åŽæ•°æ®åŸºåº§ç¬¬äºŒæ‰¹ï¼ˆé™„录乙) | +| 09-23 | 三 | 09-22 读数干净,则收盘åŽé‡å¯æŒä»“管ç†ç³»ç»Ÿè¿›ç¨‹ä¸Šçº¿å·¥ä½œåŒ…乙,ç»å®¡æ‰¹ | +| 09-24 | å›› | 08:45 åŽæ ¸æŒä»“管ç†ç³»ç»Ÿçš„候选åºç­‰äºŽä¸Šæ¸¸åæ¬¡åº | +| 09-25 | 五 | 首份带两份对照åå•çš„å‘¨æŠ¥ï¼Œåº•æœ¬æŒ‰æ‹æ¿ç‚¹ä¸€ | +| 09-28 | 一 | æ•°æ®åŸºåº§å»ºè®®çº§å°åŒ…å¤å®¡ï¼ˆè‹¥åšï¼‰ | +| 09-29 | 二 | æ•°æ®åŸºåº§ç¬¬ä¸‰æ‰¹ä¸Žå‰ç«¯é‡å»ºï¼ˆé™„录丙) | +| 09-30 | 三 | æ•°æ®åŸºåº§åˆ¤æ”¶è¯»æ•° | +| 10-16 å‰åŽ | | 排åºè½´å››å‘¨å¤æ ¸ï¼ŒæŒ‰ã€Šé€‰è‚¡è®¡åˆ’调整方案》工作包四第四æ¡å†³å®šä¿ç•™æˆ–切回 | +| é•¿å‡åŽç¬¬ä¸€å‘¨ | | 总评审 | + +--- + +## 五ã€å¼€å…³ä¸Žå‚æ•° + +新增三个,其余沿用两份规格书。 + +| é”® | 仓库 | 默认 | 说明 | +|---|---|---|---| +| `PLAN_REVIEW_SOURCE` | 选股系统 | snapshot | 周报底本。live 回"æ¯æ—¥é‡æ–°è£…é…"ã€‚æ‹æ¿ç‚¹ä¸€ | +| `PMS_PLAN_RANK_BY_UPSTREAM` | æŒä»“管ç†ç³»ç»Ÿ | å¼€ | 上游计划 `rank_axis` 为 quality æ—¶æŒ‰ä¸Šæ¸¸åæ¬¡æŽ’ã€å…³æŽ‰ç«‹åœºæ¡¶ï¼›ä¸Šæ¸¸æ²¡å¸¦è¿™ä¸ªé”®æ—¶æ— ä½œç”¨ | +| åå†Œå…ƒæ•°æ® `rank_mode` | æŒä»“管ç†ç³»ç»Ÿå†™ã€é€‰è‚¡ç³»ç»Ÿè¯» | æ—  | upstream 或 quality_bucket 或 scoreï¼Œå‘¨æŠ¥æ®æ­¤è¿˜åŽŸäº¤ä»˜åå•çš„åº | + +选股系统机器的 `.env` ä»ä¸éœ€è¦åŠ ä»»ä½•é”®ã€‚æŒä»“管ç†ç³»ç»Ÿçš„傿•°èµ°å®ƒè‡ªå·±çš„傿•°è¡¨ï¼Œé¡µé¢å¯æ”¹ã€‚ + +--- + +## å…­ã€éªŒè¯æ–¹å¼ + +æ¯æ¡å‘½ä»¤æ ‡æ˜Žåœ¨å“ªå°æœºå™¨ä¸Šè¿è¡Œã€‚选股系统机器与æŒä»“管ç†ç³»ç»Ÿåœ¨åŒä¸€å°ï¼š`ssh -p 2280 factor@192.168.16.155`,两个仓库分别在 `~/project/akg-factor-bridge` 与 `~/project/tradingSystem`。 + +**本地(选股系统仓库,工作包甲交付åŽï¼‰ã€‚** 预期三行都是 ALL OK。 + +```bash +cd /Users/baobao/Documents/work/project/akg-factor-bridge && python3 test_plan_rank_axis.py 2>&1 | tail -1 && python3 test_plan_snapshot.py 2>&1 | tail -1 && python3 test_plan_quality_rank.py 2>&1 | tail -1 +``` + +**本地(选股系统仓库)。** é€å­—回旧。预期末行 ALL OK。 + +```bash +cd /Users/baobao/Documents/work/project/akg-factor-bridge && PLAN_RANK_AXIS=transmission CARD_SORT_BY_QUALITY=0 POOL_SOURCE=tier REVIEW_TARGETS_AXIS=score python3 test_plan_rank_axis.py 2>&1 | tail -1 +``` + +**本地(æŒä»“管ç†ç³»ç»Ÿä»“库,工作包乙交付åŽï¼‰ã€‚** 预期末行 ALL SUITES PASS,例数åªå¢žä¸å‡ã€‚ + +```bash +cd /Users/baobao/Documents/work/project/tradingSystem && python3 scripts/run_tests.py 2>&1 | tail -3 +``` + +**选股系统机器(09-22 早上 07:15 åŽï¼‰ã€‚** 两æ¡è·¯åŒä¸€ä»½å‰äºŒå。这æ¡è¯»æ•°æ˜¯å¿…改一的最终判收。预期打出快照文件å与 True。 + +```bash +cd ~/project/akg-factor-bridge && docker exec akg_factor_bridge python3 -c "import json,glob,plan; p=sorted(glob.glob('data/plan/plan_*.json'))[-1]; s=json.load(open(p)); sp=s['shown_params']; got=[r['code'] for r in plan.pick_rows(s['main'], sp['top'], sp['theme_cap'])]; print(p, got==[r['code'] for r in s['main_shown']])" +``` + +**选股系统机器(09-22)。** 首份质地åºè®¡åˆ’的六处读数,命令与预期照《选股计划调整方案_2026-09-17》第六节,ä¸å†æŠ„一é。 + +**选股系统机器(09-24 早上 08:45 åŽï¼‰ã€‚** æŒä»“管ç†ç³»ç»Ÿçš„候选åºç­‰äºŽä¸Šæ¸¸å次åºã€‚读它当天的å册快照与元数æ®ã€‚预期 `rank_mode` 为 upstreamï¼Œæ‰“å‡ºçš„åæ¬¡åºåˆ—严格递增。 + +```bash +cd ~/project/akg-factor-bridge && docker exec akg_factor_bridge python3 -c " +import json, db +df = db.read_mysql('pms', 'SELECT roster_json, meta_json FROM pms_plan_snapshot ORDER BY id DESC LIMIT 1') +meta = json.loads(df.iloc[0]['meta_json'] or '{}'); roster = json.loads(df.iloc[0]['roster_json'] or '[]') +print('rank_mode =', meta.get('rank_mode')) +rows = [r for r in roster if str(r.get('b') or 'main') == 'main'] +print('å册å‰åçš„åæ¬¡ï¼š', [r.get('r') for r in rows[:10]])" 2>&1 | grep -v Warning +``` + +**选股系统机器(09-25 周报åŽï¼‰ã€‚** 周报底本。预期第一节æ¯å¤©çš„æ³¨è®°å†™"底本:快照",两份对照åå•都在。 + +```bash +cd ~/project/akg-factor-bridge && grep -n "底本\|æ–°åºå‰äºŒå\|æ—§åºå‰äºŒå" $(ls -t data/review/å¤ç›˜_*_next_close.md | head -1) | head -12 +``` + +--- + +## 七ã€å›žé€€ + +- 工作包甲没有开关,它修的是规则ä¸ä¸€è‡´ï¼Œä¸éœ€è¦å›žé€€è·¯å¾„。真è¦å›žåˆ° 4d7ca55 的行为åªèƒ½å›žä»£ç ï¼Œä½†é‚£ä¸ªè¡Œä¸ºæœ¬èº«æ˜¯é”™çš„。 +- 工作包乙把 `PMS_PLAN_RANK_BY_UPSTREAM` 关掉å³å›žä»Šå¤©çš„åšæ³•,ä¸ç”¨é‡å¯ï¼Œå‚数表页é¢å¯æ”¹ã€‚ +- 工作包丙把 `PLAN_REVIEW_SOURCE` 设 live å³å›žä»Šå¤©çš„åšæ³•。 +- 排åºè½´æ•´ä½“å›žé€€ä»æŒ‰ã€Šé€‰è‚¡è®¡åˆ’调整方案》第七节四个开关设旧值。æŒä»“管ç†ç³»ç»Ÿé‚£è¾¹å› ä¸ºè‡ªé—¨æŽ§ï¼Œä¸Šæ¸¸ä¸€å›žé€€å®ƒè‡ªåŠ¨å›žæ—§ï¼Œä¸ç”¨åŠ¨ã€‚ + +--- + +## å…«ã€æ‹æ¿ç‚¹ + +代定的写"建议",动工å‰ä¸å†é—®ã€‚è¦æ”¹å°±æ”¹è¿™é‡Œã€‚ + +1. **周报底本改读快照(工作包丙)。** 建议åšï¼Œéšå·¥ä½œåŒ…甲åŒä¸€ä¸ªæäº¤ï¼Œé»˜è®¤è¯»å¿«ç…§ï¼Œå¼€å…³å¯å›žã€‚ç†ç”±åœ¨ç¬¬ä¸‰èŠ‚ã€‚ä¸åšçš„è¯ï¼Œå››å‘¨å¤æ ¸è¯»åˆ°çš„æ˜¯"以夿 ¸å½“天的评æžå›žå¤´ç®—çš„åå•",è¦åœ¨å‘¨æŠ¥é‡Œå†™æ˜Žã€‚ +2. **æŒä»“管ç†ç³»ç»ŸååŒé¡¹çš„默认值与上线日。** 建议默认开ã€é ä¸Šæ¸¸çš„ `rank_axis` 自门控,09-23 收盘åŽä¸Šçº¿ã€‚ä¸ä¸Ž 09-21 åŒä¸€å¤©ã€‚ +3. **æäº¤ 4d7ca55 éšæœ¬æ–¹æ¡ˆæŽ¨é€ã€‚** 代定。修å¤å°åŒ…在它上é¢å†æä¸€ä¸ªã€‚ +4. **两份对照åå•çš„å£å¾„。** 代定:两份都是全é‡åºå‰äºŒå,ä¸è®¾ä¸»é¢˜é™é¢ï¼Œä¸Žå‘¨æŠ¥å…¶ä½™åå•åŒå£å¾„。它比的是排åºè§„åˆ™ï¼Œä¸æ˜¯å½“天交付的那二ååªï¼›äº¤ä»˜åå•妿œ‰"候选å•"与"强传导交付åå•"两行。 +5. **å·¥ä½œåŒ…ä¹™é‡Œé€‰è‚¡ç³»ç»Ÿé‚£ä¸€å¤„å°æ”¹ï¼ˆ`pms_roster` 按 `rank_mode` å–åºï¼‰** 代定éšå·¥ä½œåŒ…丙åŒä¸€ä¸ªæäº¤ï¼Œè‹¥ä¸™ä¸åšåˆ™å•独一个æäº¤ã€‚ + +--- + +## ä¹ã€äº¤ä»˜è¦æ±‚ + +1. æ¯ä¸ªå·¥ä½œåŒ…一个æäº¤ï¼Œå…¨ä¸­æ–‡ã€æ— å‰ç¼€ï¼Œæ ¼å¼"主题:改了什么",è½å°è´¦çš„带å°è´¦å·ã€‚æ­£æ–‡å†™æ¸…æ”¹äº†å“ªäº›å‡½æ•°ã€æ²¡æ”¹ä»€ä¹ˆã€ä¸ºä»€ä¹ˆä¸åˆå¹¶ã€‚ +2. å…ˆå†™å•æµ‹å†æ”¹ä»£ç ï¼Œå°¤å…¶æ˜¯å·¥ä½œåŒ…甲那两例。 +3. å·¥ä½œåŒ…ç”²äº¤ä»˜è¯æ®ï¼šæäº¤å·ã€ä¸‰ä¸ªæµ‹è¯•文件末行ã€é€å­—回旧那一例的åå­—ã€`git show --stat`。 +4. å·¥ä½œåŒ…ä¹™äº¤ä»˜è¯æ®ï¼šæäº¤å·ã€`run_tests.py` 末三行与例数对比ã€ä¸‰ä¾‹æ–°å•测的åå­—ã€å°è´¦ 016 原文ã€é€‰è‚¡ç³»ç»Ÿé‚£ä¸€å¤„å°æ”¹çš„æäº¤å·ã€‚ +5. å·¥ä½œåŒ…ä¸™äº¤ä»˜è¯æ®ï¼šæäº¤å·ã€å¼€å…³åã€æœ¬åœ°ç”¨ä¸€ä»½åˆæˆå¿«ç…§è·‘é€šå‘¨æŠ¥å–æ•°çš„啿µ‹æœ«è¡Œã€‚ +6. åªåŠ é”®ä¸åˆ é”®ï¼Œæ—¢æœ‰é”®çš„值与å«ä¹‰ä¸å˜ã€‚ + +--- + +## åã€è¯„å®¡æ–¹å¼ + +评审者åªçœ‹è¯æ®ã€‚工作包甲核三件事:截å–è§„åˆ™æ˜¯ä¸æ˜¯åªå‰©ä¸€å¤„实现ã€ä¸¤æ¡è·¯çš„ä¸»é¢˜å–æ³•是å¦åŒæºã€æ—§è½´ä¸‹æ— ä¸»é¢˜è¡Œæ˜¯å¦ä»å½’"无传导"桶计数。工作包乙核四件事:自门控是å¦åªçœ‹è®¡åˆ’顶层的 `rank_axis`ã€ç«‹åœºæ¡¶åœ¨ä¸Šæ¸¸åºä¸‹æ˜¯å¦å®Œå…¨ä¸å‚ä¸Žã€æ—§è®¡åˆ’下是å¦é€å­—回旧ã€åå†Œå…ƒæ•°æ®æ˜¯å¦å†™äº† `rank_mode`。工作包丙核两件事:无快照日是å¦å›žè½ã€å¼€å…³è®¾ live 是å¦é€å­—回今天。判定三档åŒå‰ã€‚评审记录写 `docs/评审记录_<日期>.md`。 + +## å一ã€é£Žé™©ä¸Žé¢„判 + +1. 09-22 早上"两æ¡è·¯åŒä¸€ä»½å‰äºŒå"é‚£æ¡è¯»æ•°è‹¥æ˜¯ False,说明工作包甲没修干净,当天接å£ä»¥å¿«ç…§è·¯ä¸ºå‡†ï¼ŒæŒä»“管ç†ç³»ç»Ÿæ‹¿åˆ°çš„仿˜¯è‡ªæ´½çš„一份,ä¸å½±å“交易,但è¦å½“天修。 +2. æŒä»“管ç†ç³»ç»Ÿåˆ‡åˆ°ä¸Šæ¸¸åºåŽï¼Œé¡µé¢ä¸Š"候选榜第 N å"与它的候选åºç¬¬ä¸€æ¬¡ä¸€è‡´ï¼Œäººçœ‹åˆ°çš„忬¡ä¼šè·³ä¸€æ¬¡ï¼Œå±žé¢„期。 +3. 周报改读快照åŽï¼Œ09-18 与 09-21 ä¸¤ä¸ªæ—§åºæ—¥çš„"主榜新åºå‰äºŒå"其实是旧åºå‰äºŒå,注记写明。 +4. 工作包乙上线那天若æŒä»“管ç†ç³»ç»Ÿè¿›ç¨‹é‡å¯å¤±è´¥ï¼Œå›žé€€æ˜¯ä¸é‡å¯ï¼Œä»£ç åœ¨æŒ‚载目录里但进程还是旧的,行为ä¸å˜ã€‚ +5. å册元数æ®çš„ `rank_mode` åªä»Žå·¥ä½œåŒ…乙上线那天起有,之å‰çš„åå†Œå‘¨æŠ¥ä»æŒ‰åŽŸå§‹åˆ†è¿˜åŽŸï¼Œæ³¨è®°å†™æ˜Ž"åŽ†å² N 与åºä¸å¯è¿˜åŽŸ"é‚£å¥å·²æœ‰ã€‚ + +--- + +## 附录甲(å¯ä¸è¯»ï¼‰ï¼šå·¥ä½œåŒ…甲实现 + +è¡Œå·æŒ‰é€‰è‚¡ç³»ç»Ÿä»“库 `main` 4d7ca55。 + +**截å–函数。** 在 `plan.py` 模å—级新增: + +```python +def take_by_theme(items, n, theme_cap, theme_of, uncapped_no_theme): + """按主题é™é¢æˆªå–。items å¯è¿­ä»£ï¼›theme_of(item) 回主题字符串,无主题回 None。 + 有主题的æ¯ä¸»é¢˜æœ€å¤š theme_cap æ¡ï¼ˆ0 ä¸è®¾é™ï¼‰ã€‚无主题的:uncapped_no_theme 为真时 + å…é™é¢ã€ä¸è®¡æ•°ï¼›ä¸ºå‡æ—¶å½’"(无传导)"一个桶计数(旧轴原样)。å–够 n æ¡å³åœã€‚""" +``` + +- `collect` 里的 `_pick`(约 523 到 541 行)改æˆä¸€è¡Œè°ƒç”¨ï¼š`take_by_theme(ranked.items(), n, theme_cap, lambda kv: _theme_of(kv[0]), uncapped_no_theme)`。 +- `_theme_of(k)` 是 `collect` 内的å°å‡½æ•°ï¼Œä¸Ž `_row`(约 546 到 552 行)写 `evidence` çš„å–æ³•åŒæºï¼šä¼ å¯¼è§†å›¾æœ‰è¯æ®è¡Œå– `e[0]`ï¼›æ²¡æœ‰è¯æ®è¡Œã€ä¸”候选å¡çš„ `started_source` 为 moved_view 且带 `theme`ï¼Œå– `c["theme"]`ï¼›å¦åˆ™ None。最好把 `_row` 里那几行也改æˆå…ˆè°ƒ `_theme_of` 冿‹¼å­—å…¸ï¼Œè®©ä¸¤å¤„åªæœ‰ä¸€ä»½å–法。 +- `pick_rows`(约 1014 到 1037 行)改æˆè°ƒç”¨åŒä¸€ä¸ªå‡½æ•°ï¼š`theme_of` å– `((r.get("evidence") or {}).get("theme")) or None`,`uncapped_no_theme` çš„ç¼ºçœæŽ¨æ–­ä¸å˜ã€‚ +- `encoding`(约 712 行):把追加那åŠå¥æŒªåˆ° `axis == "quality"` 的分支里,或改æˆ"忬¡æŒ‰ PLAN_RANK_AXIS:quality 时质地带优先,传导åªåœ¨å¸¦å†…作次级键;transmission 时按 09-14 的调整分åº"这样两ç§éƒ½å¯¹çš„写法。 +- 交接段骨架:标题"å一ã€2026-09-17 补记:排åºä¸»è½´æ¢æˆå…¬å¸è´¨åœ°";四段:改了什么(一å¥ï¼‰ã€ä¸‹æ¸¸çœ‹åˆ°ä»€ä¹ˆï¼ˆå››ä¸ªæ–°é”®ã€å次å«ä¹‰ã€é€ç¥¨å¯¹è´¦æŽ¥å£ä»æ˜¯åŽŸå§‹åˆ†åºï¼‰ã€æ€Žä¹ˆå›žé€€ï¼ˆå››ä¸ªå¼€å…³ï¼‰ã€è¯»æ•°åœ¨å“ªï¼ˆè¯„æžç›®æ ‡åå•表ã€å‘¨æŠ¥ä¸¤ä»½åå•)。å°è´¦é‚£ä¸€è¡Œæ”¹æˆ"最新到第 063 æ¡"。 + +**啿µ‹ï¼ˆ`test_plan_rank_axis.py` 加两例)。** + +11. å·²å¯åЍæˆå‘˜ç®—进所在主题:六æ¡è®°å½•åŒä¸»é¢˜"锂电",其中第六æ¡é€šè¿‡ `theme_of` å–åˆ°ä¸»é¢˜çš„è·¯å­æ˜¯å€™é€‰å¡çš„ moved_view 补充;`take_by_theme` 在 `theme_cap=5` ä¸‹åªæ”¾äº”æ¡ï¼›å†ç”¨åŒæ ·å…­æ¡æž„造æˆå¸¦ `evidence.theme` 的行喂 `pick_rows`ï¼Œä¹Ÿåªæ”¾äº”æ¡ã€‚ +12. 无主题行两轴å„å½’å„ï¼šå…­æ¡æ— ä¸»é¢˜è®°å½•,`uncapped_no_theme` 为真放六æ¡ï¼Œä¸ºå‡æ”¾äº”æ¡ï¼ˆå½’"无传导"桶)。 + +既有 `test_plan_snapshot.py` 第 50 到 58 è¡Œä¸¤ä¾‹ä¿æŒé€šè¿‡ã€‚ + +## 附录乙(å¯ä¸è¯»ï¼‰ï¼šå·¥ä½œåŒ…乙实现 + +è¡Œå·æŒ‰æŒä»“管ç†ç³»ç»Ÿä»“库 `main` 当å‰ä»£ç ï¼Œæ–‡ä»¶ `app/services/plan_feed.py`。 + +- `_rows`(约 279 到 330 行)加四键:`"quality_band": _int_or_none(it.get("quality_band"))`ã€`"pointed"`(值éžç©ºæ—¶è½¬å¸ƒå°”,å¦åˆ™ None)ã€`"rank_axis": _text_or_none(it.get("rank_axis"))`ã€`"rank_old": _int_or_none(it.get("rank_old"))`。 +- `parse_plan`(约 339 到 395 行)返回字典加两键:`"rank_axis": _text_or_none(payload.get("rank_axis"))`ã€`"rank_rule": _text_or_none(payload.get("rank_rule"))`。 +- `select_candidates`(约 440 行起)签å加 `rank_by_upstream: bool = False`。生效æ¡ä»¶ `upstream = bool(rank_by_upstream) and plan.get("rank_axis") == "quality"`。生效时排åºé”®ä¸º `(x.get("rank") or 10 ** 9, -(x.get("score") or 0.0))`,`rank_by_quality` ä¸å†å‚与;ä¸ç”Ÿæ•ˆæ—¶ä¸¤ä¸ªæ—¢æœ‰åˆ†æ”¯é€å­—ä¸åŠ¨ã€‚è¿”å›žå­—å…¸åŠ  `"rank_mode"`:upstreamã€quality_bucketã€score 三选一。`items` æ¯é¡¹åŠ  `quality_band`ã€`pointed`ã€`rank_axis`ã€`rank_old` 四键原样é€ä¼ ã€‚ +- 傿•°å—(约 620 到 636 行)加 `"rank_by_upstream": ps.get_bool("PMS_PLAN_RANK_BY_UPSTREAM", True)`;调用点(约 1086 到 1094 行)传入。`app/services/param_store.py` 约 119 行æ—加登记:`"PMS_PLAN_RANK_BY_UPSTREAM": (True, bool, "上游计划带 rank_axis=quality æ—¶æŒ‰ä¸Šæ¸¸åæ¬¡æŽ’ã€å…³æŽ‰ç«‹åœºåˆ†æ¡¶ï¼›ä¸Šæ¸¸æ²¡å¸¦æ—¶æ— ä½œç”¨ï¼ˆå…³æŽ‰å³å›žæŒ‰åˆ†æ¡¶æŽ’)")`。 +- å册快照元数æ®ï¼š`app/repo/pms_repo.py` 约 839 行的æ’入语å¥å·²æœ‰ `meta_json` 列,在 `plan_feed` 里构造元数æ®çš„那处加 `"rank_mode"`,值å–自本次 `select_candidates` 返回的 `rank_mode`。 +- 选股系统 `plan_review.pms_roster`(`plan_review.py` 约 120 到 140 è¡Œï¼‰ï¼šæŸ¥è¯¢å¤šå– `meta_json`ï¼›`rank_mode` 为 upstream æ—¶ `rows.sort(key=lambda r: r.get("r") if r.get("r") is not None else 1 << 60)`,å¦åˆ™ä¿æŒæŒ‰ `s` é™åºã€‚注记字符串加一å¥"åºæŒ‰åå†Œå…ƒæ•°æ® rank_mode 还原"。 +- 啿µ‹ï¼š`scripts/test_batch29_units.py` 约 298 到 324 行æ—加三例:上游 `rank_axis` 为 quality ä¸”å¼€å…³å¼€æ—¶æŒ‰åæ¬¡æŽ’且立场桶ä¸å‚与;上游没带 `rank_axis` 时开关开也é€å­—回按分桶排;`rank_mode` 三ç§å–值å„对。若 `run_tests.py` çš„æ–‡æ¡£å­—ç¬¦ä¸²é‡Œå†™äº†å„æ‰¹ä¾‹æ•°ï¼ŒæŒ‰å“¨å…µæ”¹æ•°ã€‚ +- å°è´¦ 016,五段å¼ã€‚对接说明加"å‰ç¼€æ•ˆåº”"一段。 +- 上线(选股系统机器,收盘åŽï¼Œç»å®¡æ‰¹ï¼‰ï¼š`docker compose --profile sched --profile ws restart -t 30`,é‡å¯å‰ç”¨ `docker exec pms-ws date` 看容器时间确认已收盘。 + +## 附录丙(å¯ä¸è¯»ï¼‰ï¼šå·¥ä½œåŒ…丙实现 + +文件 `plan_review.py`ï¼Œè¡Œå·æŒ‰ 4d7ca55。 + +- `run`(约 374 行)把 `data = plan.collect(day, top=5000, obs_top=5000, theme_cap=0)` 改æˆå…ˆè¯•快照:路径用 `regime.snapshot_path(day)`,读出的字典里 `main` 与 `observe` 就是全é‡è¡Œï¼Œ`candidates` 与 `watch` åœ¨é¡¶å±‚ã€‚æŠŠå®ƒæ•´ç†æˆä¸Ž `collect` 返回åŒå½¢çš„字典(`_full` 里放 `main` 与 `observe`),åŽé¢çš„代ç ä¸€è¡Œä¸æ”¹ã€‚å¿«ç…§ä¸å­˜åœ¨ã€å JSONã€æˆ– `main` 䏿˜¯åˆ—表,回è½åˆ° `plan.collect`,注记写"底本:现算(无快照)"。 +- 开关 `config.PLAN_REVIEW_SOURCE`,默认 snapshot;设 live 时直接走 `plan.collect`。 +- æ¯å¤©çš„æ³¨è®°é‡ŒåŠ "底本:快照"或"底本:现算",è½è¿›ç¬¬ä¸€èŠ‚ã€‚ +- 啿µ‹ï¼šæ–°æ–‡ä»¶ `test_plan_review_source.py`ï¼Œåˆæˆä¸€ä»½æœ€å°å¿«ç…§å†™è¿›ä¸´æ—¶ç›®å½•,断言读到的 `_full.main` 与 `candidates` æ¥è‡ªå¿«ç…§ï¼›åˆ æŽ‰æ–‡ä»¶åŽæ–­è¨€å›žè½è·¯å¾„被走到(用å‡çš„ `plan.collect` 计数)。ä¸è¿žåº“。 + +## 附录ä¸ï¼ˆå¯ä¸è¯»ï¼‰ï¼šæ–‡ä»¶æ¸…å• + +工作包甲:`plan.py`ã€`test_plan_rank_axis.py`ã€`docs/交接_2026-09-10.md`(四仓库)。 +工作包乙:æŒä»“管ç†ç³»ç»Ÿ `app/services/plan_feed.py`ã€`app/services/param_store.py`ã€å册元数æ®çš„æž„造处ã€`scripts/test_batch29_units.py`ã€`scripts/run_tests.py`(仅例数)ã€`docs/å¤ç›˜å†³å®šå°è´¦.md`ã€å¯¹æŽ¥è¯´æ˜Žï¼›é€‰è‚¡ç³»ç»Ÿ `plan_review.py`。 +工作包丙:`plan_review.py`ã€`config.py`ã€`.env.example`ã€æ–° `test_plan_review_source.py`。 +清å•外一律ä¸åŠ¨ã€‚ diff --git a/docs/评审记录_2026-09-17.md b/docs/评审记录_2026-09-17.md new file mode 100644 index 0000000..1ba3149 --- /dev/null +++ b/docs/评审记录_2026-09-17.md @@ -0,0 +1,111 @@ +# 评审记录(2026-09-17):选股计划排åºè½´æ¢è´¨åœ°ï¼Œæäº¤ 4d7ca55 + +> 评审对象:选股系统仓库 `main` 上的æäº¤ 4d7ca55(开å‘者 2026-09-17 上åˆäº¤ä»˜ï¼Œäº¤ä»˜æ—¶æœªæŽ¨é€ï¼‰ã€‚基线 6138c01。 +> è¯„å®¡ä¾æ®ï¼š`docs/选股计划调整方案_2026-09-17.md` 第å节"评审方å¼"。评审者åªçœ‹è¯æ®ã€‚ +> 写法éµå®ˆ `.claude/output-styles/readable-chinese.md`。本文件是四个仓库é€å­—åŒæ­¥çš„副本之一。 + +--- + +## 一ã€ç»“论 + +**有æ¡ä»¶é€šè¿‡ã€‚** 代ç ä¸»ä½“与规格书一致,五个测试文件本地全绿,四个开关设旧值时é€å­—回旧æˆç«‹ï¼Œåˆ†æ•°ç¼–ç ä¸Žä¸‰é—¨æ§›ä¸€ç¡®è®¤ä¸‰é£Žé™©éƒ½æ²¡æœ‰åŠ¨ã€‚ä¸‰å¤„å¿…æ”¹ï¼Œåˆæˆä¸€ä¸ªä¿®å¤æäº¤ï¼Œ09-21 拉代ç ä¹‹å‰åšå®Œå¹¶å¤å®¡ã€‚两æ¡å»ºè®®çº§ä¸é˜»å¡žã€‚ä¸€æ¡æ‹æ¿é¡¹ã€‚ + +三处必改å„一å¥è¯ã€‚ + +1. 装é…路与快照路对"å·²å¯åЍæˆå‘˜"的主题é™é¢åˆ¤å®šä¸ä¸€è‡´ã€‚åŒä¸€å¤©çš„计划,早上è½ç›˜çš„主榜å‰äºŒå与接å£è¯»å¿«ç…§ç»™å‡ºçš„å‰äºŒåå¯èƒ½ä¸æ˜¯åŒä¸€æ‰¹ã€‚ +2. 计划里的 `encoding` 说明å¥åœ¨æ—§è½´ä¸‹ä¹Ÿå†™"忬¡æŒ‰è´¨åœ°å¸¦ä¼˜å…ˆ",与旧轴的实际次åºç›¸å。 +3. äº¤æŽ¥æ–‡æ¡£ä¸€æ®µæ²¡å†™ï¼Œè§„æ ¼ä¹¦å·¥ä½œåŒ…äº”ç¬¬ä¸‰æ¡æ²¡æœ‰å®Œæˆã€‚ + +ä¿®å¤å°åŒ…的规格写在《上线与ååŒé˜¶æ®µå·¥ä½œæ–¹æ¡ˆä¸Žè§„格书_2026-09-17》工作包甲。本记录åªå†™æ ¸å¯¹ç»“果与ç†ç”±ã€‚ + +--- + +## äºŒã€æˆ‘äº²æ‰‹è·‘å‡ºçš„è¯æ® + +**æœ¬åœ°å•æµ‹ï¼ˆå¼€å‘机,选股系统仓库)。** 五个文件末行全部 ALL OK:`test_plan_rank_axis.py`ã€`test_plan_quality_rank.py`ã€`test_card.py`ã€`test_pool_logic.py`ã€`test_plan_snapshot.py`。四个开关设旧值å†è·‘ `test_plan_rank_axis.py`ï¼Œä» ALL OKã€‚ä¸ƒä¸ªæ”¹åŠ¨çš„æ¨¡å— `py_compile` 通过。开å‘者说åªèƒ½åœ¨éƒ¨ç½²æœºè·‘çš„äº”ä¸ªæµ‹è¯•æ–‡ä»¶ï¼Œæˆ‘æœ¬æœºåŒæ ·è·‘ä¸èµ·æ¥ï¼ŒåŽŸå› ä¸Žä»–è¯´çš„ä¸€è‡´ï¼šç¼º `psycopg` 或 `fastapi`,或本机 Python 3.9 䏿”¯æŒè”åˆç±»åž‹æ³¨è§£ã€‚è¿™æ˜¯æ—¢æœ‰çŠ¶å†µï¼Œä¸æ˜¯æœ¬æ¬¡å¼•入。 + +一æ¡è¦è¯´æ˜Žï¼š`test_plan_snapshot.py` 里"拿真实快照é€è¡Œæ¯”对"那一例在本机是**跳过**çš„ï¼Œå› ä¸ºæœ¬æœºæ²¡æœ‰å¿«ç…§æ–‡ä»¶ã€‚å®ƒåªæœ‰åœ¨éƒ¨ç½²æœºä¸Šè·‘æ‰çœŸæ­£ç”Ÿæ•ˆã€‚必改一正是它会查出的那件事。 + +**æ—§è·¯å¾„ç­‰ä»·ï¼ˆå¼€å‘æœºï¼‰ã€‚** 入池的 `tier` 与 `candidate` 两个分支从内è”ä»£ç æŠ½æˆäº†çº¯å‡½æ•° `select_plan_rows`ã€‚æˆ‘ç”¨éšæœºåˆæˆçš„主榜行åšäº†ä¸‰ç™¾è½®å¯¹ç…§ï¼Œæ¯è½®å…­ç§ç»„åˆï¼ˆä¸¤ä¸ªæ¥æºä¹˜ä¸‰ç§æ¡£ä½ç™½åå•),新函数与旧内è”逻辑的输出零差异。 + +**部署机åªè¯»è¯»æ•°ï¼ˆé€‰è‚¡ç³»ç»Ÿæœºå™¨ï¼Œ09-16 快照)。** 仓库åœåœ¨ 3d3f317,与规格书基线一致。`.env` 里有 `POOL_TOP=50`ã€`POOL_MAX=100`ã€`CARD_REQUIRE_STARTED=0`,没有 `POOL_SOURCE`ã€`PLAN_RANK_AXIS`ã€`POOL_THEME_CAP`,所以拉代ç åŽé»˜è®¤å€¼ç›´æŽ¥ç”Ÿæ•ˆï¼Œä¸Žè§„格书第五节说的一致。 + +09-16 快照主榜全é‡äº”百三å二行。质地分布:好åå…­ã€ä¸­å››åå…«ã€å·®ä¸€ç™¾ä¸‰åå››ã€æ— è¯„æžä¸‰ç™¾ä¸‰å四。我按规格书的è¯å…¸åºåœ¨è¿™ä»½å¿«ç…§ä¸Šæ¨¡æ‹Ÿäº†ä¸€é质地åºï¼Œå‰äºŒå里好åå…­ã€ä¸­å››ã€‚å‰äºŒå里有六行没有传导主题,正好è½åœ¨"第六åªèµ·è¢«é™é¢é¡¶æŽ‰"çš„ä½ç½®ï¼Œè§„划代ç†é‚£æ¡å‘现在真实数æ®ä¸Šæˆç«‹ã€‚å‰äºŒå里"储能"主题五åªï¼Œæ­£å¥½ç¢°åˆ°é™é¢è¾¹ç•Œã€‚ + +"å·²å¯åЍæˆå‘˜"çš„è¡Œï¼ˆè¯æ®ç”±å·²åЍæˆå‘˜è§†å›¾è¡¥ä¸Šçš„行)全é‡å…«è¡Œï¼Œæ—§åºå次八å二ã€ä¸‰ç™¾äº”å三ã€ä¸‰ç™¾ä¹åã€å››ç™¾ä¹å一ã€äº”百ã€äº”百二åã€äº”百二åå…­ã€äº”百三å。旧åºå‰äºŒå里没有它们;模拟质地åºå‰äºŒå里有一行。这就是必改一在真实数æ®ä¸Šçš„æ ·å­ã€‚ + +--- + +## 三ã€é€é¡¹æ ¸å¯¹ + +按规格书第åèŠ‚çš„æ ¸å¯¹æ­¥éª¤é€æ¡è®°ã€‚ + +1. **diff 对照附录己的文件清å•。** å五个文件改动,全在清å•内。`factors.py` 与 `api.py` 没有出现在 `git show --stat` 里。清å•里的"交接文档"没有改,è§å¿…改三。 +2. **本地跑测试文件。** è§ç¬¬äºŒèŠ‚ã€‚ +3. **四个开关设旧值时的é€å­—å›žæ—§æ–­è¨€æ˜¯ä¸æ˜¯çœŸæ–­è¨€ã€‚** 是,但覆盖方å¼è¦è¯´æ¸…ã€‚ç¬¬ä¸€ä¾‹åªæ–­è¨€ `_rerank` 在旧轴下与 09-14 çš„ `_rerank_by_quality` åºåˆ—与分值é€å­—相åŒï¼Œå®ƒéªŒçš„æ˜¯åˆ†æ´¾ã€‚å¦å¤–ä¸‰ä¸ªå¼€å…³å„æœ‰è‡ªå·±çš„æ—§è·¯å¾„断言:入池旧路径由我的三百轮对照补上,评æžåå•çš„ `score` 分支是第七例,å¡å†…åºå…³æŽ‰æ˜¯ç¬¬å…«ä¾‹ï¼Œä¸»é¢˜é™é¢ä¾‹å¤–关掉是第ä¹ä¾‹ã€‚å››æ¡åˆèµ·æ¥æ‰æ˜¯"四开关é€å­—回旧"。 +4. **主题é™é¢çš„例外åªåœ¨è´¨åœ°è½´ä¸‹ç”Ÿæ•ˆã€‚** æ˜¯ã€‚è£…é…æ—¶æŒ‰ `config.PLAN_RANK_AXIS` 传入,快照路按行上的 `rank_axis` æŽ¨æ–­ã€‚å›žé€€é‚£å¤©è¯»æ—§å¿«ç…§ä»æŒ‰è´¨åœ°è½´æˆªå–,这是对的,因为那份快照的åºå°±æ˜¯è´¨åœ°åºã€‚但两æ¡è·¯å¯¹"å·²å¯åЍæˆå‘˜"的判定ä¸ä¸€è‡´ï¼Œè§å¿…改一。 +5. **å¡å†…åºã€å…¥æ± ã€è¯„æžåå•三处的次级键与去é‡ã€‚** å¡å†…åºåœ¨åˆ¤å†³ä¸Žæ¶¨å¹…之间æ’入负的质地带,关掉时元组与旧实现é€å­—相åŒã€‚入池 `rank` æºåªå–被指å‘çš„è¡Œã€æŒ‰æ–°åºæˆªå‰äº”å,备用开关并进旧åºå¼ºä¼ å¯¼å‰äº”åã€åŽ»é‡ã€å— `POOL_MAX` 兜底。评æžåå•两路并集去é‡åŽæŒ‰æ–°åºå次排,`score` 分支按原始分。三处都有确定的末ä½é”®ã€‚ +6. **`_row` åªåŠ é”®ã€‚** 是。加了 `quality_band`ã€`rank_axis`ã€`pointed` 三键,质地轴下å†åŠ  `rank_old`。`score`ã€`score_adj`ã€`tier` 的值与å«ä¹‰æ²¡æœ‰å˜ã€‚顶层 `encoding` 的值å˜äº†ï¼Œè§å¿…改二。 +7. **分数编ç ã€‚** `factors.py` 一字未动。组内分从原始分å解,档ä½ç”¨æ•´é™¤ï¼Œä¸Žç¼–ç ä¸€è‡´ï¼Œæˆ‘é€ä¸ªåŒºé—´éªŒè¿‡ã€‚ +8. **æ—§åºå次。** `rank_old` å–自全é‡åºï¼Œä¸æ˜¯æˆªæ–­åŽçš„åºã€‚主榜与观察档两个åºåˆ—的代ç ä¸é‡å ï¼Œä¸¤å¼ å次表åˆå¹¶ä¸ä¼šäº’相覆盖。 +9. **一百二å天守å«ã€‚** å®ˆå«æ˜¯æ´»çš„ï¼šè¯„æžæ‘˜è¦é‡Œçš„ `age_days` ç”±æ•°æ®æ—¥å‡æŠ¥å‘Šè¿è¡Œæ—¥ç®—出,å–值真实。守å«å¯¹è´¨åœ°å¸¦ã€è´¨åœ°é—¨ã€å¡å†…åºä¸‰å¤„生效。它**ä¸å¯¹**旧轴的加å‡å…«åˆ†ç”Ÿæ•ˆï¼Œ`score_adj` 也ä¸å—守å«ã€‚这与规格书第五节表里那一行的写法ä¸ä¸€è‡´ï¼Œä½†ä»£ç æ˜¯å¯¹çš„ï¼Œå› ä¸ºè§„æ ¼ä¹¦äº¤ä»˜è¦æ±‚第四æ¡è¦æ±‚ `score_adj` 的值ä¸å˜ã€‚规格书这一行我已改正,è§ç¬¬äº”节建议三。 +10. **入池ä¸å˜å¼çš„验è¯å‘½ä»¤æ˜¯å¦æˆç«‹ã€‚** æˆç«‹ã€‚入池走 `plan.collect` è¦äº”百行的宽池ã€ä¸»é¢˜é™é¢å– `POOL_THEME_CAP`(默认零),å†äº¤ç»™çº¯å‡½æ•°é€‰è¡Œï¼›è§„格书第六节那æ¡å‘½ä»¤æ‹¿å¿«ç…§å…¨é‡è¡Œå–‚åŒä¸€ä¸ªçº¯å‡½æ•°ï¼Œä¸¤è¾¹çœ‹åˆ°çš„æ˜¯åŒä¸€ä¸ªåºã€‚ +11. **评æžç›®æ ‡å啿‹¿åˆ°çš„æ˜¯å…¨é‡è¡Œã€‚** 是。`persist` 收到的是è½ç›˜å¿«ç…§ï¼Œ`main` æ˜¯å…¨é‡æ–°åºè¡Œï¼Œæ¯è¡Œå¸¦åŽŸå§‹åˆ†ä¸Žæ–°åºå次。 +12. **周报的底本。** 周报ä¸è¯»å¿«ç…§ï¼Œå®ƒç”¨ `plan.collect` æŠŠå½“æ—¥é‡æ–°è£…é…一éå†å–å…¨é‡è¡Œã€‚两份对照åå•都从这份é‡ç®—å–ã€‚è¿™æ˜¯æ—¢æœ‰åšæ³•ï¼Œä¸æ˜¯æœ¬æ¬¡å¼•å…¥ï¼Œä½†å®ƒå†³å®šäº†å››å‘¨å¤æ ¸è¯»åˆ°çš„æ˜¯ä»€ä¹ˆï¼Œè§ç¬¬å…­èŠ‚æ‹æ¿é¡¹ã€‚ + +--- + +## å››ã€å¿…改 + +### 必改一:装é…路与快照路对"å·²å¯åЍæˆå‘˜"的主题é™é¢åˆ¤å®šä¸ä¸€è‡´ + +**是什么。** ä¸»æ¦œæˆªå–æœ‰ä¸¤æ¡è·¯ã€‚装é…路是 `collect` 里的内部函数 `_pick`,早上出计划时用它截主榜å‰äºŒå,写进 md 与快照的 `main_shown`。快照路是模å—级函数 `pick_rows`,接å£è¯»å¿«ç…§æ—¶ç”¨å®ƒæŒ‰è¯·æ±‚傿•°æˆªå–,æŒä»“管ç†ç³»ç»Ÿè¦çš„三百åªå‰ç¼€ä»Žè¿™é‡Œæ¥ã€‚两æ¡è·¯æœ¬è¯¥åŒä¸€å¥—规则,`test_plan_snapshot.py` 拿真实快照é€è¡Œæ¯”对钉ä½è¿™ä»¶äº‹ã€‚ + +这次的例外判定在两æ¡è·¯ä¸Šå†™æ³•ä¸åŒã€‚装é…路看的是传导视图有没有这åªç¥¨çš„è¯æ®è¡Œï¼šæ²¡æœ‰è¯æ®è¡Œå°±å½“无主题ã€å…é™é¢ã€‚快照路看的是行上的 `evidence.theme`:没有主题æ‰å…é™é¢ã€‚差别出在"å·²å¯åЍæˆå‘˜"上。已å¯åЍæˆå‘˜åœ¨ä¼ å¯¼è§†å›¾é‡Œæ²¡æœ‰è¯æ®è¡Œï¼Œä½†è£…é…æ—¶ `_row` 会用已动æˆå‘˜è§†å›¾çš„目标环节把 `evidence.theme` 补上(`plan.py` 约 550 行)。于是åŒä¸€åªå·²å¯åЍæˆå‘˜ï¼Œè£…é…路把它当无主题å…é™é¢ã€ä¸è®¡æ•°ï¼Œå¿«ç…§è·¯æŠŠå®ƒç®—进所在主题ã€å—é™é¢ã€‚ + +**ä¸ºä»€ä¹ˆä»¥å‰æ²¡ç‚¸ã€‚** æ—§åºä¸‹è¿™äº›è¡ŒæŽ’在八åå以åŽï¼Œç¢°ä¸åˆ°å‰äºŒåçš„é™é¢ã€‚旧代ç é‡Œä¸¤æ¡è·¯å¯¹å®ƒä»¬å…¶å®žä¹Ÿä¸ä¸€è‡´ï¼ˆè£…é…路把它们归进"无传导"æ¡¶è®¡æ•°ï¼Œå¿«ç…§è·¯å½’è¿›æ‰€åœ¨ä¸»é¢˜ï¼‰ï¼Œåªæ˜¯ä¸å½±å“å‰äºŒåã€‚è´¨åœ°åºæŠŠè¢«æŒ‡å‘的已å¯åЍæˆå‘˜æåˆ°äº†å‰åˆ—,09-16 快照模拟出æ¥å‰äºŒå里有一行,"储能"åˆæ­£å¥½äº”åªç¢°åˆ°è¾¹ç•Œï¼Œå·®ä¸€åªå°±ä¼šè®©ä¸¤æ¡è·¯ç»™å‡ºä¸åŒçš„第二åå。 + +**åŽæžœã€‚** åŒä¸€å¤©ï¼Œmd 与快照里的 `main_shown` 是一份å‰äºŒå,接å£ç»™æŒä»“管ç†ç³»ç»Ÿçš„æ˜¯å¦ä¸€ä»½ã€‚规格书第二节"åŒæ—¥é‡è·‘结果一致"è¿™æ¡åŽŸåˆ™åœ¨ä¸¤æ¡è·¯ä¹‹é—´å¤±å®ˆã€‚部署机上跑 `test_plan_snapshot.py` 会在第一个出事的交易日å˜çº¢ã€‚ + +**修法。** ä¸åœ¨ä¸¤å¤„儿‰“è¡¥ä¸ï¼Œæ”¹æˆä¸€å¤„实现两处调用:把"按主题é™é¢æˆªå–"æŠ½æˆæ¨¡å—级纯函数,装é…è·¯ä¸Žå¿«ç…§è·¯éƒ½è°ƒå®ƒï¼Œä¸»é¢˜çš„å–æ³•与 `_row` 写 `evidence` çš„å–æ³•åŒæºï¼ˆå«å·²åЍæˆå‘˜è§†å›¾çš„补充)。这样装é…路对已å¯åЍæˆå‘˜çš„åˆ¤å®šä¹Ÿå˜æˆ"算进所在主题"ï¼Œä¸Žå¿«ç…§è·¯ä¸€è‡´ã€‚è¿™ä¸€æ­¥åŒæ—¶æ”¹æ­£äº†æ—§è½´ä¸‹çš„æ—¢æœ‰åˆ†æ­§ï¼Œæ”¹çš„åªæ˜¯ md 与 `main_shown` è¿™æ¡è·¯å¯¹å·²å¯åЍæˆå‘˜çš„计数,接å£è·¯ï¼ˆæŒä»“管ç†ç³»ç»Ÿè¯»çš„é‚£æ¡ï¼‰åŽŸæ ·ä¸åŠ¨ã€‚é€å­—å›žæ—§é‚£ä¸€ä¾‹å•æµ‹ä¸å—å½±å“ã€‚ç»†èŠ‚ä¸Žå•æµ‹åœ¨å·¥ä½œæ–¹æ¡ˆé™„录甲。 + +### 必改二:`encoding` å¥åœ¨æ—§è½´ä¸‹å†™é”™äº† + +`collect` 返回的 `encoding` 䏀奿— æ¡ä»¶è¿½åŠ äº†"忬¡æŒ‰è´¨åœ°å¸¦ä¼˜å…ˆï¼Œä¼ å¯¼åªåœ¨å¸¦å†…作次级键(开关 PLAN_RANK_AXIS)"ã€‚æ—§è½´ä¸‹åæ¬¡ä¸æŒ‰è´¨åœ°å¸¦ä¼˜å…ˆï¼Œè¿™å¥è¯ä¸Žå®žé™…相å。æŒä»“管ç†ç³»ç»ŸæŠŠè¿™å¥åŽŸæ ·æ”¶è¿›å®ƒçš„çŠ¶æ€é¡µç»™äººçœ‹ã€‚修法是åªåœ¨è´¨åœ°è½´ä¸‹è¿½åŠ ï¼Œæˆ–æŠŠå¥å­æ”¹æˆæ¡ä»¶å¼å†™æ³•。一行改动。 + +### 必改三:交接文档一段没写 + +规格书工作包五第三æ¡è¦æ±‚äº¤æŽ¥æ–‡æ¡£ä¸€æ®µå¹¶å››ä»“åº“åŒæ­¥ï¼Œæäº¤é‡Œæ²¡æœ‰ã€‚修法是在最新一份交接文档 `docs/交接_2026-09-10.md` 末尾加一节带日期的补记,把å°è´¦é‚£ä¸€è¡Œä»Ž"最新到第 057 æ¡"æ”¹æˆ 063ï¼Œå››ä»“åº“åŒæ­¥ã€‚交接段的骨架在工作方案附录甲。 + +--- + +## 五ã€å»ºè®®çº§ï¼ˆä¸é˜»å¡žï¼‰ + +1. **评æžåå• `score` åˆ†æ”¯ä¸æ˜¯é€å­—回旧。** 旧代ç å–å¿«ç…§åºå‰ä¸€ç™¾ï¼Œå¿«ç…§åºæ˜¯ 09-14 的调整分åºï¼›æ–°ä»£ç æŒ‰åŽŸå§‹åˆ†æŽ’å‰ä¸€ç™¾ã€‚差别åªåœ¨ç¬¬ä¸€ç™¾å附近被加å‡å…«åˆ†æŒªåŠ¨çš„å‡ åªã€‚评æžåå•åªç®¡è¦†ç›–ï¼Œè¿™ç‚¹å·®åˆ«æ²¡æœ‰åŽæžœã€‚䏿”¹ï¼Œè®°åœ¨è¿™é‡Œã€‚ +2. **两处å°ç‘•疵。** `_rerank_by_axis` çš„ `axis` 傿•°æ²¡æœ‰ç”¨åˆ°ï¼›`card.sort_key` 在函数体内导入 `config`。都ä¸å½±å“行为。 +3. **规格书两处文字改正。** 第五节表里 `COMPANY_REVIEW_STALE_DAYS` 那一行说守å«å¯¹åŠ å‡åˆ†ä¹Ÿç”Ÿæ•ˆï¼Œå·¥ä½œåŒ…二第二æ¡è¯´"也ä¸å†åŠ å‡åˆ†",与代ç å’Œäº¤ä»˜è¦æ±‚第四æ¡çŸ›ç›¾ï¼ŒæŒ‰ä»£ç æ”¹æ­£ã€‚附录乙说周报"从快照 `_full` 读主榜行",实际是现算åŽå– `_full`ï¼ŒæŒ‰å®žé™…æ”¹æ­£ã€‚è¿™ä¸¤å¤„æˆ‘å·²ç»æ”¹åœ¨è§„æ ¼ä¹¦é‡Œï¼Œéšæœ¬è®°å½•åŒæ­¥ã€‚ +4. **周报里"主榜新åºå‰äºŒå"对改动å‰çš„æ—¥å­ã€‚** 09-25 周报的窗å£å« 09-18 与 09-21 ä¸¤ä¸ªæ—§åºæ—¥ï¼Œé‚£ä¸¤å¤©è¿™ä¸€è¡Œçš„åå•其实就是旧åºå‰äºŒå,标签会略有误导。旧åºåå•那一行对这两天正确地跳过了。周报一段注记å³å¯ï¼Œä¸æ”¹ä»£ç ã€‚ + +--- + +## å…­ã€æ‹æ¿é¡¹ï¼šå‘¨æŠ¥çš„底本 + +周报用 `plan.collect` 把æ¯ä¸ªè®¡åˆ’æ—¥é‡æ–°è£…é…一éï¼Œè€Œä¸æ˜¯è¯»å½“天è½ç›˜çš„å¿«ç…§ã€‚é‡æ–°è£…é…ç”¨çš„æ˜¯è·‘å‘¨æŠ¥é‚£ä¸€åˆ»çš„è¯„æžæŠ¥å‘Šï¼šæŸ¥è¯¢å–æ¯åªç¥¨æœ€æ–°ä¸€æ¬¡è¿è¡Œï¼Œä¸æŒ‰æ—¥æœŸæˆªæ–­ã€‚于是 09-22 çš„"æ–°åºå‰äºŒå"在 09-25 ç®—å‡ºæ¥æ—¶ï¼Œç”¨çš„æ˜¯ 09-25 手里的质地档。一家 09-24 æ‰æœ‰æŠ¥å‘Šçš„å…¬å¸ï¼Œä¼šè¢«å›žå¤´ç®—è¿› 09-22 çš„å‰åˆ—。 + +这在质地是次级项的时候是å°äº‹ï¼Œåœ¨è´¨åœ°æˆä¸ºä¸»è½´ä¹‹åŽä¸æ˜¯ã€‚四呍夿 ¸æ¯”的是"æ–°åºå‰äºŒå与旧åºå‰äºŒåè°æ›´å¥½",两份åå•都应该是当天真正出过的那份。快照è½ç›˜æ—¶çš„æ³¨é‡Šå†™ç€"它是å¤ç›˜ä¸Žå¯¹è´¦çš„唯一底本"ï¼Œå‘¨æŠ¥å´æ²¡æœ‰è¯»å®ƒã€‚ + +我的建议是周报改æˆå…ˆè¯»å½“日快照的全é‡è¡Œï¼Œæ²¡æœ‰å¿«ç…§çš„æ—¥å­æ‰å›žè½åˆ°é‡æ–°è£…é…,加一个开关默认读快照。改动å°ï¼Œä½†å®ƒæ”¹å˜å‘¨æŠ¥æ‰€æœ‰æ—¢æœ‰åå•çš„å–æ•°æ–¹å¼ï¼Œä»Ž 09-02 有快照那天起的读数会与旧周报的å£å¾„ä¸åŒï¼Œæ‰€ä»¥è¦ç”¨æˆ·æ‹æ¿ã€‚å†™åœ¨å·¥ä½œæ–¹æ¡ˆå·¥ä½œåŒ…ä¸™ä¸Žæ‹æ¿ç‚¹ä¸€ã€‚ + +--- + +## 七ã€ç­”å¼€å‘者的两个问题 + +**è¦ä¸è¦çŽ°åœ¨æŽ¨é€ã€‚** å¤å®¡å·²ç»åšå®Œï¼Œä¸å¿…ç­‰ 09-19。æäº¤ 4d7ca55 æˆ‘éšæœ¬è®°å½•一起推到远端,修å¤å°åŒ…在它上é¢å†æä¸€ä¸ªã€‚选股系统机器åªåœ¨ 09-21 收盘åŽç”±äººæ‹‰ä»£ç ï¼Œä¸­é—´è¿œç«¯æœ‰ä¸€ä¸ªå¾…修的æäº¤æ²¡æœ‰é£Žé™©ã€‚ + +**è¦ä¸è¦çŽ°åœ¨è¡¥äº¤æŽ¥æ®µã€‚** è¦ï¼Œæ”¾è¿›ä¿®å¤å°åŒ…,与必改一ã€å¿…改二åŒä¸€ä¸ªæäº¤ã€‚ + +--- + +## å…«ã€é™„:文件清å•对照 + +æäº¤æ”¹äº†å五个文件:`plan.py`ã€`card.py`ã€`pool.py`ã€`review_targets.py`ã€`plan_review.py`ã€`plan_reconcile.py`ã€`config.py`ã€`.env.example`ã€`README.md`ã€`docs/å¤ç›˜å†³å®šå°è´¦.md`ã€`docs/选股计划入池_对接说明.md`ã€`docs/选股说明_下游对接.md`ã€æ–° `test_plan_rank_axis.py`ã€`test_plan_quality_rank.py`ã€`test_plan_snapshot.py`。附录己清å•里åªå·®äº¤æŽ¥æ–‡æ¡£ã€‚清å•外没有文件被动。 diff --git a/docs/选股计划调整方案_2026-09-17.md b/docs/选股计划调整方案_2026-09-17.md index 8e931bf..723a441 100644 --- a/docs/选股计划调整方案_2026-09-17.md +++ b/docs/选股计划调整方案_2026-09-17.md @@ -36,7 +36,7 @@ 沿用五æ¡ï¼šåР䏿”¹ï¼›å¼€å…³å…³æŽ‰é€å­—å›žæ—§ï¼›åŒæ—¥é‡è·‘结果一致;ä¸åšå›žæµ‹ã€å› å­åˆæˆã€IC;评价åªç”¨å€™é€‰å•å¤ç›˜å‘¨æŠ¥ã€‚本方案å†åР䏉æ¡ã€‚ 1. 分数编ç ä¸åŠ¨ã€‚`factors.py` 里"主榜分等于二百加档ä½ä¹˜äºŒå加组内分"çš„ç¼–ç æ³¨å†Œåœ¨å¤–部平å°å½“å› å­ï¼Œæ”¹å®ƒä¼šæ±¡æŸ“å¹³å°çš„å› å­åކå²ã€‚次åºçš„æ”¹åŠ¨å…¨éƒ¨æ”¾åœ¨è®¡åˆ’è£…é…这一层,与 09-14 é‚£æ¬¡è´¨åœ°é‡æŽ’ï¼ˆå°è´¦ 058)åŒä¸€ä¸ªè½ç‚¹ã€‚ -2. 质地åªè®¤æ–°é²œçš„æŠ¥å‘Šã€‚质地进任何判决或排åºéƒ½å—åŒä¸€ä¸ªæ–°é²œåº¦å®ˆå«ï¼ˆä¸€ç™¾äºŒå天),与逻辑状æ€ç¬¬äº”路和æŒä»“管ç†ç³»ç»Ÿçš„基本é¢ç«‹åœºåŒå£å¾„。今天质地门与加å‡å…«åˆ†ä¸çœ‹æ—¥é¾„,是一处ä¸ä¸€è‡´ï¼Œé¡ºæ‰‹å¯¹é½ã€‚ +2. 质地åªè®¤æ–°é²œçš„æŠ¥å‘Šã€‚质地进任何判决或排åºéƒ½å—åŒä¸€ä¸ªæ–°é²œåº¦å®ˆå«ï¼ˆä¸€ç™¾äºŒå天),与逻辑状æ€ç¬¬äº”路和æŒä»“管ç†ç³»ç»Ÿçš„基本é¢ç«‹åœºåŒå£å¾„。今天质地门与加å‡å…«åˆ†ä¸çœ‹æ—¥é¾„,是一处ä¸ä¸€è‡´ï¼›è´¨åœ°é—¨é¡ºæ‰‹å¯¹é½ï¼Œæ—§è½´çš„加å‡å…«åˆ†ä¿æŒåŽŸæ ·ï¼ˆ09-17 å¤å®¡ä¿®è®¢ï¼Œè§ç¬¬äº”节表)。 3. 评æžè¦†ç›–ä¸èƒ½è¢«æŽ’åºè½´é”死。评æžç›®æ ‡åå•如果åªå–æ–°åºå‰ä¸€ç™¾ï¼Œæ–°è¢«æŒ‡å‘çš„å…¬å¸æ°¸è¿œæŽ’在已评æžå…¬å¸åŽé¢ï¼Œæ°¸è¿œå¾—ä¸åˆ°æŠ¥å‘Šã€‚åå•è¦ä¸ŽæŽ’åºè½´è§£è€¦ã€‚ --- @@ -68,7 +68,7 @@ **åšä»€ä¹ˆã€‚** 三门槛ã€ä¸€ç¡®è®¤ã€ä¸‰é£Žé™©ä¸€ä¸ªå­—ä¸åŠ¨ï¼ˆç”Ÿäº§ä¸Šé—¨æ§›äºŒ"å·²å¯åЍ"本æ¥å°±å…³ç€ï¼‰ã€‚改两处。 1. å¡å†…åºä»Ž"先判决ã€å†å½“日涨幅"改æˆ"先判决ã€å†è´¨åœ°å¸¦ã€å†å½“日涨幅"。候选å•与关注å•çš„åæ¬¡ç”±æ­¤å˜æˆè´¨åœ°ä¼˜å…ˆã€‚开关 `CARD_SORT_BY_QUALITY`,默认开,关掉回旧åºã€‚ -2. 质地门"å·®é™å…³æ³¨"与工作包一的质地带共用åŒä¸€ä¸ªåˆ¤å®šå‡½æ•°ï¼Œå¸¦ä¸Šä¸€ç™¾äºŒå天守å«ï¼›è¶…期报告ä¸å†é™æ¡£ï¼Œä¹Ÿä¸å†åŠ å‡åˆ†ã€‚ +2. 质地门"å·®é™å…³æ³¨"与工作包一的质地带共用åŒä¸€ä¸ªåˆ¤å®šå‡½æ•°ï¼Œå¸¦ä¸Šä¸€ç™¾äºŒå天守å«ï¼›è¶…期报告ä¸å†é™æ¡£ã€‚旧轴下的加å‡å…«åˆ†ä¿æŒ 09-14 原样,ä¸åŠ å®ˆå«ï¼ˆ09-17 å¤å®¡ä¿®è®¢ï¼Œç†ç”±è§ç¬¬äº”节表)。 **ä¸ºä»€ä¹ˆä¸æŠŠè´¨åœ°å‡æˆé—¨æ§›ã€‚** 无评æžçš„å…¬å¸è¿˜èƒ½è¿›å€™é€‰ï¼ˆæŽ’在åŽé¢ï¼‰ï¼Œæ˜¯ä¸ºäº†ä¸è®©è¯„æžè¦†ç›–ä¸åˆ°çš„æ–°å…¬å¸è¢«ç³»ç»Ÿæ€§æŽ’除。质地差已ç»è¿›ä¸äº†å€™é€‰ï¼Œç­‰ä»·äºŽé—¨æ§›ï¼Œä¸å¿…冿”¹åˆ¤å†³é€»è¾‘。 @@ -101,7 +101,7 @@ | 日期 | 星期 | åšä»€ä¹ˆ | |---|---|---| | 09-17 到 09-18 | 三到四 | å¼€å‘äº”ä¸ªå·¥ä½œåŒ…ï¼Œæœ¬åœ°å•æµ‹å…¨ç»¿ï¼Œä¸€ä¸ªæäº¤ï¼Œäº¤ç¬¬åèŠ‚çš„è¯æ® | -| 09-19 | å…­ | 我å¤å®¡ | +| 09-19 | å…­ | 原定我å¤å®¡ã€‚实际 09-17 å·²å¤å®¡ï¼ˆ`docs/评审记录_2026-09-17.md`),修å¤å°åŒ… 09-18 å¤å®¡ | | 09-21 | 一 | 收盘åŽé€‰è‚¡ç³»ç»Ÿæœºå™¨æ‹‰ä»£ç ï¼Œæ¬¡æ—¥ 07:10 的计划就是新åºï¼ˆç›˜å‰é“¾æ¯æ­¥éƒ½æ˜¯å­è¿›ç¨‹ï¼Œè¯»æŒ‚载目录里的新代ç ï¼‰ã€‚接å£å®¹å™¨ä»å»ºè®®åŒçª—é‡å¯ä¸€æ¬¡å¹¶é¢„热计划接å£ï¼Œç»å®¡æ‰¹ã€é¿å¼€ä¸ƒç‚¹åˆ°ä¸ƒç‚¹åŠä¸Žå…«ç‚¹åŠåˆ°ä¹ç‚¹é›¶äº”:接å£è¿›ç¨‹å†…存里æŒç€æ—§çš„装é…代ç ï¼ŒJSON 走快照直通没问题,但 md æ ¼å¼çš„主榜表与快照读ä¸åˆ°æ—¶çš„实时回è½ä¼šèµ°æ—§åº | | 09-22 | 二 | 第一份新åºè®¡åˆ’。看候选å•ã€å‰ä¸‰ååã€å…¥æ± åå•三处读数,交回 | | 09-25 | 五 | 第一次带两份åå•对照的周报(二å点å分由基座触å‘) | @@ -119,7 +119,7 @@ | `CARD_SORT_BY_QUALITY` | 1 | å¡å†…åºå…ˆè´¨åœ°å¸¦ï¼›0 回"å…ˆåˆ¤å†³å†æ¶¨å¹…" | | `POOL_SOURCE` | rank | 新增å–值;tier 与 candidate ä¿ç•™ | | `REVIEW_TARGETS_AXIS` | both | score 回"åªæŒ‰åŽŸå§‹åˆ†å‰ä¸€ç™¾" | -| `COMPANY_REVIEW_STALE_DAYS` | 120 | 已有;从此对质地带ã€è´¨åœ°é—¨ã€åŠ å‡åˆ†éƒ½ç”Ÿæ•ˆ | +| `COMPANY_REVIEW_STALE_DAYS` | 120 | 已有;从此对质地带ã€è´¨åœ°é—¨ã€å¡å†…åºç”Ÿæ•ˆã€‚旧轴的加å‡å…«åˆ†ä¸åŠ å®ˆå«ï¼Œå› ä¸º `score_adj` çš„å€¼è¦æ±‚ä¸å˜ï¼ˆ09-17 å¤å®¡ä¿®è®¢ï¼‰ | | `PLAN_QUALITY_BONUS` | 8 | 已有;åªåœ¨ transmission 轴下起作用 | | `POOL_RANK_KEEP_OLD` | 0 | 备用:旧åºå¼ºä¼ å¯¼å‰äº”å并进池,åªåœ¨"池包å«å€™é€‰"ä¸å˜å¼æ ¸ä¸è¿‡æ—¶æ‰“å¼€ | @@ -255,7 +255,7 @@ cd ~/project/akg-factor-bridge && grep -n "æ–°åºå‰äºŒå\|æ—§åºå‰äºŒå\|æ¡£ - `pool.py` 约 293 到 301 行:把选行那段抽æˆçº¯å‡½æ•° `select_plan_rows(main_rows, top, source, tiers, keep_old=False)`ï¼Œç¦»çº¿å¯æµ‹ã€‚`rank` 分支:`[r for r in main_rows if r.get("pointed")][:top]`,`_pool_source` è®° `rank_top`ï¼›`keep_old` 为真时å†å¹¶è¿›æŒ‰ `rank_old` æŽ’çš„å¼ºä¼ å¯¼å‰ `top`,去é‡ï¼Œ`_pool_source` è®° `rank_old_strong`ï¼Œæ€»æ•°å— `POOL_MAX` 兜底;`tier` 与 `candidate` 分支é€å­—ä¿ç•™ã€‚入池上下文 `strategy_context_entry` åªåŠ  `quality_band`ã€`rank_axis`ã€`rank_old` 三键。 - `plan_reconcile.py` 的应答加 `rank_axis: "transmission"` 一键,文案ä¸åŠ¨ã€‚ - `review_targets.py` 约 14 到 15 行与 `build_rows`:`persist(date, snap)` 拿到的 `snap["main"]` 已是新åºçš„全部行,æ¯è¡Œå¸¦ `score` 与 `rank`。`both` 时主榜åå•å–"按 `score` é™åºå‰ä¸€ç™¾"与"按 `rank` å‡åºå‰äº”å"的并集,去é‡åŽæŒ‰ `rank` 排;`score` æ—¶åªå–按 `score` é™åºå‰ä¸€ç™¾ï¼ˆé€å­—回旧)。观察档照旧å‰äºŒå。 -- `plan_review.py` 约 378 到 384 行从快照 `_full` 读主榜行;约 419 行附近加两份åå•"主榜新åºå‰äºŒå"(按 `rank`)与"主榜旧åºå‰äºŒå"(按 `rank_old`,缺该键的旧快照跳过这两份åå•);约 431 到 436 行的档ä½åˆ†ç»„外å†åŠ æ¡£ä½ä¹˜è´¨åœ°å¸¦çš„交å‰åˆ†ç»„,分组å写"æ¡£ä½Ã—质地=强传导×好"这样;`compare_table` ä¸åŠ¨ã€‚ +- `plan_review.py` 约 374 行用 `plan.collect` æŠŠå½“æ—¥é‡æ–°è£…é…一éå†å– `_full`ï¼ˆä¸æ˜¯è¯»å¿«ç…§ï¼›æ”¹è¯»å¿«ç…§è§ã€Šä¸Šçº¿ä¸ŽååŒé˜¶æ®µå·¥ä½œæ–¹æ¡ˆä¸Žè§„格书_2026-09-17》工作包丙);约 419 行附近加两份åå•"主榜新åºå‰äºŒå"(按 `rank`)与"主榜旧åºå‰äºŒå"(按 `rank_old`,缺该键的旧快照跳过这两份åå•);约 431 到 436 行的档ä½åˆ†ç»„外å†åŠ æ¡£ä½ä¹˜è´¨åœ°å¸¦çš„交å‰åˆ†ç»„,分组å写"æ¡£ä½Ã—质地=强传导×好"这样;`compare_table` ä¸åŠ¨ã€‚ ## 附录丙(å¯ä¸è¯»ï¼‰ï¼šå•测清å•