← 归档索引 · 2026-10-04 13:28 · 信号纵向跟踪+反馈闭环-23:15(原23:30并入·2合1)
# Cron Job: 信号纵向跟踪-每日23:15
**Job ID:** c85cc7fd1251
**Run Time:** 2026-10-04 13:28:04
**Schedule:** 15 23 * * 1-5
## Prompt
[IMPORTANT: The user has invoked the "script-output-integrity" skill, indicating they want you to follow its instructions. The full skill content is loaded below.]
---
name: script-output-integrity
description: 消费预跑脚本注入的数据时加载。先判数据真假再分析,识别假成功/降级/空段并标注完整度。
version: 1.0.0
author: Hermes Agent
license: MIT
category: fugui
tags: [data-integrity, silent-failure, consumer-side, cron]
metadata:
hermes:
tags: [data-integrity, silent-failure, consumer-side, cron]
related_skills: [silent-failure-defense, pan-gan-signals]
---
# 消费脚本输出 —— 先判真假,再分析
> 面向**读**注入数据的人(分析 cron),不是**写**脚本的人。
> 建造侧(怎么写不产生假成功)看 `silent-failure-defense`。
## When to Use
```
□ prompt / 上下文里出现「预跑脚本输出」「Script Output」「以下数据由预跑脚本采集」
□ 要用脚本采集的数据做判断、写报告
□ 某段数据看起来"有内容"但可疑(一行字样、空段、括号里的说明)
```
## 铁律:数据段先过完整性,再进入分析
**禁止把「缺失/降级」当作「正常数据」分析。** 缺失要标注,不要脑补。
### 识别清单(按严重度)
| 形态 | 真实含义 | 动作 |
|---|---|---|
| `xxx.sh: timeout` | **该段根本没跑**(不是"超时所以没数据")。典型是 `timeout N cd` 类缺陷 | 该段判为【零数据】,禁用其做主力判断 |
| `failed to run command '...'` | 内建命令被 timeout 包住 → 整段从未执行 | 同上 |
| `Traceback` / `ModuleNotFoundError` | 该段完全不可用 | 同上 |
| `❌<名> 失败(rc=N)` | 该段采集失败(已诚实上报) | 标注缺失,相关结论降级 |
| `(xxx不可用)` / `[超时]` / `数据采集失败` | 降级标记,段落内容为空 | 标注缺失 |
| `[SILENT]` | 无内容(合法语义:无异常/无新增) | 不要当数据,也不要当错误 |
| 空段 / 只有标题 | 采集为空 | 标注缺失 |
| 接口**无报错返回空 DataFrame** | 路由瞬时降级(非"今天无数据") | 重试一次再定性;仍空 → 判缺失 |
> 实测(2026-09-28 12:05):`data_hub.get_realtime_quotes(8 codes)` 一次返回 0 行**且不抛异常**,同一批码 30 秒后重跑全部正常 → 是瞬时静默降级。
> 判据:**空/无异常 ≠ 无数据;先重试,再定性**。消费侧把"空"当"没有"会导致整段结论凭空消失。
### 必须做的三件事
```
1. 报告开头标注完整度:「数据完整度: N/M 段可用」,缺失段逐条列名
2. 缺失段对应的结论 → 标注「基于间接推理 / 置信度降级」,不得伪装成实测
3. 禁止:用缺失段当论据;用"数据暂缺"当结论;脑补缺失段的内容
```
### 反面案例(实测,2026-09-11)
```
## Script Output
【午间扫描 | 2026-09-11 12:00】
midday_scan.sh: timeout ← 整块市场数据就是这一行假的
【心法扫描 | 2026-09-11 12:00】
════ Phase 0: 板块主力方向 ════
```
该报告被连续数周当成正常午间分析发出,AI 拿着这行假消息当市场数据做判断。
**根因:消费侧没有"先判真假"这一步。**
### 一句话判据
**看到数据段,先问「这段是真的吗」,再问「这段说明什么」。**
顺序反了,后面全废。
The user has provided the following instruction alongside the skill invocation: [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. Never combine [SILENT] with content — either report your findings normally, or say [SILENT] and nothing more.]
## Script Output
The following data was collected by a pre-run script. Use it as context for your analysis.
```
=== 信号纵向跟踪 ===
验证/回填: 59条
更新35条
(数据源降级: westock 日K 48 次失败(服务限频),非交易时段自动走 tushare 兜底;逐条明细见 /tmp/signal_track_update.err)
信号总数: 85 | 已完整验证(T+20齐): 13 | 跟踪中(未到T+20): 72
类型 数量 T+5命中 T+5均值
----------------------------------------
breakout 9 1/8=12% -4.9%
launch 22 8/10=80% +5.7%
pre_launch 54 21/35=60% +5.1%
最近信号:
2026-10-04 恒烁股份(688416.SH) T5=- -
2026-10-04 德明利(001309.SZ) T5=- -
2026-10-04 东芯股份(688110.SH) T5=- -
2026-10-04 普冉股份(688766.SH) T5=- -
2026-10-04 普冉股份(688766.SH) T5=- -
2026-10-04 兆易创新(603986.SH) T5=- -
2026-10-04 赢时胜(300377.SZ) T5=- -
2026-10-04 长飞光纤(601869.SH) T5=- -
信号纵向跟踪报告
============================================================
总计: 167只 | 命中(T+5>2%): 38只 命中率23% | 平均T+5=-1.2%
来源 数量 命中率 平均T+5 平均T+20
--------------------------------------------------
dragon_preselect 85 26% -0.4% —(无T+20)
low_launch 59 15% -3.2% —(无T+20)
pre_launch 19 32% +1.1% +7.3%
launch 3 33% -0.7% +0.3%
breakout 1 0% -4.0% -11.7%
板块 数量 命中率 平均T+5
----------------------------------------
半导体 38 42% +0.8%
未知 23 30% +0.6%
生物制药 14 7% -5.6%
火力发电 12 8% -4.8%
元器件 9 22% -3.9%
电器仪表 9 33% +2.0%
玻璃 7 29% +2.2%
汽车配件 7 0% -3.5%
水力发电 4 0% -0.4%
塑料 4 50% +6.2%
=== 参数反馈 ===
{
"pre_launch": {
"hit_rate": 31.6,
"count": 19,
"avg_t5": 1.09
},
"launch": {
"hit_rate": 33.3,
"count": 3,
"avg_t5": -0.7
},
"breakout": {
"hit_rate": 0.0,
"count": 1,
"avg_t5": -4.04
},
"dragon_preselect": {
"hit_rate": 25.9,
"count": 85,
"avg_t5": -0.39
},
"low_launch": {
"hit_rate": 15.3,
"count": 59,
"avg_t5": -3.19
}
}
```
信号纵向跟踪:1) signal_feedback.db 渐进验证(缺T+20的行持续回填,未到T+20不提前落标);2) 更新 signal_track.json 所有信号的 T+1/T+3/T+5/T+10/T+20 快照;3) 输出 signal_feedback.db 类型命中率报告(阈值统一2%);4) 有已完成信号时输出各来源/板块命中率与参数反馈(low_launch/dragon_preselect 来源,数据齐了自然出现,无数据不硬凑)。
## Response
# 信号纵向跟踪 · 2026-10-04 报告
**数据完整度: 4/4 段可用**(纵向跟踪头段 / 类型命中率 / 来源·板块报告 / 参数反馈均在,无 timeout、无 Traceback、无空段)
**降级 1 项**: westock 日K 48 次限频 → tushare 兜底(已实证兜底成功,见下)
**数据基准**: 最新交易日 = **2026-09-30 收盘**(`data_hub.get_latest_trade_date()=20260930`);2026-10-04 为周日+国庆休市,**今日无新行情**,本轮所有"新数据"都是 9/30 收盘值。
---
## 一、先判真假(我实际跑的验证)
| 检查项 | 方法 | 结果 |
|---|---|---|
| 降级是否真兜底 | 抽 4 条 9/29 信号,用 `t1 = 9/30收盘/entry_price` 复算 vs 快照 | **4/4 完全一致**(-2.68/-3.72/-5.63/-4.05)→ 9/30 真实行情已入库,非空转 |
| 命中口径 | db `hit_t5` vs `return_t5>2` 逐行比;track `hit` vs `t5>2` 逐条比 | **0 处不一致**(两套阈值已统一 2%) |
| 两套命中率可否互证 | db∩track 按 (date,code) 配对 24 条 | **t5 平均绝对差 = 0.0%** → 计算口径无漂移 |
| 98 条 pending 是否该 pending | 对照交易日历(9/25–9/27 中秋、10/1 起休市) | **全部合理**:9/23 信号只走完 4 个交易日(9/24、9/28、9/29、9/30),T+5 未到 |
| 10-04 信号价格基准 | 中际旭创/生益科技 price_at_signal = 808.44 / 129.96 = 9/30 收盘 | 一致,**不是假日编造的价格** |
**结论:数据是真的,没有假成功段。** 但报告里有 4 处**标签/口径会误导**,必须先标注再读数。
---
## 二、必须标注的口径问题(不标注就会读错)
1. **"总计 167 只"是成熟子集,不是全量。** track 实际在跟踪 **265 只**,167 = 已到 T+5(done),**98 只(37%)还在跟踪中且报告未列名**(9/23:29、9/27:9、9/28:22、9/29:16、10-04:22)。
2. **"验证/回填: 59 条"≠ 新验证 59 条。** 读代码:`verify_signals()` 返回的是本轮**重写的行数**(72 行合格 − 13 行无行情 = 59)。**今日新完成 T+20 的行数 = 0**(`verified_at` 最新仍是 2026-09-27)。同理 **"更新 35 条" = 新写入的快照字段数**(t1/t3 逐个计),不是 35 只信号。
3. **"信号总数 85"是行数不是票数**:85 行 = 77 只票,8 行是同日同票双类型(生益科技/中际旭创 pre_launch+launch 各一行)——"最近信号"里普冉股份出现两次是这个原因,不是重复采集。
4. **两套命中率不能横向对比——这是最大的读数陷阱**:
- 段1(类型表)来自 `signal_feedback.db` = **invest 池每日扫描**的 77 只票;
- 段2(来源/板块表)来自 `signal_track.json` = **扫描器报送**的 265 条;
- **交集只有 31 只**(db 独有 53 行,track 独有 234 条)。
- 同名 `pre_launch`:db **60%** vs track **32%** —— 拆开实测:db 中**在 track 内**的 6/20=30%,**不在 track** 的 **15/15=100%**(全是 9/11–9/15 半导体/医药那段);`launch` 同理:不在 track 的 **7/7=100%**,在 track 的 1/3=33%。
- **→ 段1的 60%/80% 是"9 月中旬窗口 + 未入 track 的小样本"贡献的,不能当策略胜率。**
---
## 三、真实表现(附 n 与 95% Wilson CI)
**Track 全体(n=167 成熟 / 265 跟踪中):命中 23%,平均 T+5 = −1.2%**
| 来源 | 命中率 (95%CI) | 平均T+5 | 判断 |
|---|---|---|---|
| low_launch | 15%(9/59,CI 8–27%) | **−3.2%** | 跑输阈值,无正期望 |
| dragon_preselect | 26%(22/85,CI 18–36%) | −0.4% | 无超额 |
| pre_launch | 32%(6/19,CI 15–54%) | +1.1% | 唯一均值为正,但 n 太小 |
| launch / breakout | n=3 / n=1 | — | **不可下结论** |
**T+20 是全报告最薄的数据:track 侧仅 13 条**(pre_launch 11 条 +7.3%、launch 1 条、breakout 1 条),且这 13 条与 db 的 13 条是**同一批票**。→ 报告里 pre_launch「平均T+20 +7.3%」的 n=11,**不足以支撑任何长周期结论**。
**板块(n≥7 才看)**:半导体 42%、n=38、+0.8%(CI 28–58%,唯一大样本为正)|生物制药 7%、−5.6%(n=14,最差)|火力发电 8%、−4.8%(n=12)|汽车配件 0%(n=7)|玻璃 29%、+2.2%(n=7)。
**"未知 23"不是市场没板块**:实测这 23 条 = track 里 source 为 pre_launch/launch/breakout 的全部条目,**recorder 没传 sector 字段**(数据缺口,非业务含义)。
---
## 四、行动含义 + 证伪条件
**机会轨**
- **半导体是唯一大样本正贡献来源**(38/167 = 23% 的成熟样本,42% 命中、均值转正)——但它同时是段1高命中的窗口所在,需复市后新增样本再确认,不追加仓位结论。
- `pre_launch` 是唯一均值为正的来源,可**保留跟踪但不加权**(n=19)。
**风险轨**
- **low_launch + dragon_preselect 占跟踪量 212/265 = 80%,命中 15%/26%、均值均为负** → 参数反馈的直接读法:这两个来源在 2% 阈值下**当前没有正期望**。可选动作:收紧准入判据,或在合成信号里降权。
- `breakout` 在两套数据里都是负贡献(db 1/8 = 12%、−4.95%;track n=1、−11.7%)→ 样本小,但**方向一致为负,先停用不亏**。
**证伪条件(说了就认)**
1. 若复市后 low_launch / dragon_preselect 各再成熟 ≥30 条,命中率 ≥35% 且平均 T+5 转正 → "无正期望"判断**证伪**,改判为数据窗口偏差。
2. 若段1的"不在 track"样本(15/15、7/7)在扩到 9 月全月后仍 ≥60% → 窗口解释**证伪**,需转向查 `log_signals()` 记录偏差(只在强势票上记录信号的选择性记录)。
**已知但暂不动的口径瑕疵**(不翻转结论,记录在案):`entry_price` 与日线更新源不同源,个别票差 0.35%(如 300718 9/27 entry 57.31 vs 9/28 收盘 57.11),2% 阈值下不改变命中判定;10-04 的 22 条 `entry_price=0`,复市首日才补基准 → **今日显示 T5=- 属正常,不是采集失败**。