← 归档索引 · 2026-10-06 01:29 · 节点转折+ftshare扫描-21:45
# Cron Job: 节点转折+ftshare扫描-21:45
**Job ID:** a5703c635470
**Run Time:** 2026-10-06 01:29:00
**Schedule:** 45 21 * * 1-5
**Prompt Characters:** 7755
## Prompt
[IMPORTANT: You are running as a scheduled cron job. DELIVERY: Your final response will be automatically delivered to the user — do NOT use send_message or try to deliver the output yourself. Just produce your report/output as your final response and the system handles the rest. SILENT: If there is genuinely nothing new to report, respond with exactly "[SILENT]" (nothing else) to suppress delivery. [SILENT] is a literal ASCII control token — never translate or rephrase it, whatever language the rest of your answer uses. Never combine [SILENT] with content — either report your findings normally, or say [SILENT] and nothing more. FAILURE: If a delegated child fails and this cron run must be recorded as failed, put [CRON_FAILURE] on the first line by itself, then explain the child failure on following lines. RECURSION: This is a run of an EXISTING scheduled job — execute the task now. NEVER create or update a cron job because of recurring or future-schedule language in the task prompt below; treat phrasing like "each Monday" or "every day at 9" as context for this run, not as a request to schedule another job.]
## Output from job '4f1c7fd21ea3'
The following is the most recent output from a preceding cron job. Use it as context for your analysis.
```
## 龙头共振榜 21:40 · 周日 2026-10-04
### 1. 榜面结果(脚本口径)
- 上游候选 **2 只**,完成 6 路评分 2/2,**0 只 ≥4 路** → 确认链无三档预案。
- 已评分:`600406 国电南瑞 3/6`、`002020 京新药业 3/6`(均 ⚪ 观察)。
- 数据日期:**最后交易日 2026-09-30**(国庆休市,数据陈旧 4 天属正常,非故障)。
### 2. 🔴 结论被修正:今晚实际应有 1 只 ≥4 路候选,榜面漏报
**数据链**:`load_pool_codes()` 返回的是 **tuple `(codes, sectors)`**(`low_launch_scanner.py:119 return unique, sectors`),而 `dragon_fusion.py:70` 写的是 `for code in load_pool_codes(self.hub)` → 对 tuple 迭代拿到两个 list → `cands[list]` 抛 `TypeError: unhashable type: 'list'` → 被同段裸 `except Exception: pass` 吞掉。
**实测复现**(stock_workspace venv,直接跑):
```
type: tuple len: 2 | codes in tuple[0]: 164 | LOOP RAISES: TypeError unhashable type: 'list'
```
→ **持仓池 + invest/auto/watch 池 164 只今晚 0 只进入候选**,候选池只剩 preselect 的 2 只。
**补跑(把 164 只按同样 6 路打分,资金流可用=164/164,无降级)**:
```
pool scored=164 errs=0 资金流不可用=0
hits>=4: [('001206.SZ', 4, '🔥 关注')]
hit 分布: {0:26, 1:107, 2:20, 3:10, 4:1}
```
**`001206.SZ 依依股份(造纸/天津)· 收 18.62 · 60日位置 41.5% · 近5日 +7.8%(9/30 收盘)**
`低位启动✅ | 资金流入✅ | 相对强度✅ | 量能异动✅ | 起涨前夜— | 突破启动— → 4/6 🔥`
**为什么守卫没抓到**:`--cron` 的「数据完整度:候选N/完成评分M/取数失败K」只统计 `fusion()` 阶段(今晚 K=0),**不覆盖 collect_candidates 内部的异常分支和 preselect 过滤损失** —— 9/29 加的完整度留痕是半截的,这正是「上游致盲 → 报成无信号」的同类缺陷。
### 3. 126 条 westock 限频告警判定:**无致盲**(与 9/27 事故不同)
- 告警源 `data_hub.py:998`(westock CLI 返回错误载荷→返回空 df)→ `get_daily` 自动回退 tushare。
- 实测:抽 5 只告警票 `get_daily` 全部 `rows=70, last=20260930`;面板加载 **250/250 只、17500 行** → 兜底全部成功,只是多花延迟。
- 结论:**今晚 0 只≥4 路的原因不是限频,是候选池 bug。**
### 4. 待修(本 cron 为只读值班,未改代码)
| 项 | 内容 |
|---|---|
| 改动 | `dragon_fusion.py:69-71` → `codes, _ = load_pool_codes(self.hub)`,并把 `except Exception: pass` 改为记入 `self.last_errors`(上游分支异常必须可见) |
| 连带 | 同模式排查全库:`for ... in load_pool_codes(` 其他调用点 |
| 验证 | ① `_probe` 复现脚本改为不再抛 TypeError ② `python3 dragon_fusion.py --cron 30` 应显示 `候选≥164` 且输出依依股份 ③ 完整度行出现 `取数失败` 时不得报「全绿」 |
**证伪条件**:若修复后候选数仍为 2,说明 tuple 之外还有第二个静默分支 —— 上面的复现只证明了这一个,不证明全部。
```
## Output from job 'e710af0bbd73'
The following is the most recent output from a preceding cron job. Use it as context for your analysis.
```
**⚠️ 晚间21:30统一扫描失败(rc=1)— 根因已定位,两处,一处假红一处静默致盲**
**① 直接红灯 = 门禁口径没跟上禁用决策(假红,非数据事故)**
- 步骤[1] tushare采集 rc=1,唯一 bad 项是 `moneyflow: empty`。
- 路径:`data_hub.get_moneyflow_by_date` 按老板 10-05 指令**主动禁用**(data_hub.py:217 打警告并返回空)→ `night_batch_collect._collect_moneyflow` 记 `status="empty"` → `evening_2130_scan.py:25` 把任何非 ok 记 bad → `return 1`。
- 证据:`/tmp/evening_2130_20261005.log`、`..._20261006.log` 连续两晚同一行「采集未全绿: moneyflow」。**只要不禁用口径,此后每晚恒 rc=1** → 真失败会被狼来了淹没。
- 其余采集全绿:daily 5561 / daily_basic 5561 / top_list 79 / 涨停68·跌停20 / northbound 4(trade_date=get_latest_trade_date()=20260930)。
**② 更严重:产业链动态扫描崩了,但步骤[4] 报绿(静默致盲)**
- 报错:`chain_definition_card.py:182` → `AttributeError: 'DataHub' object has no attribute 'smart_select'`。
- 根因=接口漂移:`stock_workspace/data_hub.py` 是软链 → canonical `~/.hermes/scripts/data_hub.py`,`git log -S 'def smart_select'` **0 命中=从未实现过**;只有废树 `~/stock/data_hub.py:2211` 有该方法。脚本是照废树 API 写的。canonical 近义方法是 `select_stocks()`(data_hub.py:2610, 走MX)。
- 为什么没红:`evening_master_scan.sh:46` 只在无 Traceback 时并入段6,但 `:125` 第7.5段**无条件 echo $CHAIN**,且该失败**不计入 FAILED** → 段4正常退出 → wrapper 只报 `[1]`。结果 AI 判断层输入里那段标着「必引用」的产业链数据 = 一段 Traceback,链A/链B 个股池整晚为空。
**③ 次要降级(已标记,不致盲)**:mootdx init timeout ×2(v4.3/v8 段仍出数)、westock 限频7行(已有 DEGRADED 标记)、数据护照 stale 6天——10/01–10/07 假期非交易日(今日K线扫描同报「非交易日」),最后交易日 9/30,故本次「10/06 收盘/今日+0.00%」全部实为 9/30 口径,不能当新信号读。IMA 归档成功(无告警)。
**修复建议(前端只读模式,未动代码,等指令)**
- A:`night_batch_collect` 对禁用源标 `status="disabled"` 并在 `evening_2130_scan.py` 豁免,或直接把 moneyflow 移出硬门禁。验证:手动跑 `python3 ~/.hermes/scripts/evening_2130_scan.py` 应 rc=0。
- B:`chain_definition_card._smart_select_stocks` 改调 canonical `select_stocks()`(或补 smart_select 适配);同时 `evening_master_scan.sh` 7.5 段补 rc 检查计入 FAILED。验证:`python3 ~/stock_workspace/chain_definition_card.py scan --top 3` 无 Traceback 且段4 rc≠0 能亮红。
- 证伪:若未来恢复 moneyflow 采集,A 的豁免必须同步撤掉,否则真故障无红灯。
**另账未清**:收盘扫描-15:05(job aba5c65c8c1e)最近一次记录 10-04 仍为 `market_super_scan.py failed rc=1`,本次未见其新输出,状态未确认。
```
## Script Output
The following data was collected by a pre-run script. Use it as context for your analysis.
```
=== 节点转折+ftshare 21:45 ===
[1/2] 节点转折扫描...
⚠️ [get_moneyflow] 资金流数据已禁用(网站数据不可信)→ 改用 kpv_judge.py 位置×量判读
westock kline sh688728 非K线载荷(疑似服务限频/错误): 查询dayK线失败:error_type=2 suggest=2 msg=服务限频
westock kline sz000547 非K线载荷(疑似服务限频/错误): 查询dayK线失败:error_type=2 suggest=2 msg=服务限频
westock kline sz000547 非K线载荷(疑似服务限频/错误): 查询dayK线失败:error_type=2 suggest=2 msg=服务限频
westock kline sz301237 非K线载荷(疑似服务限频/错误): 查询dayK线失败:error_type=2 suggest=2 msg=服务限频
westock kline sh920892 非K线载荷(疑似服务限频/错误): 查询dayK线失败:error_type=2 suggest=2 msg=服务限频
westock kline sh920892 非K线载荷(疑似服务限频/错误): 查询dayK线失败:error_type=2 suggest=2 msg=服务限频
westock kline sz300668 非K线载荷(疑似服务限频/错误): 查询dayK线失败:error_type=2 suggest=2 msg=服务限频
westock kline sz300449 非K线载荷(疑似服务限频/错误): 查询dayK线失败:error_type=2 suggest=2 msg=服务限频
westock kline sz300449 非K线载荷(疑似服务限频/错误): 查询dayK线失败:error_type=2 suggest=2 msg=服务限频
westock kline sh688689 非K线载荷(疑似服务限频/错误): 查询dayK线失败:error_type=2 suggest=2 msg=服务限频
westock kline sh688256 非K线载荷(疑似服务限频/错误): 查询dayK线失败:error_type=2 suggest=2 msg=服务限频
westock kline sh603662 非K线载荷(疑似服务限频/错误): 查询dayK线失败:error_type=2 suggest=2 msg=服务限频
westock kline sh920245 非K线载荷(疑似服务限频/错误): 查询dayK线失败:error_type=2 suggest=2 msg=服务限频
westock kline sh920245 非K线载荷(疑似服务限频/错误): 查询dayK线失败:error_type=2 suggest=2 msg=服务限频
westock kline sh920001 非K线载荷(疑似服务限频/错误): 查询dayK线失败:error_type=2 suggest=2 msg=服务限频
westock kline sh920001 非K线载荷(疑似服务限频/错误): 查询dayK线失败:error_type=2 suggest=2 msg=服务限频
📊 节点转折点扫描(10/15有信号):
300759.SZ 踩踏✅ — ℹ️ 无离场信号:主力未明显撤退,按持仓纪律
688728.SH 踩踏✅ — ℹ️ 无离场信号:主力未明显撤退,按持仓纪律
301237.SZ 次低点✅|踩踏✅ — ℹ️ 无离场信号:主力未明显撤退,按持仓纪律
920892.BJ 踩踏✅ — ℹ️ 无离场信号:主力未明显撤退,按持仓纪律
688416.SH 次低点✅|踩踏✅ — ℹ️ 无离场信号:主力未明显撤退,按持仓纪律
300655.SZ 次低点✅|踩踏✅ — ℹ️ 无离场信号:主力未明显撤退,按持仓纪律
300668.SZ 踩踏✅ — ℹ️ 无离场信号:主力未明显撤退,按持仓纪律
688689.SH 次低点✅|踩踏✅ — ℹ️ 无离场信号:主力未明显撤退,按持仓纪律
688256.SH 次低点✅|踩踏✅ — ℹ️ 无离场信号:主力未明显撤退,按持仓纪律
920001.BJ 踩踏✅ — ℹ️ 无离场信号:主力未明显撤退,按持仓纪律
[2/2] ftshare晚间扫描...
═══ 涨跌停情绪扫描 20260930 ═══
涨停 56 家 | 跌停 20 家 | 炸板 12 家
炸板率 17.6% | 早盘板 42 | 尾盘板 1
情绪七度: 悲观
建议: 轻仓试错
═══ 池风险扫描(未来7天解禁 + 商誉>30%)═══
池共 162 只,命中风险 0 条
✅ 池中无临近解禁/高商誉风险
📊 因果基因(脚本自证)
- 数据源: node_turning_scan(DataHub.get_daily+get_moneyflow, 投资池15只) + ftshare(ft_limit_sentiment/ft_risk_scan)
- 分析路径: ①节点转折5模块(杂毛/次低点/离场三式/踩踏vs出货/三假设) ②ftshare涨跌停情绪+池风险(解禁/商誉) → IMA归档
- 判断: 有信号标的才列(杂毛≥2/次低点/离场形态等);零输出段显式告警非零退出
=== 完成 ===
```
节点转折扫描+ftshare晚间扫描。纯脚本,零LLM。
**Response Characters:** 2798
## Response
**节点转折+ftshare 21:45 · 实跑 10-06 01:11(排程晚 3.5 小时)**
---
### ① 先定数据日期:全部是 2026-09-30 口径
10/1–10/7 休市(tushare 交易日历实查:10/8 起恢复交易)。本作业 15 只扫描、涨跌停情绪、池风险**全是 6 天前的 9/30 收盘数据**,不能当"今晚新信号"读。**下一交易日 10-08,且节点转折只有 21:45 这一个 cron(脚本头写的"周一9:00盘前"全库不存在)→ 假期后首日盘前用的仍是这批 9/30 信号。**
### ② 榜面结果(脚本原样)
| 段 | 结果 |
|---|---|
| 节点转折 | 15 只中 **10 只有信号**:踩踏✅×10、次低点✅×6;无杂毛、无离场式、无出货;advice 统一"无离场信号:主力未明显撤退" |
| ftshare 情绪 | 涨停56/跌停20/炸板12,炸板率17.6%,**情绪七度=悲观 → 轻仓试错** |
| ftshare 池风险 | 162 只,未来7天解禁+商誉>30% = **0 命中** ✅ |
### ③ 我跑的交叉验证(数据源+路径+判断)
1. **涨停 56 是对的**:ftshare `status=limit_up` 56 = tushare `stk_limit` 收盘价=涨停价 56(我逐日算的)。`limit_list_d`=52 的差 4 只已**逐只核实 = 全是 ST**(*ST美芝/*ST顾地/*ST广糖/*ST发展,close==up_limit)→ 是"含不含ST"口径差,**不是数据冲突**。
2. **21:30 报告的"涨停68"不打架**:68 = ftshare 触板总数 = 56封板 + 12炸板。同一事实两种聚合 → 措辞应改成"触板68(含炸板12)",否则像两个源互咬。
3. **跌停口径真有病(本次没翻结论,但会翻)**:ftshare 涨停按 status 过滤(56封板),跌停却取池全长 20 = **13封死+6打开+1地天板** → 输入口径不对称。实测 `sentiment_level(56,20)/(56,13)/(56,9)` 都 = 悲观·轻仓试错 → **本次定级稳健**;但对称触板口径 `(68,25)` = **温和·正常参与** → 口径混装足以翻转定级,必须修。
### ④ 缺陷清单(只读值班,一行代码没动)
| 级 | 项 | 证据 / 影响 |
|---|---|---|
| P0 | **moneyflow 禁用在本链路没有替代** | 警告文案"改用 kpv_judge.py"——该文件存在(10-05 19:56 建),但 `node_turning_scan.sh` + zamao/secondary_low/exit_style/three_hypotheses **全库 0 引用**。今晚资金面确认层整晚空转:exit_style 3 条路径只剩 2 条可判、three_hypotheses 的 `mf_net` 恒=0 → "倾向"被钉死在"低"、zamao 资金维度降级。**信号本身是K线量价(踩踏/次低点)不受影响**,但"主力未明显撤退"这句话是半盲状态下说的。 |
| P0 | **抽样随机、不可复现** | `bingjia_system.get_pool_codes()` 末行 `return list(set(codes))` → 连跑 3 次前 6 只完全不同(实测)。`[:15]` = 163 只里**随机 15 只(9.2%)**,每只票每晚被扫到概率 9%,昨晚的信号票今晚可能根本不进扫描集。 |
| P1 | **取数失败无留痕** | per-stock `except Exception: pass` + 分母固定 15 → 空 df 只显示"数据不足",不计失败。实测 westock 限频下 `get_daily` **先出现 rows=0、后全部 rows=120**(回退非 100% 成功)→ 今晚 15 只里有没有票被静默吞掉,**无法判定**。 |
| P2 | 归档双份 + 标题失效 | 01:10:46 `ftshare晚间扫描` 与 01:10:49 `节点转折ftshare` 各传一次 IMA(后者含前者);显示名是临时文件名 `ima_upload_*.md`(`--title` 未生效)。 |
**验证过、不是问题的**:IMA 归档**真落地**✅(爱马仕库 10-06 共 17 篇,含本篇;9/27"假归档"未复发);westock 16 条限频告警 → 回退全部成功 rows=120/last=20260930;ERRLOG 空 = 无未捕获异常。
### ⑤ 新发现:调度漂移 + 挂账作业
- 21:30/21:45/21:40 三个作业实际落地 **01:02:37 / 01:10:49 / 01:13:12(10-06 凌晨)**,晚约 3.5 小时且顺序乱(21:40 排在 21:45 之后)→ 归档日期戳变 `20261006`(本应 1005)。对收盘数据无影响,但日期错位。
- **21:40 报告挂账的"收盘扫描-15:05"仍未清**:enabled=True,但 **9/30 最后交易日无任何产出记录**、10-05 也无;最近记录是 10-04(周日)14:01 `market_super_scan.py failed rc=1` → 触发日与 `5 15 * * 1-5` 不符,**10-08 15:05 必须盯**。
### ⑥ 待修(需切后端才动)
1. `get_pool_codes()` 返回 `sorted(...)` 或按 invest 优先排序 → 消除随机抽样|证伪:连续两晚池顺序必须完全一致。
2. 节点扫描逐只留痕:输出"成功/空df/异常"三计数,分母改成功数,空 df 标"取数失败"|证伪:输出出现"取数失败N"且 N=0 才算绿。
3. 节点链路接 `kpv_judge`,或让 exit_style/three_hypotheses 在 mf 缺失时显式标"资金面未判",禁止输出"主力未明显撤退/倾向低"。
4. ftshare 涨跌停统一口径(都封板或都触板);21:30 文案改"触板68(含炸板12)"。
**证伪条件**:若 10-08 盘前重扫后情绪/信号与本报告不一致 → 以 10-08 数据为准,本报告作废;若 P0-2 修复后仍报"取数失败N>0 却全绿" → 说明留痕还是半截的。