From 4e8e2e4ac42c60666cf1c71de8fa5c91f5a07f49 Mon Sep 17 00:00:00 2001 From: zlt Date: Wed, 9 Sep 2026 15:36:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=B0=E8=B4=A6=20001=20=E5=88=B0=20005=20?= =?UTF-8?q?=E4=B8=8E=E8=90=BD=E5=9C=B0=E8=AE=B0=E5=BD=95=EF=BC=88=E5=90=AB?= =?UTF-8?q?=E4=B8=8A=E7=BA=BF=E5=89=8D=E8=AF=95=E7=AE=97=E8=AF=BB=E6=95=B0?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5 --- docs/复盘决定台账.md | 89 ++++++++ docs/盘中改判与信号聚合方案_2026-09-09.md | 249 ++++++++++------------ 2 files changed, 206 insertions(+), 132 deletions(-) create mode 100644 docs/复盘决定台账.md diff --git a/docs/复盘决定台账.md b/docs/复盘决定台账.md new file mode 100644 index 0000000..9cb6b63 --- /dev/null +++ b/docs/复盘决定台账.md @@ -0,0 +1,89 @@ +# 复盘决定台账(持仓管理系统) + +这份台账记每一条影响下单与提议的规则改动:改了什么、依据是哪份读数、预期看到什么、什么时候复核。 +只记决定,不记讨论过程。新条目追加在最后,不改旧条目;旧条目被推翻时在它下面加一行"撤销于某日,见某条"。 + +格式:日期、改动、依据、预期、复核日期。 + +涉及选股系统的条目在正文里点名引用因子桥台账的编号(`akg-factor-bridge/docs/复盘决定台账.md`)。 + +--- + +## 001 · 2026-09-09 · 研判驳回的当日闸改为可解除 + +**改动。** 新建仓被研判闸驳回后,那只票当天就进跳过集合、扫描不再评估它。这道闸从今天起可以被解除一次。 + +解除要同时满足四条护栏,再满足三条解锁条件中的任意一条。八个阈值一次定死,不按复盘读数回调。 + +四条护栏: + +| 编号 | 条件 | 阈值 | 为什么 | +|---|---|---|---| +| G0 | 总开关开着 | `PMS_OPEN_REASK_ENABLED`,默认开 | — | +| G1 | 距上次驳回 | 不少于 20 分钟 | 四根五分钟线,够量能确认成形。不是等择时侧那层三十分钟缓存,重问带强制标记绕开它 | +| G2 | 这只票今天用过的重问次数 | 少于 1 次 | 每票每天一次。两次以上等于取消当日闸,而当日闸挡的是账本刷屏这个真问题 | +| G3 | 当前时刻 | 09:45 到 14:30 | 早于 09:45 量比不可靠;晚于 14:30 走不完提议到拍板到下单 | + +三条解锁条件: + +| 编号 | 条件 | 阈值 | 为什么是这条 | +|---|---|---|---| +| U1 | 择时决策系统当日判过这只票转多,且时刻**晚于**驳回 | 无阈值 | 另一套系统自己改了口,是最硬的新信息。"晚于"这个限定是关键:驳回之前就有的信号研判当时已经看过(它作为盘中转多留痕进了提示词),拿它当理由是循环论证 | +| U2 | 昨夜结论被盘中重算改写且方向向好 | 定性翻成看多,或支撑压力漂过 3% | 研判的底牌就是那一行。3% 取 `PMS_OPEN_REF_DRIFT_MAX` 同值:那道闸说"底牌漂了就别买",这条说"底牌漂了就重问一次",同一件事的两个方向用同一个数 | +| U3 | 价升且量能确认 | 现价较驳回涨 2%,且时段折算量比不低于 1.5,且量比涨到驳回时的 1.3 倍 | 直冲"今日突破量能未确认"那类驳回理由。三条**并列**:只看价格等于追高,只看量比会被早盘脉冲骗 | + +任何一项读数取不到,该条一律不成立。方向是漏解锁,不是误解锁。 + +重问的名额在**真的发出研判请求**那一刻才算用掉。解锁之后被名额或金额挡住、被规则闸拦下的,什么都没问过,不消耗机会。重问通过一律强制交人拍板,不自动执行;重问后仍驳回静默记账,页面不单列。 + +**依据。** 09-09 全池 75 只候选零提议,研判连续三天百分之百驳回(20、19、11 只)。查证四方股份当天全过程:10:04 择时判反转买入并广播(置信 95%),10:05 持仓管理系统消化留痕,10:12 送研判被驳回(把握度 72,理由是量能未确认),10:12 起当日死锁,13:02 择时再判维持。择时侧盘中确实复查了两次,但建仓这条路是一次性的。 + +同时查证:这次系统**没判错**。11 只被驳回的票从驳回到收盘 5 跌 4 平 2 涨;前一天那批 11 只里 10 只下跌。所以要修的是机制不是结论。 + +**预期。** 每天解锁一到五次。零次说明阈值太紧,超过八次说明太松。重问后放行至少要出现过一次。 + +**复核日期。** 开关打开后满三个交易日。 + +**上线前试算(09-09 收盘,只读、未落任何表)。** 11 只被驳回的票按 11:30 那一刻算,**一只都不解锁**:9 只较驳回价没走够 2%(其中 5 只在跌),四方股份的转多留痕在 10:05 早于 10:12 的驳回、按 U1 不算新信息。唯一接近的是 600875.SH,涨 4.73%、量比 2.408,只因为当天的驳回行是旧格式、没有基线快照才判不了"是不是相对变强"。这说明阈值不松。 + +## 002 · 2026-09-09 · 两个口径的"当日涨幅"并存,账本两个都记 + +**改动。** 规则闸的不追高量的是**相对今日开盘**(`day_chg_from_open`,分母是今日第一根分钟线的开盘价),解锁条件量的是**相对昨收**。驳回行的基线快照里两个数都记。 + +**依据。** 四方股份 09-09 相对昨收涨 7.6%,相对开盘是 -0.2%,所以它其实从没被不追高那道闸拦过,是研判驳的。变量名与错误信息都写"当日涨幅",不写清楚复盘会对不上账。 + +**这次不改那道闸。** 改它会影响所有买入,要单独评估。这里只登记口径。 + +**复核日期。** 不复核,口径定义。 + +## 003 · 2026-09-09 · 量比口径三处同源 + +**改动。** 时段折算量比 = 当日累计量(股)÷ 100 ÷ 近五日日均量(手)÷ 覆盖时段占全日的比例。三条哨兵:覆盖不足 8%(约二十分钟)不判、折算前原始比超过 30 判数据异常、任一入参取不到回空。 + +**折算的分母是分钟线实际覆盖的时段,不是从开盘算的已过时段。** 实测 09-09 收盘,四方股份的分钟线首根是 10:11 —— 行情库里那张键是滚动窗口,不保证从开盘存起。按当前时刻算分母会把没存进来的那段也算上,量比被系统性压低。 + +**依据。** 实测三只票:四方股份涨 7.58% 量比 1.128、长源电力涨 2.22% 量比 1.553、洛阳钼业跌 0.82% 量比 0.806。四方股份那个读数与 10:12 研判驳回的理由"今日突破量能未确认"完全对得上,是一次有效的交叉验证。 + +**已知不一致,本次不改。** 择时决策系统的弱市闸仍按已过时段算(`entry_gate._intraday_vol_surge`),所以它算出的量比比这里低。改它会影响所有建仓仲裁,单独评估。两侧单测各钉了同一组边界数(1.49、1.51、超 30 哨兵、覆盖不足不判)。 + +**复核日期。** 不复核,纪律。 + +## 004 · 2026-09-09 · 候选池经共享 Redis 对外只写一份 + +**改动。** 每轮扫描把新建仓候选的代码列表写进共享行情信号 Redis 盘中库的 `pms:candidates:{年月日}` 键,存两天。只写代码,不写分数、理由、价格。写失败只记日志,不影响扫描。 + +**依据。** 择时决策系统的盘中强势扫描要一份覆盖面。两侧本来就连着同一台 Redis 的同一个库,不新增网络方向、不涉及鉴权;失败模式也良性——键没了就是那边本轮不扫,它绝不回退到全市场。走接口反而要新造一条"择时到持仓管理"的调用方向,还要处理会话票签。 + +**预期。** 择时侧每轮日志里的覆盖面条数与这边的新建仓候选数一致。 + +**复核日期。** 与择时侧台账 001 同批。 + +## 005 · 2026-09-09 · 点股票看它今天的全部信号 + +**改动。** 新增按代码回扫五个上游源的接口,页面三处入口可点开抽屉。回扫上限 `PMS_UPSTREAM_BYCODE_SCAN` 默认 5000,分页每页 500。**只能点击触发,绝不进轮询。** + +**依据。** 信号栏一行等于上游流里的一条原始消息。09-09 告警流 157 条,四方股份一只占 11 条,散在好几个分组里。而快照口径每类只留最新 20 条,到下午一只活跃票早盘的信号早被挤掉。实测按代码回扫拿到 16 条,0.36 秒。 + +顺带修了四处"弹了遮罩但没有信息":接口整体失败不再抹平成空数据(原来失败时页面显示"今天没有信号",在风控面板上这是最危险的一种谎)、告警派生的三个分组补失败角标、失败角标的样式选择器漏了信号栏、错误横幅在遮罩之上再浮一份。 + +**复核日期。** 不复核,功能改动。 diff --git a/docs/盘中改判与信号聚合方案_2026-09-09.md b/docs/盘中改判与信号聚合方案_2026-09-09.md index 4860f8a..a6e626a 100644 --- a/docs/盘中改判与信号聚合方案_2026-09-09.md +++ b/docs/盘中改判与信号聚合方案_2026-09-09.md @@ -1,159 +1,144 @@ -# 盘中改判与信号聚合方案(2026-09-09,已批准) +# 盘中改判与信号聚合(2026-09-09 落地记录) -> 两件事一份方案。批准后落盘为 PMS 与择时决策系统两个仓库的 docs/盘中改判与信号聚合方案_2026-09-09.md,台账记 055。 -> 09-09 三条拍板已吸收:盘中改判做到**解锁重问加主动扫描**两层,不改追高原则;重问后仍驳回**静默记账**,页面不单列;择时侧盘中资金流分发**一并打开**。 +> 方案已实施完毕,本文改成落地记录:做了什么、实测读数是多少、怎么验证、怎么回退。 +> 台账见两个仓库各自的 `docs/复盘决定台账.md`(持仓管理系统 001 到 005,择时决策系统 001 到 004)。 --- -## 一、上下文:为什么做 +## 一、两件事各解决什么 -你提了两件事。第一件是信号栏里同一只股票反复出现,想点开看这只票今天的全部信号。第二件是四方股份的"决策系统判暂不建仓"看起来是一次性的,而这只票今天资金流多次转强、涨幅超过六个点,系统该不该在盘中改判。 +**第一件。** 信号栏一行等于上游流里的一条原始消息,一只活跃票一天十来条散在好几个分组里。 +现在点一下票名,抽屉里按时间倒序摊开它今天的全部信号。 -我把 09-09 这只票的全过程查了一遍: +**第二件。** 新建仓被研判驳回后,那只票当天就不再被评估。现在盘中输入确实变了就解除一次, +重新问一遍;同时择时决策系统新增一条主动通道,遍历候选池找今天转强的票。 -| 时间 | 发生了什么 | 谁做的 | +--- + +## 二、实测读数(09-09 收盘,全部只读、未落任何表) + +**按代码回扫。** 四方股份 16 条、0.36 秒,五路全部读到、没有触到回扫上限。第二次点同一只票走缓存,0.001 秒。 + +**量比口径。** 三只票交叉验证: + +| 股票 | 较昨收 | 时段折算量比 | 与当天研判说法对不对得上 | +|---|---|---|---| +| 四方股份 | +7.58% | 1.128 | 对得上。10:12 驳回理由正是"今日突破量能未确认" | +| 长源电力 | +2.22% | 1.553 | 量比够但涨幅不够 | +| 洛阳钼业 | -0.82% | 0.806 | 都不够 | + +**解锁试算。** 11 只被驳回的票按 11:30 那一刻算,**一只都不解锁**: + +- 9 只较驳回价没走够 2%,其中 5 只在跌 +- 四方股份的转多留痕在 10:05,早于 10:12 的驳回,按第一条解锁条件不算新信息 +- 唯一接近的是 600875.SH,涨 4.73%、量比 2.408,只因为当天的驳回行是旧格式、没有基线快照,判不了"是不是相对驳回那一刻变强" + +这说明阈值不松。部署之后新的驳回行都带基线快照,这类票会被正常解锁。 + +**跨系统闭环。** 持仓管理系统写候选池键,择时决策系统立刻读到,两侧算出的读数完全一致 +(四方股份量比都是 1.128,长源电力都是 1.554)。这是"三处同源"那条纪律的运行时证据。 + +--- + +## 三、必须知道的三件事 + +**一、改完之后不会立刻追高买入。** 两只票的现价都高于择时买入区间上沿: + +| 股票 | 买入区间 | 现价 | |---|---|---| -| 10:04 | 资金流强度告警触发盘中审计,判**反转买入**(主力净占比由 -12.5% 翻正到 +13.41%),广播买入信号置信 95% | 择时决策系统 | -| 10:05 | 消化这条信号,写留痕 | PMS | -| 10:12 | 送建仓研判,现价 43.15 → **驳回**(把握度 72,理由是量能未确认、提纯量不足) | 择时决策系统 | -| 10:12 起 | 当日死锁,扫描每分钟仍在跑但直接跳过这只票 | PMS | -| 13:02 | 资金流告警再次触发,现价 42.47 → **维持**(价格虽破 42.0,但量能闸 1.5 没过) | 择时决策系统 | +| 四方股份 | 39.60 到 40.60 | 42.60 | +| 长源电力 | 24.25 到 25.38 | 26.18 | -**结论分两半。** 择时侧盘中复查了两次,昨夜布下的关注条件也在工作,所以不是完全没复查;但 PMS 的建仓侧确实是一次性的,驳回后当天不再问,13:02 那次复查的结论进不了建仓这条路。 +即使解锁重问、研判放行、你在页面上点了头,落成指令之后择时仍会说"高于上沿,不追", +指令挂在窗口期里等价格回落。**解锁重问买到的不是"立刻追高",而是"让这只票进入待办、等回调时自动买入"。** +追高那条线一个字没改。 -**而且这次系统没判错。** 从驳回到下午,这只票从 43.15 跌到 42.44,跌了 1.65%;今天被驳回的 11 只票里 5 只在跌、4 只基本没动、只有 1 只涨超四个点。前一天(09-08)被驳回的那批更是 11 只里 10 只下跌。研判连续三天百分之百驳回,在这个弱市里是合理的,不是过严。 +**二、不追高那道闸量的是相对今日开盘,不是相对昨收。** 四方股份今天较昨收涨 7.6%,较开盘是 -0.2%, +所以它其实从没被那道闸拦过。这次只登记口径,不改闸。 -所以要修的是机制,不是结论: - -1. **研判驳回后的当日死锁没有解除条件。** 这道闸的注释写明了它的假设——"这只票今天不该从零建仓这个结论当天基本不会翻转",以及防账本刷屏(2026-07-29 那次每分钟写一行、一天几千行的教训)。假设合理但不是绝对,缺一个"确实有新信息"的例外。 -2. **盘中转多信号只改候选排序、不改建仓资格。** 今天三只票被判转多,一只被死锁挡住、一只候选卡判决是仅展示、一只不在候选池,一个出口都没有。 -3. **择时侧没有任何任务主动扫"今天谁在涨、谁在进钱"。** 四个盘中定时任务分别只看持仓、已有意向单的票、昨夜布过防的票、门控白名单。强势票要被看见,必须上游先推告警。 +**三、资金流开全量比原方案想的危险。** 实施时查出两处:股票池门控总开关默认关着时覆盖面等于 +全市场(日均一千三到一千六条,没底牌的票逐条走冷启动重算,可能一天几百次打满大模型队列); +流出侧会触发风控仲裁,大模型不可用时硬规则会直接判卖出。所以加了方向闸、覆盖面闸与冷启动配额, +第一阶段只放流入侧。详见择时决策系统台账 003。 --- -## 二、一个必须先讲清的事实:改完之后不会立刻追高买入 +## 四、验证命令 -这决定了整个方案的取向。我把两只票的择时买入区间算了出来: +### 甲、持仓管理系统(在它所在的服务器上,仓库根目录) -| 股票 | 昨夜支撑 / 压力 | 买入区间 | 现价 | 择时会怎么说 | -|---|---|---|---|---| -| 四方股份 | 40.00 / 42.00 | 39.60 到 40.60 | 42.60 | 高于上沿,等待不追 | -| 长源电力 | 24.50 / 27.42 | 24.25 到 25.38 | 26.18 | 高于上沿,等待不追 | +单测。预期最后一行是 `ALL SUITES PASS`: -也就是说,即使解锁重问、研判放行、你在页面上点了头,落成指令之后择时仍会说"现价高于买入区间上沿,不追",指令会在窗口期里挂着等价格回落到区间内才真的下单。系统本身也是只提议不自动执行的档位。 +```bash +docker compose run --rm --no-deps -v "$PWD:/app" pms-web python scripts/run_tests.py +``` -**所以解锁重问买到的不是"立刻追高",而是"让这只票进入待办、等回调时自动买入"。** 这与系统写死的那条原则(可以接受买不上)不冲突,也正是你要的"重新评估"。追高那条线本方案不动。 +解锁判定试算。只读,一行都不写。预期打印当日被驳回的票与逐只的解锁判定: -顺带澄清一个容易误会的地方:不追高那道闸算的是**较今日开盘**的涨幅,不是较昨收。四方股份今天较昨收涨 6.2%,但较开盘是 -1.5%,所以它其实没有被这道闸拦过,是研判驳的。 +```bash +docker compose run --rm --no-deps -v "$PWD:/app" pms-web python -c "from datetime import datetime; from app.services import proposal_service as ps, reask_service as rs; jk = ps._judge_rejected_open_keys(); print('当日被研判驳回:', len(jk), '只'); print('解锁:', rs.evaluate_all(jk, datetime.now()) or '(无)')" +``` + +全链试算,不落任何表。预期打印候选数与分流结果: + +```bash +docker compose run --rm --no-deps -v "$PWD:/app" pms-web python -c "from app.services import proposal_service as p; import json; print(json.dumps(p.scan_and_route(dry_run=True), ensure_ascii=False)[:600])" +``` + +单票信号回扫。预期打印条数与耗时,五路都标 ok: + +```bash +docker compose run --rm --no-deps -v "$PWD:/app" pms-web python -c "import json,time; from app.services import upstream_signals as u; t=time.time(); d=u.by_code('601126.SH', force=True); print('%d 条 %.2f 秒' % (len(d['timeline']), time.time()-t)); print(json.dumps(d['sources'], ensure_ascii=False))" +``` + +### 乙、择时决策系统(在它所在的服务器上,仓库根目录) + +三个自检。每个预期最后一行都是 `ALL OK`: + +```bash +docker exec trader_worker_brain python3 scripts/selftest_strength_scan.py +``` + +```bash +docker exec trader_worker_brain python3 scripts/selftest_pms_judge_force.py +``` + +```bash +docker exec trader_worker_brain python3 scripts/selftest_metrics_scope.py +``` + +候选池键通不通。预期打印"候选池 N 只"与代码列表: + +```bash +docker exec trader_worker_brain python3 -c "from workers.strength_scan import load_universe; print(load_universe())" +``` + +单轮扫描试跑。总开关关着时预期是 `SKIP 总开关关着`: + +```bash +docker exec trader_worker_brain python3 -c "from workers.strength_scan import run_scan; print(run_scan())" +``` --- -## 三、第一件:点股票看它今天的全部信号 +## 五、上线顺序与开关 -### 3.1 现状与量级 +| 段 | 做什么 | 前提 | 观察多久 | +|---|---|---|---| +| 第零段 | 两侧代码全部到位、全部测试绿、容器重启 | — | 半天,只看日志没有新报错 | +| 第一段 | 打开解锁重问(页面改参数,即时生效,不用重启) | 第零段完成 | 三个交易日 | +| 第二段 | 打开强势扫描的观察档(只记不派,**一次大模型都不打**) | 第一段观察满三天 | 两个交易日 | +| 第三段 | 关掉观察档,真派单 | 第二段读数正常 | 三个交易日 | +| 第四段 | 资金流分发半开(全量 + 只放流入 + 覆盖面收着) | **必须单独一段** | 两个交易日 | +| 第五段 | 资金流分发全开(放两侧) | 第四段全绿,且当日兜底卖出恒为 0 | 两个交易日 | -信号栏是左侧浮层里的扁平行列表,一行等于上游流里的一条原始消息,不按股票聚合。数据来自 Redis 五个源:盘中告警、决策系统买卖广播、择时层入场、风控卖出动作、资金异动,外加一份实况评分榜。今天告警流 157 条,四方股份一只就占 11 条,正是你说的反复出现。 +第一段与第二段为什么不能同时开:它们会互相喂 —— 强势扫描产的转多广播正好是解锁重问的第一条解锁条件。 +同时开就分不清"今天解锁了五次"是解锁阈值定得准,还是扫描在制造信号。 -页面已经有一个按代码分组的实现(持仓表那列"今天的信号"),但被限死在持仓票、只看今天、只能悬停看前三条,而且明确不可点。 +## 六、回退 -### 3.2 做法:抽屉,两段取数 +三条互相独立,可以单独拉: -**后端加一个按代码回扫的接口。** 快照口径注定不全(告警每类只留最新 20 条),到下午一只活跃票早盘的信号早被挤掉了。新增 `upstream_signals.by_code(ts_code)` 与 `GET /api/upstream/signals/{ts_code}`:分页回扫(每页 500 条,上限可配,默认 5000),两条按日期分键的流整键就是今天,两条不分键的流(风控卖出、资金异动)扫到今天零点为止;同源同分钟同值的合并成一条并显示重复次数,跨源永不合并;按票缓存八秒防连点;单源失败不拖垮整体,返回里逐源标明哪路读不到。只用倒序读取,不建消费组、不写任何东西,且**只能点击触发,绝不能进轮询**。 - -**前端抽屉两段取数。** 点开的瞬间用手上的快照渲染,所以第一帧就有内容,永远不会变成"只有遮罩没有信息";同时发按代码回扫的请求,回来后替换成完整版,表头的口径说明从"最近快照,可能不全"翻成"完整,已回扫到今天开盘"。补全失败就保留快照并在抽屉里挂一条黄条,带重试按钮。 - -抽屉里分七段:补全失败提示、回扫未见底提示、分源失败角标、时间线、当前快照(资金异动与实况评分这两路上游只给当前值不带时间,单独成段,不编造时间戳)、这只票今天的账本记录、持仓与候选池处置。账本那条接口早就支持按代码查,只是页面从没用过,后端零改动。 - -**三处入口可点**:信号栏每行的股票名、持仓表那列(现在不可点,连"今天没有"也要可点,因为速览口径下的"没有"可能是假的)、消息栏的股票名。风控卖出那一行的股票名要用阻止冒泡,否则点名字会顺手把理由折叠条也翻一下。 - -### 3.3 顺带修遮罩空白 - -你看到的"弹出遮罩层但没有任何信息",成因是四条,一并修: - -1. **浮层打开时不等数据、不看空、失败不兜底。** 改成:面板先开(关闭随时可用),再发请求,加载态显示在面板里,失败显示原因加重试按钮,面板不自动关(自动关看起来像"点了没反应",比空面板更糟)。 -2. **接口整体失败时把错误抹平成空数据**,导致模板里那些"读取失败"角标一个都显示不出来,页面看起来就是"今天什么信号都没有"——在风控面板上这是最危险的一种谎。改成保留错误并给每一路造一条失败标记,模板一个字不用改,角标立刻就亮。另外有三处配套:告警派生的四个分组本来就没有失败角标要补上;各组的空文案要让位给失败态;那个失败角标的样式选择器写漏了信号栏,即使显示出来也看不出是错误。 -3. **错误横幅被遮罩压住。** 顶部那条横幅在文档流里,遮罩、浮层、弹层的层级全都压得住它,而且往下滚一屏就看不见。改成在遮罩之上再显示一份浮动的。 -4. **新抽屉必须显式抬层级。** 弹层库的层级从 2000 起自增,而信号栏浮层写死 2010、遮罩 2005,新抽屉不抬层就会落在它们底下,屏幕上正好只剩一层灰——这是同一个症状的另一张脸。双保险:打开抽屉前先收浮层,抽屉本身写死更高的层级。选股计划抽屉也是同一种病(先开抽屉再等数据,上游不通时空白挂满一分钟),一并加加载提示。 - ---- - -## 四、第二件:盘中改判 - -### 4.1 解锁重问(PMS 侧) - -**插入点**是那个返回"今天已被研判驳回"键集合的函数。它现在无条件返回被驳回的票,改成在返回前逐只判一次解锁条件,满足的从集合里剔掉——没有解锁条件时行为逐字相同。 - -**解锁条件一次定死**,四条满足任一即解锁(写台账,不按读数回调): - -| 条件 | 判据 | 为什么 | -|---|---|---| -| 择时判转多 | 当日账本里这只票有转多留痕,且时间**晚于**驳回时刻 | 驳回之前就有的信号研判已经看过了,不算新信息 | -| 价格显著上行 | 现价较驳回时涨幅不低于 2%,且当前有看涨方向的资金流告警 | 单看价格容易被噪音触发,要资金面同时确认 | -| 关注条件升级 | 择时侧审计表当日出现反转买入或升级判定,且晚于驳回时刻 | 昨夜布下的预案在盘中被兑现,是最硬的新信息 | -| 主动扫描命中 | 第二件里新增的强势扫描判定这只票转强,且晚于驳回时刻 | 与上一条同源,走新入口 | - -**限次:每票每天最多解一次。** 判据是当日账本里这只票的新建仓驳回行数——第一次驳回一行,重问后再驳回就是两行,两行及以上不再解锁。不用新表、不用新参数。这直接回应了原设计防账本刷屏的顾虑:最坏情况每票每天多写一行。 - -**试算过今天的实际量级**:11 只被驳回的票里只有 1 只会被重问(长源电力,较驳回涨 4.05%,三条资金流看涨告警)。四方股份虽然有五条看涨告警,但价格较驳回时跌了 1.5%,不会被重问——这是对的,它的情况没有变好。 - -**重问要绕过择时侧的三十分钟缓存。** 那层缓存的键里没有任何输入指纹,价格资金全变了三十分钟内仍回同一份裁决。做法是研判请求里带一个强制标记,择时侧读缓存前先看这个标记。 - -**重问仍驳回就静默记账**(你的拍板):账本记一行并标明是重问后的结论,页面不单列。 - -**开关** `PMS_JUDGE_RECHECK_ENABLED`,默认开;解锁条件的阈值各有参数,都要同时登记进运行参数白名单,否则页面上改不了。 - -### 4.2 主动扫描(择时侧) - -新增一个每五分钟的盘中定时任务,扫两件事:当日涨幅与资金流转强。命中的走已有的盘中审计入口,终点还是那条已经通了的管道(判反转买入 → 广播信号 → 触发重算 → 翻案上游拒单)。 - -**扫哪些票。** 择时侧读不到 PMS 的候选池(不同库),取它自己的:昨夜有结论且定性不是卖出、回避、剔除三类的票。昨天这批是 506 只,去掉卖出类还剩四百多只,每轮读四百多个实时快照,Redis 上是秒级,可接受。这个池天然覆盖了 PMS 的候选(候选来自同一批昨夜结论)。 - -**当日涨幅要自己算**(现在系统里没有):现价从已有的实时快照函数取,昨收从日线取最近一根。 - -**阈值一次定死**:当日涨幅不低于 3%、当日量比不低于 1.5、资金流方向为看涨,三条同时满足才派单。节流用现有的锁族,同一只票两小时内不重复上大脑;每轮派单数量另设上限(初值 10),防止普涨日一次性打出几十次模型调用。 - -**扫描结果分两种落法**:达到阈值的派单上研判;只达到涨幅一条、资金没跟上的只写一行日志,不占模型额度。 - -### 4.3 资金流分发打开(择时侧) - -把盘中资金异动的分发模式从"只写时间线"改成全量,让资金流转强能直接触发碰撞与研判。这是原设计里标注的灰度状态,注释写着"观察一天量级正常后改 full"。 - -**风险要正视**:资金异动流是上游每十五分钟推一整批全市场,今天累计已有十万条。打开后要盯三个读数:每天触发研判的次数、模型调用量、有没有把别的链路挤慢。回退就是把开关改回去、重启一个容器。建议与前两件分开一天上线,出问题分得清是谁。 - -### 4.4 顺带修三处小问题 - -- **驳回行没记两个期限的头。** 提议行记了,驳回行只记了把握度。补上,顺便把基线快照(驳回时的当日涨幅、量比、资金流方向)一起记进去,解锁判断要用。 -- **低把握驳回转交人的阈值参数没登记进运行参数白名单**(09-08 就发现了),页面上改不了、写不进去,代码走默认值 60。补登记。 -- **不追高那道闸的口径名不副实**:变量名与错误信息都说"当日涨幅",实际算的是较今日开盘的涨幅。高开八个点然后横盘的票会被放行,低开三个点涨到四个点的票反而被拦。这次**只记台账不改**——改它会影响所有买入,要单独评估。 - ---- - -## 五、判收 - -**第一件**:抽屉从三处入口打开都拿到同一份内容;补全失败时抽屉里有内容加黄条,不是空白;拦掉上游接口后每一路都显示"读取失败"、没有任何一处说"今天没有";窄屏从浮层里点股票名,抽屉盖在最上面而不是只剩一层灰。 - -**第二件**:连续三个交易日观察——每天解锁重问几次(预期个位数)、重问后放行几次、放行的票最终有没有成交;主动扫描每天命中几只、其中几只本来就在候选池里;资金流打开后每天触发研判的次数与模型用量。两周后拿读数决定要不要调阈值。 - ---- - -## 六、风险与回退 - -- **解锁重问导致账本刷屏**:每票每天限一次,最坏情况多写一行。这是原设计最担心的事,限次是硬约束。 -- **重问放行后买不进**:这是预期行为(现价高于买入区间上沿),指令挂在窗口期里等回调。要在页面上说清楚,不然人会以为系统没执行。 -- **主动扫描增加模型调用**:只扫候选池、三条阈值同时满足、两小时节流,预计每天个位数。 -- **资金流分发打开量级失控**:单独一天上线,盯三个读数,回退是改开关加重启。 -- **前端没有测试框架**:新增静态断言把三处入口与层级设置钉死,另有六条回归手工步骤。 - -每件事各有开关,全部可以单独关掉回到今天的行为。 - ---- - -## 附录 · 实现要点(可不读) - -**第一件(PMS)**:`app/services/upstream_signals.py` 加 `by_code` 与分页回扫辅助函数;`app/web/main.py` 加一个路由;`app/services/param_store.py` 登记回扫上限;`app/web/static/index.html` 加抽屉、三处入口、遮罩四处修复与一条链接样式;新增 `scripts/test_batch24_units.py`(代码归一、分页边界、按今天截断、去重口径、单源失败、缓存、只读守卫、页面静态断言),在 `scripts/run_tests.py` 的清单与例数表登记,路由清单也要加。 - -**第二件(PMS)**:`app/services/proposal_service.py` 的驳回键函数加解锁判断、驳回落账补基线快照与两个头;`app/services/judge.py` 的请求体加强制标记;`app/services/param_store.py` 登记开关与阈值;新增单测批次。 - -**第二件(择时决策系统)**:`workers/` 下新增强势扫描任务并在调度表登记;当日涨幅自算复用现有的实时快照函数与日线取数;`workers/tasks_intraday.py` 的缓存读取处认强制标记;`config/settings.py` 改分发模式与新增阈值;新增 `scripts/selftest_*.py`。 - -**验证命令**:PMS 在 155 跑 `make test` 与页面手工步骤;择时在 188 跑自检脚本与看日志读数。容器重启与镜像重建各自需要你点头,PMS 侧仍先跑测试、避开开盘。 +1. 资金流分发:改服务器环境文件回只留痕,重建那一个容器 +2. 强势扫描:改环境文件把总开关关掉,重启大脑工作进程 +3. 解锁重问:页面上把总开关改成关,**即时生效,不用重启**