← 归档索引 · 2026-10-08 22:46 · 节点转折+ftshare扫描-21:45
# Cron Job: 节点转折+ftshare扫描-21:45

**Job ID:** a5703c635470
**Run Time:** 2026-10-08 22:46:00
**Schedule:** 45 21 * * 1-5

**Prompt Characters:** 7970
## 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.

```
**结论先说:这不是 westock 偶发限频,是 10-05「资金流禁令」留下的结构回归——心法板块过滤被打穿成"全市场5224只逐票拉数",300 秒预算下必然超时。已实测复现、已用修复路径补回产物、仓库代码未动(只读值班)。**

---

## 1. 失败事实(本任务 4f1c7fd21ea3 龙头融合+确认链-21:40)

| 项 | 实测 |
|---|---|
| 调度 | 计划 10-05 21:40 → catch-up 10-06 00:09:52(晚 2h29m);脚本实际 01:08:11→01:13:12 |
| 1/2 龙头共振榜 | **rc=1,内层 exit=124(timeout 300s 截断)**,3 条 westock 服务限频告警 |
| 2/2 龙头确认链 | **rc=1,exit=4 上游缓存缺失**(/tmp/dragon_fusion_results.txt 不存在) |
| 影响 | 共振榜+确认链产物当晚全缺,下游无上游可引 |
| 附带文案缺陷 | wrapper 对任何 rc≠0 都打印「124=超时截断」,step2 实际是 exit=4,会误导排查 |

## 2. 根因链(每步都跑过,不是推的)

1. **10-05 20:00 资金流禁令落地**:`data_hub.MONEYFLOW_BANNED=True`,封 tushare.moneyflow / query:moneyflow / westock.fund_flow(证据:`stock_workspace/data_hub.py:201`、`~/.hermes/logs/moneyflow_banned.log` 首行 2026-10-05 20:00:46)
2. **`xinfa_scanner.phase0_sector_direction` 依赖 `hub.ts.query("moneyflow")`** → 禁令后恒空 → 我实跑返回 `ok=False, reason=moneyflow不可用`(0.001s)
3. **`get_filtered_codes` 在 p0 失败时降级成"返回全部股票"** → 实跑打印 `[xinfa] 5224只(盘感好的板块内)` —— 过滤彻底失效
4. **`dragon_fusion.collect_candidates` 把它当过滤传下去** → `dragon_preselect._load_filtered_data` 串行逐票 `get_daily`,单票实测 1.3s → 5224×1.3s ≈ **113 分钟**,而预算 300s
5. → exit=124 → 不写缓存 → confirm 链 rc=4 → 两段全红

**对照实验证明是回归不是偶发**:上次成功 10-04 13:32 = 禁令之前;westock 单票现在 1.3s 正常,限频是连打几百票后才出现的加速器,不是根因。

## 3. 实测对照(同一批代码,只换降级方向)

| 路径 | 结果 |
|---|---|
| 现状:`collect_candidates`(5224只过滤) | **480s 仍未跑完,PY_RC=124,0 只候选** |
| 修复方向:`scan_market(codes_filter=None)`(走 build_market 缓存面板) | **53.7s,30 只候选** |
| 修复方向再跑 `dragon_fusion --cron 30` | **16.0s,rc=0,9 只≥4路,缓存已写** |
| `confirm_chain_cron.sh` | **rc=0**,9 只双轨预案 |

**同一根因已打挂第二个任务(已实测,不是预测)**:`dragon_preselect_wrapper.sh`(龙头起涨前夜-21:58,`--codes xinfa` + timeout 240)——我用同命令复现 **RC=124 / 250.06s / 0 字节输出**;它今晚 01:47 真实跑完后:门户无 `龙头起涨前夜_20261006.md`、无 IMA 归档、cron 却记 **"ok"**。该 wrapper 末尾固定 `exit 0`,失败分支不打点 → **静默失败+假成功**。

## 4. 我补跑了什么(未改仓库代码,进程内改降级方向)

- `/tmp/dragon_fusion_results.txt`(01:41:06)、`/tmp/confirm_chain.txt`(01:41)已补回,下游不再开天窗;今晚 21:40 正式跑会覆盖。
- **共振榜 9 只**:003000.SZ 高置信 5/6(唯独缺突破启动);🔥4/6:688171.SH、300772.SZ、600406.SH、688325.SH、002572.SZ、002611.SZ、002020.SZ、300506.SZ。
- ⚠️ **数据 = 最后交易日 2026-09-30 收盘**(10-01~10-07 休市,10-08 周四开市)。confirm 链文案里的"首买点≈今日"在假期失真,别照单执行;资金行为一路用的是 10-05 已改成量价推断的 `s3_fund`,非假阳性。

## 5. 建议修复(未落地,等你点头)

`xinfa_scanner.get_filtered_codes`(539-567 行):p0/p1 不可用,或返回 codes > 1500 时 → **return [](=无过滤)**,让调用方走 `build_market` 缓存面板;3 个调用方(dragon_fusion / dragon_preselect CLI / leader_preselect_pool CLI)全是 `if codes_filter:` 真值判断,空列表自动落到快路径,无需改。
校验方式:改后跑 `dragon_fusion_cron.sh` 应 ≤60s rc=0 且缓存有新时间戳;`dragon_preselect.py --codes xinfa` ≤60s 出报告。
**不建议**只调大 timeout——5224×1.3s≈113 分钟,加到多少都不够。
**证伪条件**:若 10-08 21:40 不改代码也 rc=0 且有产出,说明我的"结构回归"判断错、真凶是限频偶发——目前证据不支持这个方向(480s 跑不完 + phase0 恒失败都是直接测量)。

## 6. 顺带发现(未诊断)

- 盘前 8:00 四维裁决报「标的: 0只」,而 `pool/pools.json` 实际 invest=19 + watch=4(10-06 01:01 写入)→ 读池口径与池内容不一致,值得单独查。
- 同一时段(10-06 00:07–00:31 停机后集中 catch-up)另有 cron 报错:凌晨维保(vector_memory rc=1)、收盘收尾流水线、学习质量回溯、hrr_build、signal_factor、pan_engine_self_improve、git_autocommit;你给的上下文里 收盘扫描-15:05(10-04 14:01)也是 rc=1(market_super_scan.py),均未在本次范围内排查。
- 牵连面:全库 34 个文件引用 moneyflow;`dragon_fusion.s3_fund` 10-05 已改量价推断,但 `xinfa_scanner.phase0` 漏改——典型的"改了A没搜B"。
```

## 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扫描失败报告 · 2026-10-08

## 结论先行
今晚 4 步里 **[1] 步 rc=1、[4] 步里"产业链动态扫描"整段崩溃**,共 2 处失败。**其余数据全绿**(daily/daily_basic 5557条、top_list 74、涨跌停79/19、北向4条、板块/情绪/HMM/龙头/轮动各段均正常产出)。两处都是**存量老病,不是今晚新出的**。

---

## 失败①:产业链动态扫描 → AttributeError(核心失败)

**现象**:`chain_definition_card.py` 抛 `AttributeError: 'DataHub' object has no attribute 'smart_select'`,链A(AI产业链)+链B(创新药)整段没了,AI判断层少了一个标注"必引用"的数据段。

**根因(我跑了验证)**:
- 调用点 `chain_definition_card.py:182` → `hub.smart_select(query)`
- 实测(venv python):`hasattr(hub,'smart_select') = False`、`hasattr(hub,'select_stocks') = True`
- `smart_select` **只存在于废树** `~/stock/data_hub.py:2211`(iFinD主→mx备);而 `stock_workspace/data_hub.py` 是软链 → 规范版 `~/.hermes/scripts/data_hub.py`,那里只有 `select_stocks`(2747行,纯mx路由),**规范库从未有过 smart_select**(`git log -S 'def smart_select'` 零命中)
- 一句话:**脚本写给废树 API,底座已换成规范库 → 接口断链**

**存活时间**:10/06、10/08 两晚日志都有同一行 Traceback(1005日志无该段)→ **已连续带病 ≥3 天**。影响面:全库仅此 1 个调用方。

**半静默风险**:`evening_master_scan.sh:46` 用 `CHAIN=$(... 2>&1)` 捕获,Traceback 被打进报告但 **step4 退出码仍=0**,所以总 rc 没红——只在文本里可见,容易被当成"格式噪音"刷过去。

**修复方案(未执行,前端只读值班)**:
- 方案A(1行+适配):改调 `hub.select_stocks()`,但 mx 返回裸 `resp.json()`(`{"error":...}` 或 MX包),与脚本期待的 `{ok,source,data}` **形状不匹配**,`_smart_select_stocks` 的解析要一起适配
- 方案B(推荐):把废树的 `smart_select()` 移植进规范 `data_hub.py`(iFinD search_stocks 主 → mx stock_select 备,返回 `{ok,source,data}`)——保住 iFinD 路由,且与脚本 docstring 声明一致

---

## 失败②:tushare盘后数据采集 rc=1 —— 已知"狼来了"

**根因**:`data_hub.get_moneyflow_by_date` 已按老板 10/05 口径**硬禁用**(data_hub.py:218「资金流数据已禁用→改用 kpv_judge」),必然返回空 → `night_batch_collect._collect_moneyflow` 落 `status=empty` → `evening_2130_scan.py:31` 把它算进 `bad` → 恒 `return 1`。

**这行告警 10/06 已被诊断过并写明**:「只要不禁用口径,此后**每晚恒 rc=1** → 真失败会被狼来了淹没」(证据:`/tmp/evening_2130_20261005.log`、`..._1006.log`、`..._1008.log` 三晚同一行)。**至今未修,第3晚**。

**修复建议**:把 moneyflow 从"必绿名单"摘掉(标记 `status=disabled` 不计入 `bad`),让 rc=1 只代表真失败。

---

## 顺带发现(不阻塞)
- `judgment_extract(v3)` 不认今晚报告格式 → 0条入台账(脚本自报"待实现v4抽取器")
- `judgment_extract`/两融 `margin no data in 7d` 属数据源空窗,非管道故障

## 修什么就修什么(待你点头,不加戏)
1. 移植 `smart_select` 到规范 data_hub(或改链脚本+形状适配)→ 恢复产业链段
2. moneyflow 退出"必绿名单" → 让 rc=1 重新有意义
改完各跑一次 `evening_2130_scan.py` / `chain_definition_card.py scan --top 1` 验证 rc=0。
```

## 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 位置×量判读
📊 节点转折点扫描(10/15有信号):
  688256.SH 次低点✅|踩踏✅ — ℹ️ 无离场信号:主力未明显撤退,按持仓纪律
  002151.SZ 次低点✅ — ℹ️ 无离场信号:主力未明显撤退,按持仓纪律
  300041.SZ 次低点✅|踩踏✅ — ℹ️ 无离场信号:主力未明显撤退,按持仓纪律
  002049.SZ 踩踏✅ — ℹ️ 无离场信号:主力未明显撤退,按持仓纪律
  920001.BJ 踩踏✅ — ℹ️ 无离场信号:主力未明显撤退,按持仓纪律
  603501.SH 次低点✅ — ℹ️ 无离场信号:主力未明显撤退,按持仓纪律
  603078.SH 踩踏✅ — ℹ️ 无离场信号:主力未明显撤退,按持仓纪律
  688272.SH 次低点✅ — ℹ️ 无离场信号:主力未明显撤退,按持仓纪律
  002080.SZ 次低点✅|踩踏✅ — ℹ️ 无离场信号:主力未明显撤退,按持仓纪律
  300831.SZ 踩踏✅ — ℹ️ 无离场信号:主力未明显撤退,按持仓纪律

[2/2] ftshare晚间扫描...
═══ 涨跌停情绪扫描 20261008 ═══
涨停 45 家 | 跌停 19 家 | 炸板 34 家
炸板率 43.0% | 早盘板 35 | 尾盘板 0
情绪七度: 悲观
建议: 轻仓试错
═══ 池风险扫描(未来7天解禁 + 商誉>30%)═══
池共 149 只,命中风险 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:** 3916
## Response

# 📊 节点转折+ftshare 晚间扫描 · 2026-10-08

## 结论先行
**脚本层全绿**(两段均非空、stderr 0 字节、`=== 完成 ===` 无失败标记 → rc=0;IMA 已归档 2 份,实测知识库有 `ima_upload_节点转折ftshare_20261008_214705.md` / `..._ftshare晚间扫描_20261008_214702.md`)。**但复核时抓到 3 个结构性问题:① 今晚报告的 10 只是从 170 只池里"随机抽 15 只",复跑与正式跑重叠 = 0;② 输出里存在自相矛盾行(出货🟡 + 无离场信号);③ 信号无基准率,全池 69% 都有信号。** 数据日期 = 20261008(节后首个交易日)。

---

## 一、市场读数(先大盘)

| 指数 | 收盘 | 涨跌 | 量(vs 前日) |
|---|---|---|---|
| 上证 | 3811.90 | **-0.79%** | 4.82亿 vs 4.15亿 放大 |
| 深成 | 12620.90 | **-2.07%** | 1.68亿 vs 1.49亿 放大 |
| 创业板 | 3036.66 | **-3.15%** | 放大 |

**闸门判定:① FAIL** — 深成指 9/30 收 12887.62,今日 12620.90 **创新低**(未止跌);② 成交放大(满足)。两条件须同时满足 → **未过闸,个股信号今晚只作记录,不作操作依据。**

## 二、ftshare 情绪(21:45 实测)

```
涨停 45 | 跌停 19 | 炸板 34 | 炸板率 43.0% | 早盘板 35 | 尾盘板 0
情绪七度: 悲观 → 建议: 轻仓试错
池风险: 149只(扫描时点)解禁/商誉 0 命中
```

**交叉验证通过(漂亮)**:21:30 任务的 tushare `stk_limit` 报 `up_limit=79, break=34, down=19`;ftshare 报 45 收盘涨停 + 34 炸板 = **79 ✓**,跌停 19=19 ✓,炸板 34=34 ✓。两源口径互补、数字完全自洽。

**池数三口径对账(全部解释得通,非 bug)**:扫描时 149 → 21:58:56 `dragon_preselect` 写入 20 只「起涨前夜」auto 新股 → 169(ft 只读 `code` 字段)→ **170**(get_pool 认 `ts_code or code`)。差额 20 = 新增,差额 1 = 见下问题③。

## 三、节点转折信号(正式跑 10/15)

688256 次低点+踩踏|002151 次低点|300041 次低点+踩踏|002049 踩踏|920001 踩踏|603501 次低点|603078 踩踏|688272 次低点|002080 次低点+踩踏|300831 踩踏 —— 全部"无离场信号"。

**检测器本身我逐只独立复跑验证:10/10 判定完全一致**(次低点布尔值、踩踏分类全匹配)→ 检测器确定性 ✓、可复现 ✓。问题不在检测器,在下面的抽样。

## 四、🔴 发现① 抽样是随机的,报告不可复现(根因级)

`node_turning_scan.sh:23` → `codes = hub.get_pool()[:15]`,而 `bingjia_system.py:135` 返回 **`list(set(codes))`** —— set 顺序由 PYTHONHASHSEED 决定,**每次进程都不同**。

实测(不是推的):
- **21:45 正式跑的 10 只 vs 我复跑的 10 只:重叠 = 0**
- 同脚本 A/B 双跑:A=11 只信号、B=13 只,重叠仅 5
- 10 次独立抽样,前 15 两两重叠均值 **1.29**,随机独立期望 **1.32** → 纯随机,无任何稳定序

**影响量化**:单晚只扫 15/170 = **8.8%**;5 晚累计覆盖仅 37%;今晚报告的 10 只 ≠ 明晚报告的 10 只,**跨日不可比、不可追踪**。另有 3 处 `get_pool_codes()[:5]`(expectation_manager / mainforce_interpreter / weak_rebound)同病。

**修复(未执行,待你点头)**:`bingjia_system.py:135` `list(set(codes))` → `list(dict.fromkeys(codes))`(保序去重,1 行)。或更彻底:**全池扫描** —— 我已实测 **170 只跑满 5 模块 = 129.6s < timeout 240s**,可行。
校验:改后连跑两次,信号集必须完全一致;耗时 ≤150s rc=0。
证伪:若明晚不改代码、两次跑出相同 10 只 → 我的"随机抽样"判断错(现有 1.29 vs 1.32 + 重叠 0 的证据不支持这个方向)。

## 五、🟡 发现② 输出存在自相矛盾行(今晚复跑实证)

```
300258.SZ 出货🟡 — ℹ️ 无离场信号:主力未明显撤退,按持仓纪律
```
根因:`classify_stampede` 判 `distribute`(放量大跌)时,`advice` 却固定取 `es['advice']`(exit_style 返回 none)。**同一行里"出货"和"无离场信号"打架**,读者无法采信。另有 300548.SZ 今日 **-13.37%**(全池最大跌幅)也输出"无离场信号"——`right_kill` 要求跳空低开>1%,它只低开 -0.55% → 漏判。
**修复**:`node_turning_scan.sh` 输出逻辑改为——`st=distribute` 时 advice 取 stampede 的 meaning,不取 exit_style 的 none 文案;并给 `right_kill` 加"单日跌幅 ≤-8%"的并列入口。校验:构造 300548 样例,输出不得再出现矛盾句。

## 六、🟡 发现③ 池覆盖缺口 1 只 + 信号无基准率

- `ft_risk_scan.load_pool_codes` **只读 `code` 字段** → invest 池 **300548.SZ 博创科技**只有 `ts_code` → 被漏(169 vs 170)。修:`item.get("code") or item.get("ts_code")`(1 行)。
- **基准率缺失**:全池 170 只实测 **117 只(69%)有信号**、踩踏命中 **53%**、出货 4%。所以"10/15 有信号"毫无信息量(随机抽 15 只期望就有 ~10 只)。**建议输出底部固定打印全池基准**,否则报告在制造虚假的"信号密集"感。
- `exit_style.left_hidden` 分支要求 `mf.columns` 有 `main_net_amount`,moneyflow 禁令后 `get_moneyflow` 恒返回空 DataFrame → **三种离场方式永久只剩 2 种**,需在输出标注"左侧隐性离场已停用"。

## 七、上下文任务状态(顺带核对,非本任务范围)
- **21:40 龙头融合:今晚已恢复** ✅ `xinfa_scanner.py` 已按 10-06 诊断改为 `return []`(我实测 `get_filtered_codes` → 0 只 / 0.00s 走快路径),`/tmp/dragon_fusion_results.txt` 21:41 写入,任务 last_status=ok。**但改动未提交**(git status 仍 M,今晚 3:00 autocommit 才会入库)。
- **21:30 产业链扫描:仍未修** ❌ `data_hub.py` 无 `smart_select`、`chain_definition_card.py:182` 仍调用 —— 第 4 晚带病。moneyflow 恒 rc=1 也是第 4 晚。

---
**因果基因**:数据源 = evening_2145_scan.sh(rc=0/errlog 0字节/IMA 2份实测在库)+ DataHub.get_daily(20261008 全量)+ ft_limit_sentiment/ft_risk_scan 独立复跑 + bingjia_system 源码。分析路径 = 脚本产物验收 → 检测器逐只复验(10/10 一致)→ 抽样机制溯源(set 随机序,10 次抽样重叠 1.29≈期望1.32)→ 全池基准实测(69%)→ 三口径池数对账(149+20=169,+300548=170)。判断 = 管道绿、检测器可信,**抽样层随机导致报告不可复现是今晚唯一根因级问题**;闸门① FAIL,全部信号降级为记录。

**明日可验证**:① 深成指收盘 < 12620.90 → 闸门继续 FAIL,个股信号不作操作;② 不改代码复跑两次 → 若信号集又不同,随机抽样判断坐实;③ 改 `dict.fromkeys` 后两次跑信号集应完全相同。