From 5c6922a74ce7a631f1d8aed69383f30e98845ec0 Mon Sep 17 00:00:00 2001 From: zlt Date: Wed, 2 Sep 2026 17:46:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=8D=E7=9B=98=E5=8F=A3=E5=BE=84=E5=9B=9B?= =?UTF-8?q?=E6=9D=A1=EF=BC=88=E5=8F=B0=E8=B4=A6=20010=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E4=BA=A4=E4=BB=98=E5=90=8D=E5=8D=95=E6=94=B9=E5=90=8D=E3=80=81?= =?UTF-8?q?=E6=97=A0=E5=BF=AB=E7=85=A7=E6=97=A5=E5=89=94=E9=99=A4=E3=80=81?= =?UTF-8?q?=E4=B8=A4=E6=A1=A3=E6=A0=B7=E6=9C=AC=E7=BA=AA=E5=BE=8B=EF=BC=9B?= =?UTF-8?q?=E5=8F=B0=E8=B4=A6=E9=87=8D=E6=8E=92=E7=BC=96=E5=8F=B7=E5=B9=B6?= =?UTF-8?q?=E5=8A=A0=20008=20=E8=87=B3=20011=EF=BC=9B=E4=BA=BA=E5=B7=A5?= =?UTF-8?q?=E8=A3=81=E5=86=B3=E4=BD=BF=E7=94=A8=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5.1 --- docs/人工裁决看什么_2026-09-02.md | 35 ++++++++++++++++++++++++++ docs/复盘决定台账.md | 42 ++++++++++++++++++++----------- plan_review.py | 9 ++++--- 3 files changed, 68 insertions(+), 18 deletions(-) create mode 100644 docs/人工裁决看什么_2026-09-02.md diff --git a/docs/人工裁决看什么_2026-09-02.md b/docs/人工裁决看什么_2026-09-02.md new file mode 100644 index 0000000..1a84075 --- /dev/null +++ b/docs/人工裁决看什么_2026-09-02.md @@ -0,0 +1,35 @@ +# 人工裁决看什么(过渡期使用说明,2026-09-02) + +这份说明给裁决 PMS 新建仓提议的人看。PMS 自 09-02 起新建仓只提议不自动执行;它送来的提议全部来自桥的强传导档,而这一档过去一个月五日超额约负 2 个百分点、跑赢比例三成三。所以裁决的默认答案是"不进",只有桥当日计划里判为"候选"的票才考虑批。台账 011 记了这条原则。 + +## 一、在哪里看 + +桥的当日计划有两种形式,都在 155 的桥接口上。 + +- Markdown:浏览器打开 `http://192.168.16.155:8300/plan?format=md`。看"候选单""关注环节""关注单"三节。09-03 起可用。 +- JSON:`http://192.168.16.155:8300/plan?top=300&obs_top=100&theme_cap=999`,让上游不裁剪。每行带判决字段。这一形式要等桥容器重启加载新接口代码后才带新字段。 + +PMS 的面板不显示判决,它只读排名、代码、分数、档位、预期空间。所以人必须另开桥的计划看。 + +## 二、逐票看五样东西 + +第一,判决(verdict)。三个值:候选、关注、仅展示。只有"候选"进入考虑范围。强传导档里大多数票会是"仅展示",未过项通常是"未启动",这本身就是拒的理由。 + +第二,理由(reasons)。候选的四条理由是:所在环节被几路传导指向;数据日涨幅是多少(已启动);明确吸筹的评分与评分日龄;券商覆盖与预期空间。预期空间超过 100% 按噪音看。 + +第三,硬风险(risk)。三条里有任一条就拒:决策系统昨夜信号是 SELL、AVOID 或 DROPPED;传导快照日与计划日不符;吸筹评分为高位派发。 + +第四,缺失(missing)。"无吸筹评分"表示这只票不在决策系统夜间分析池里,没有资金结构读数,不当候选看。"评分陈旧 N 日"表示评分超过三十个交易日,同样不当候选看。 + +第五,关注环节一节。看这只票所在环节的已启动成员数、领涨者与涨幅。环节里已启动的比例很高时,说明这一轮可能已到尾声,即使是候选也要更谨慎。这一节回答的是"刚启动还是尾声"。 + +## 三、不看什么,不做什么 + +- 环境标签(八个指数里弱势的个数)只当背景,不当规则。它还没有验证过预测力。 +- "关注"判决的票不批。关注桶里混着只差覆盖、已动但缺确认、潜在吸筹三种情况,没有一种有稳定的正证据。 +- 决策系统昨夜的 BUY 信号可以看,但它不改变资格。 +- 不用桥的读数定持有期、止损或仓位,那些留给 PMS 自己的旋钮。 + +## 四、留痕 + +每次拒绝都在 PMS 里写明原因。复盘脚本会把被拒绝的票单列成一份名单,与其他名单同口径算收益,回答"拒了的后来涨了多少"。人批的票与人拒的票分开算,这是过渡期唯一能读出"人在环路有没有价值"的方式。 diff --git a/docs/复盘决定台账.md b/docs/复盘决定台账.md index 0398d65..3b764fe 100644 --- a/docs/复盘决定台账.md +++ b/docs/复盘决定台账.md @@ -50,23 +50,37 @@ - 预期:PMS 新建仓改由人工裁决,自动止血;模拟盘只在 155。 - 复核日期:候选来源切换拍板时(001 复核之后)。 -## 008 · 2026-09-02 · 池深不变式:PMS 计划深度改回 50 - -- 改动:PMS 运行参数 PMS_PLAN_TOP_N 从 100 改为 50(155,参数表 pms_runtime_param,updated_by 标 claude),与桥入池的 POOL_TOP=50 对齐。用户拍板选项二。回退是同样方式设回 100。 -- 依据:方案 1.11,主榜第 51 到 100 名的强传导票 PMS 能买、却不在决策系统夜间分析池里。用户认为 100 与 50 差别不重要,先对齐。 -- 预期:PMS 探针的合格候选数不变(改前基线 41 只,因为强传导档本身不足 50 只);池深不变式恢复成立。 -- 复核日期:候选来源切换时一并看。 - -## 009 · 2026-09-02 · 候选卡与快照上线(155 生产) - -- 改动:生产桥仓库拉到 62dbe57(候选卡、快照、环境标签、复盘脚本、风险名单只读一次)。代码是卷挂载,构建、计划、入池脚本即刻用新代码;常驻接口进程要重启桥容器才加载新代码,重启由用户执行(Claude 的重启命令被权限分类器拦下,属红线项不绕过)。入池来源保持档位(POOL_SOURCE=tier)、切片关闭,PMS 行为不变。决策系统接口地址(REGIME_API_URL)待用户写入配置并重建容器后环境标签才有值,之前为"未知"。 -- 依据:方案 2.6 执行顺序;上线前核对——一次性容器计划与入池干跑通过、两套单测通过、决策系统接口从 155 可达。 -- 预期:每交易日 07:10 起落当日快照(data/plan/plan_<数据日>.json)、接口带生成时刻与代码版本;PMS 探针合格数与改前一致。 -- 复核日期:09-11 首份周报核对快照连续性。 - ## 007 · 2026-09-02 · 坏信号集合三处同源 - 改动:坏信号集合 {SELL, AVOID, DROPPED} 在桥内归一到 card.BAD_SIGNALS,pool.py 从它引用;决策系统 pms_advisor.py 与 PMS rule_gate.py 各自写死,三处同改。 - 依据:方案 1.11 三处同源纪律。 - 预期:任何一处改集合时另外两处同一提交内改。 - 复核日期:不复核,纪律。 + +## 008 · 2026-09-02 · 池深不变式:PMS 计划深度改回 50 + +- 改动:PMS 运行参数 PMS_PLAN_TOP_N 从 100 改为 50(155,参数表 pms_runtime_param,updated_by 标 claude),与桥入池的 POOL_TOP=50 对齐。用户拍板选项二。回退是同样方式设回 100。 +- 依据:方案 1.11,主榜第 51 到 100 名的强传导票 PMS 能买、却不在决策系统夜间分析池里。用户认为 100 与 50 差别不重要,先对齐。 +- 预期:PMS 探针的合格候选数不变(改前基线 41 只,因为强传导档本身不足 50 只);池深不变式恢复成立。历史复盘的交付名单不受影响(有快照的日子名册最多 48 只,没有触及 50)。 +- 复核日期:候选来源切换时一并看。 + +## 009 · 2026-09-02 · 候选卡与快照上线(155 生产) + +- 改动:生产桥仓库拉到 117f77b(候选卡、快照、环境标签、复盘脚本、风险名单只读一次、平台注册状态旋钮)。代码是卷挂载,构建、计划、入池脚本即刻用新代码,当日快照从 09-03 起自动落;常驻接口进程要重启桥容器才加载新代码,重启由用户执行(Claude 的重启命令被权限分类器拦下,属红线项不绕过)。入池来源保持档位(POOL_SOURCE=tier)、切片关闭,PMS 行为不变。决策系统接口地址(REGIME_API_URL)待用户写入配置并重建容器后环境标签才有值,之前为"未知"。 +- 依据:方案 2.6 执行顺序;上线前核对——一次性容器计划与入池干跑通过、两套单测通过、决策系统接口从 155 可达。 +- 预期:每交易日 07:10 起落当日快照(data/plan/plan_<数据日>.json)、接口带生成时刻与代码版本;PMS 探针合格数与改前一致。**样本外计划日从 09-03 起算**,台账 001 的复核样本只认这之后的日子。 +- 复核日期:09-11 首份周报核对 09-03 起快照连续性(断一天,那天的候选单就退回重算并带前视,样本外读数从一开始就不干净)。 + +## 010 · 2026-09-02 · 复盘口径四条(对"读数都为负"的处置,只在读数层) + +- 改动:一,"生产名单"改名"强传导交付名单",它是 PMS 拿到的强传导全集(已核实 PMS 的计划快照落在本地筛选之前),与主榜"档位=强传导"分组是同一件事的两个读法,周报里结论只计一次;进评审名单另取 PMS 动作账本的 OPEN 行,不在桥里复现 PMS 的本地筛选。二,无 PMS 快照的日子(07-29、08-24)交付名单当日剔除并注记,不再退化为桥重算。三,汇总表加相对主榜等权、相对同市值桶两列超额,六份名单都算;跑赢比例读它时与全池自身跑赢比例(本期 44.2%)相减,只作读数,不改 001 的"跑赢过半"门槛。四,候选单附逐日表与最大单日样本占比;样本纪律按方案 2.4 只标"可读"与"方向"两档,二十日在计划日不足二十之前不进结论,跌周候选单与关注单只写样本不足。 +- 依据:09-02 对抗验证保留项。生产名单相对主榜 −1.63、相对同市值桶 −1.64(复盘常规口径,五日),贝塔解释不掉;环节名单相对主榜 +0.12,定位不负、选票负;候选单最大单日样本占比 40%,读数由一天主导。 +- 预期:首份周报(09-11)按此出。历史重建读数定性为"候选卡上线前对旧规则的判决",不据此改任何规则、参数或 PMS 设置。 +- 复核日期:不复核,口径定义。 + +## 011 · 2026-09-02 · 过渡期人工裁决原则 + +- 改动:PMS 新建仓提议(来源仍是强传导档)由人裁决,默认拒;只批桥当日计划里判决为"候选"且硬风险为空的票。判决为"关注"的不批(潜在吸筹市值中性后为负,不升格)。环境标签只当背景,不写成裁决规则。每次拒绝在 PMS 里留下理由,被拒绝名单进复盘。看哪些字段见桥仓库 docs/人工裁决看什么_2026-09-02.md。 +- 依据:交付名单五日 −1.92、跑赢 33.4%;台账 006 已改只提议;PMS 不读判决字段,人必须另开桥的计划看。 +- 预期:过渡期自动跑进执行链路的只剩两份名单(入池的强传导前 50、PMS 的强传导前 50 作提议),其余全是给人看的。人批与人拒的票在复盘里分开算,读出人在环路的价值。 +- 复核日期:与 001 同批(样本外满二十个计划日)。撤销条件:被拒绝名单显示人拒的票连续二十个计划日跑赢人批的票。 diff --git a/plan_review.py b/plan_review.py index c27c0b1..3524fd7 100644 --- a/plan_review.py +++ b/plan_review.py @@ -199,7 +199,8 @@ def run(since: str, until: str | None, horizons: tuple, start: str, out_dir: str seg_codes = sorted({r["code"] for r in main_rows + obs_rows if r.get("evidence")}) prod, prod_note = pms_roster(day) if not prod: - prod = [r["code"] for r in main_rows if r.get("tier") == "强传导"][:100] + # 无 PMS 快照的日子不再退化为桥重算(那不是 PMS 拿到的名单):交付名单当日剔除并注记(台账 010) + prod_note = f"{prod_note};无快照,交付名单当日剔除" cands = [r["code"] for r in data.get("candidates") or []] watch = [r["code"] for r in data.get("watch") or []] caps = cap_bucket(day) @@ -228,7 +229,7 @@ def run(since: str, until: str | None, horizons: tuple, start: str, out_dir: str regime_pre = (("弱势日" if reg.get("weak_day") else "非弱势日") if reg and reg.get("weak_day") is not None else "无标签") lists = { - "生产名单": prod, "候选单": cands, "关注单": watch, "环节名单": seg_codes, + "强传导交付名单": prod, "候选单": cands, "关注单": watch, "环节名单": seg_codes, "主榜等权": main_codes, "观察档等权": obs_codes, "全池等权": list(ret.dropna().index), } @@ -283,8 +284,8 @@ def run(since: str, until: str | None, horizons: tuple, start: str, out_dir: str n = g["n"].astype(float) w = n / n.sum() if n.sum() else n days, total = g["date"].nunique(), int(n.sum()) - # 样本纪律(方案 2.4)机器标注:可读=计划日≥20 且样本≥100;方向=样本≥100;其余不作数 - grade = "可读" if (days >= 20 and total >= 100) else ("方向" if total >= 100 else "不作数") + # 样本纪律(方案 2.4)机器标注,只有两档:可读=计划日≥20 且样本≥100;其余只看方向 + grade = "可读" if (days >= 20 and total >= 100) else "方向" return pd.Series({"days": days, "n": total, "ret": round(g["ret"].mean(), 2), "excess_all": round(g["excess_all"].mean(), 2),