← 归档索引 · 2026-10-06 00:53 · 数据底座健康周报AI解读
# Cron Job: 数据底座健康周报AI解读

**Job ID:** 4fa4b21225e3
**Run Time:** 2026-10-06 00:53:32
**Schedule:** 30 8 * * 1

**Prompt Characters:** 4458
## 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 'edb0a7f09bc2'
The following is the most recent output from a preceding cron job. Use it as context for your analysis.

```
# Cron Job: 数据底座六源探测-每日3:40(P1-4)

**Job ID:** edb0a7f09bc2
**Run Time:** 2026-10-06 00:33:19
**Mode:** no_agent (script)

---

wind       edb                  ✅      0.1s  {'ok': False, 'source': 'wind', 'error': 'search failed: unk

✅ 已保存: capability_matrix.json(86 项能力)
✅ 已保存: capability_details.json(全详情,供 hub.get_capability_probe() 查询)
矩阵: {"MX": ["realtime", "daily", "finance", "news", "us", "fund", "board", "select", "stock_select", "zixuan_query", "moni_assets"], "mootdx": ["minutes", "stocks", "block", "finance"], "tushare": ["daily", "weekly", "monthly", "daily_basic", "fina_indicator", "income", "stk_limit", "top10_holders", "index_daily", "stock_basic", "trade_cal", "adj_factor", "margin", "ths_index", "block_trade", "stock_company", "lhb", "macro", "forecast", "express", "ths_daily", "ths_member", "index_classify", "tdx_in

📊 因果基因(脚本自证)
- 数据源: 四主源mootdx/tushare/mx/westock + 补充源gf_skills/ifind 全方法探测(probe_sources.py --save)
- 分析路径: 逐源逐方法探测可用性 → 回显探测摘要 → 刷新data/capability_matrix.json能力掩码供自动路由
- 判断: rc=0=能力矩阵已更新;rc非0=输出[ALERT]探测失败并以1退出,交看门狗归因
```

## Script Output
The following data was collected by a pre-run script. Use it as context for your analysis.

```
# 数据底座健康周报(2026-10-06,窗口 7 天)

| 源 | 类型 | 成功 | 失败 | 成功率 | 平均耗时 |
|:---|:-----|:----:|:----:|:------:|:-------:|
| ftshare | probe_limit_pool | 1 | 0 | 100% | 0.42s |
| gf_skills | probe_valuation | 1 | 0 | 100% | 0.29s |
| mootdx | daily | 0 | 37 | 0% | 0.00s | ⚠️已知(bars 协议失效(8/3 连带),tushare→mootdx→westock 兜底链中 mootdx 段必空,westock 主路已覆盖)
| mootdx | finance | 1 | 0 | 100% | 0.00s |
| mootdx | minutes_realtime | 3 | 2 | 60% | 0.00s |
| mootdx | probe_minutes | 1 | 0 | 100% | 0.05s |
| mootdx | realtime | 0 | 8 | 0% | 0.00s | ⚠️已知(quotes 协议失效(8/3),CAPABILITIES=False,路由已绕开)
| mx | daily_fallback | 0 | 21 | 0% | 0.00s | 🔥
| mx | daily_realtime | 0 | 5 | 0% | 0.00s | 🔥
| mx | probe_batch | 0 | 2 | 0% | 1.04s |
| mx | realtime | 0 | 8 | 0% | 18.58s | 🔥
| mx | realtime_batch | 0 | 8 | 0% | 1.33s | 🔥
| tushare | blocks | 2 | 0 | 100% | 0.00s |
| tushare | daily | 1015 | 5 | 100% | 0.00s |
| tushare | finance | 0 | 56 | 0% | 0.00s | ⚠️已知(兜底空(westock 已覆盖),非主链)
| tushare | kline | 11285 | 1056 | 91% | 0.48s |
| tushare | probe_daily | 1 | 0 | 100% | 0.03s |
| westock | daily | 684 | 1051 | 39% | 0.00s | 🔥
| westock | daily_fallback | 10 | 27 | 27% | 0.00s | 🔥
| westock | finance | 13 | 56 | 19% | 0.00s | ⚠️已知(12:22 测试批量噪音,复测 3/3 正常(8/15))
| westock | probe_kline | 1 | 0 | 100% | 0.66s |

## 源汇总
- 🔴 **mx**: 0/44 成功(0%)
- 🔴 **mootdx**: 5/52 成功(10%)
- 🔴 **westock**: 708/1842 成功(38%)
- ✅ **tushare**: 12303/13420 成功(92%)
- ✅ **gf_skills**: 1/1 成功(100%)
- ✅ **ftshare**: 1/1 成功(100%)

## 诊断建议
- 🔴 mx 近期成功率低——建议人工检查:协议失效/配额/账号;必要时查 probe_sources.py 重探测
- ⚠️ mootdx 低成功率均为已知项(见上表 ⚠️已知 标注),无需人工介入
- 🔴 westock 近期成功率低——建议人工检查:协议失效/配额/账号;必要时查 probe_sources.py 重探测

生成: 2026-10-06 00:33 | 台账: health_tracker.py → data/call_stats.db
```

你是数据底座健康诊断官。上方是 health_report.py 生成的健康周报数据。

任务:
1. 解读各数据源(mootdx/tushare/mx/腾讯源westock/gf_skills/ifind)的成功率与异常
2. 对成功率<50%的源给出根因判断(协议失效/间歇性/配额/正常波动)和处置建议(重探测/换路由/人工介入)
3. 输出三行结论:✅正常源 / 🔴问题源+根因 / 下一步动作
注意:mx 是东财MCP有日配额、mootdx quotes 2026-08-03 起协议失效属已知问题(非新增故障)、新浪已禁用。

**Response Characters:** 4791
## Response

# 数据底座健康诊断(2026-10-06 · 周报窗口 09-29→10-06)

**数据源**:`health_report.py` 7天周报(15,360 条调用)+ 台账全量 `data/call_stats.db` 172,989 条(8/15 11:55→10/6 00:49)+ 活体探测(venv python 实跑 `data_hub` 6源)+ `tushare trade_cal` 交易日历。
**分析路径**:周报成功率 → 按日/按小时拆失败时间序列 → 按 dtype 拆全量历史趋势 → 活体复测定性 → 兜底链末端验证。
**先纠一个窗口偏差**:trade_cal 实查,窗口内**只有 09-29、09-30 是交易日**,10-01~10-07 是国庆假期(下一交易日 10-08)。7 天里 5 天非交易日 → 周报失败数天然被假期批次放大,下面全部按"交易日/非交易日"分开定性。

---

## 一、六源解读

| 源 | 周报 | 全量(8/15起) | 定性 |
|:--|:--:|:--:|:--|
| **tushare** | 12,303/13,420 = **92%** | 104,865 条 = **93%** | ✅ 主链稳定,周趋势 W35-W39 恒 93-94% |
| **westock** | 708/1,842 = **38%** 🔥 | 66,535 条 = 86% | 🔴 **趋势性劣化(见下)** |
| **mootdx** | 5/52 = **10%** | 1,091 条 = 39% | ⚠️ 已知(quotes/bars 8/3 协议失效,路由已绕开) |
| **mx** | 0/44 = **0%** 🔥 | 401 条 = 9% | 🔴 **结构性失效(见下),非本周新故障** |
| gf_skills / ftshare | 各 1/1 | 65/65、32/32 | ✅ 但周样本各仅 1 次;**ifind 7 天内 0 次调用(无样本)** |

---

## 二、<50% 三源根因判定

### ① westock 38% —— 根因:**5 周连续趋势性劣化 + 1 次 51 分钟整体中断**(非配额、非账号)

- **趋势(westock/daily 主路径周成功率)**:W34 **97%** → W35 84% → W36 63% → W37 65% → W38 50% → W39 **35%** → W40 57%。不是本周偶发,是**从 9 月中旬起单调下滑 5 周**。
- **09-29 20:00:35–20:51:38**:westock/daily **348 连败(0 成功)**,同一秒级批次 tushare/daily **348 全成功** → westock 侧 51 分钟整体不可用,**兜底链 100% 接住,无数据丢失**。
- **10-04/10-05/10-06(非交易日)**:逐票交错失败(同秒双 worker,`010100000000…` 序列)→ 符号级空返回,不是中断。
- **末端验证(周报算不出来的关键数)**:全窗口 westock daily 失败 1,117 次 → **1,074 次(96%)在 20 秒内被 tushare/daily 成功接住**,**43 次(4%)没接住**(09-29 35 次、10-05 3 次、10-06 5 次)。
- **活体(今天 00:44 实跑)**:`sh600519`/`sh600696` `limit=120 fq=qfq` 连打 **15/15 全成功,0.62s** → 源活着;但 `limit=5` 时 `sh600696` **8/8 返回 0 行**、`sh900901` 0 行(`sh600519` 正常)→ **westock 对小 limit 参数敏感**,而 `probe_sources.py` 用的正是 `limit=5`。
- **`westock/finance`**:W36 起连续 5 周 **17–27%**(今天 10-06 3/19)。周报里那条 ⚠️已知 写的是"8/15 测试批量噪音",**与 9 月中旬以来的实测不符 → 标注过期,把真劣化盖住了**。
- **处置**:① 重探测改为 `limit≥120` 再判能力;② westock/finance 标注更新为"持续低成功率待查";③ **证伪条件:10-08 开盘复测 westock/daily,若仍 <70% → 判定源侧改版/限流,主路切 tushare 优先。**

### ② mx 0% —— 根因:**8/15 台账建立以来 5 类接口 0 成功的结构性失效**(已排除"整源挂"和"日配额整体耗尽")

按 dtype 拉全量历史(不是本周):

| dtype | 全量 | 结论 |
|:--|:--:|:--|
| mx/realtime | **0 / 57** | 8、9、10 三个月**一次没成功过**,含 09-29 12:01 交易日盘中 |
| mx/realtime_batch | **0 / 79** | 同上(含每日 3:40 六源探测,今天 00:32 仍失败) |
| mx/daily_realtime | **0 / 77** | 同上 |
| mx/daily_fallback | **0 / 68** | **设计使然**:`MX.get_daily` 实测只回 **6 行 < 30 行保护阈值** → 必判失败,且只在 tushare+mootdx 全空时才被调用 |
| mx/probe_batch | **0 / 66** | 同上 |
| mx/kline | 35 / 45 = **78%** | ✅ 9 月起可用 |

- **活体**:`mx.finance_data` **3/3 成功,1.17–1.36s**(搜索类通);`mx.get_realtime_batch(["600519","300308"])` → 返回 `{}`(1.7–3.0s);`mx.realtime` 失败耗时 **7.9–32.9s** = 超时特征。
- **判定**:不是整源不可用(搜索接口正常)、不是日配额整体耗尽(配额耗尽会全接口挂);是**实时类接口返回空/超时的结构性问题**(参数或协议漂移)。`daily_fallback` 21 次失败是**设计判失败**,却被周报当故障打 🔥。
- **诚实限制**:当前是非交易时段,`realtime` 空返回无法 100% 区分"非交易时段无数据",但 09-29 12:01(交易日)同样 30s 超时 → 结构性结论成立,**10-08 盘中需复测一次收口**。
- **处置**:`mx/daily_fallback` 立刻进 KNOWN_ISSUES;mx 实时三类接口二选一——**修(查正确调用/字段解析)或入 KNOWN**,别每周重新报一次 🔥。

### ③ mootdx 10% —— 已知,无需介入
quotes/bars 8/3 协议失效,`KNOWN_ISSUES` 已标注、路由已绕开;`minutes_realtime` 3/5 属间歇小样本。今天 00:xx mootdx/daily 26 次全失败 = 兜底链空段,非新增故障。

---

## 三、周报本身查出的 4 个系统问题(比失败率更该修)

1. **两份 `data_hub.py` 行为分叉**:`~/.hermes/scripts/data_hub.py`(171KB,**0 处 track**,`MXDriver` 没有 `get_realtime_batch`)vs `/home/ubuntu/stock/data_hub.py`(199KB,**唯一写台账**,有该方法)。同一调用 `get_realtime(["600519"])`:scripts 版返回 1 行有数据,stock 版返回空 DataFrame → **周报只统计了走 stock 版的那部分调用,口径不完整**。
2. **熔断实时状态(00:47 实查)**:源级 `westock/tushare/mootdx` 均为 **OPEN**(24h 最近 20 条失败率 85%/55%/100%);能力级 `westock/daily`、`tushare/daily` 也满足熔断条件。**幸好 `get_daily` 路径 grep 显示根本不检查熔断**(只有 kline/realtime/mx 系列检查),所以主链没被锁。⚠️ 潜在雷:**一旦把熔断接进 get_daily,假期低成功率会自锁**——熔断期间不写台账 → 永不自愈;08:30 系统健康检查(1-5)含重置可兜底。
3. **周报口径缺陷**:① 窗口含 5 个非交易日,假期周报天然失真;② `KNOWN_ISSUES` 缺 `mx/daily_fallback`(设计性必失败)→ mx 被误判为整源故障;③ `westock/finance` 标注停在 8/15;④ 台账无"链路末端是否拿到数据"字段 → **96% 兜底率这种真正决定可用性的数字,周报算不出来**。
4. 10-06 00:30 自愈报 `No module named 'pandas'`(自愈探测用系统 python3 跑 data_hub)→ 解释器不对,非数据源问题。

---

## 三行结论

✅ **正常源**:tushare(周报 92% / 全量 93%,周趋势稳定 93-94%,活体 `daily` 6000 行正常)、ftshare、gf_skills(各 100%,但周样本仅 1 次;**ifind 7 天零调用,无样本不等于健康**)。

🔴 **问题源+根因**:**westock 38% = 5 周趋势性劣化(97%→35%)+ 09-29 20:00 51 分钟整体中断 + finance 连续 5 周 17-27%**,配额/账号已排除,96% 失败由 tushare 兜底、43 次未接住;**mx 0% = 8/15 以来 realtime 0/57、realtime_batch 0/79、daily_realtime 0/77 的结构性失效**(搜索类活体 3/3 通,kline 78% 可用),其中 daily_fallback 21 次是 30 行保护的**设计判失败=周报误报**;mootdx 10% = 8/3 已知协议失效。

下一步动作:① `mx/daily_fallback` 入 KNOWN_ISSUES、`westock/finance` 标注改写为"持续低成功率待查"(消除两类误报);② **10-08 开盘复测**:westock/daily ≥70% 否则主路切 tushare 优先,mx realtime 盘中复测收口结构性结论;③ probe_sources 的 westock 探测 `limit=5 → ≥120` 后重跑;④ 合并两份 `data_hub.py` 并统一 track(否则周报口径继续残缺);⑤ health_report 加"交易日窗口过滤 + `final_ok` 末端字段",熔断**暂不要**接进 `get_daily`。