← 归档索引 · 2026-10-12 15:41 · 量价训练-每日提醒
Cronjob Response: 量价训练-每日提醒
(job_id: ea96f4ceec38)
-------------

📊 因果基因
- 数据源: `vol_price_trainer.py --save/--verify/--stats` 实跑(data_hub 日线,最新 bar 2026-10-09)→ `stock_workspace/data/vol_price_training.db`(已验证44条)+ `data/judgments.db`(#2028–2031 回读确认);反事实复算直调 `_q3_vp_match/_q4_mainforce/_q5_action`
- 分析路径: 五问链 Q1→Q5 逐层作答并落库 → `--verify` 用7日后真实3日涨跌回填 → 分周/分口径切片找趋势 → 对 Q3 阈值做 1.5→1.3 单变量反事实复算定位伪信号成因 → 对 verify 全队列跑 `days=0` 核对"报N条/处理几条"差额
- 判断: 训练3只、验证0/3;命中率连续4周下行、「可参与」近30天仅9.1% → 今日3条中2条为阈值伪信号;两处缺陷已定位未修(阻塞在只读模式+分界日);1条外部判断被台账拒收需回填

---

# 量价训练 · 每日提醒 2026-10-12

## 0. 一句话结论
今日训练 **3 只**、验证 **0/3**;「可参与」信号近30天 **11中1 = 9.1%**、按周命中率连续4周下行(81.8→60.0→58.3→50.0)。今天顺手把训练器跑穿了两处:**1 个判据断崖(把放量大跌判成量价中性→反而输出"可参与")**、**1 个验证链静默断链(24条积压、本次处理0条、提示0条)**。已定位到行、补丁备好,**未改代码**(当前前端只读模式 + 改判据需重接边,不是cron里顺手改的事)。

---

## 1. 今日训练 3 只(五问因果链 · 实跑 `vol_price_trainer.py --save`)

| 代码 | 名称 | 数据截止 | Q1 位置 | Q2 量态 | Q3 量价 | Q4 主力 | Q5 操作 | 模式 | 置信 |
|---|---|---|---|---|---|---|---|---|---|
| 600183 | 生益科技 | **2026-10-09** | 中位 44.2% | 放量 1.48x | 量价中性 | 主力在场(维护) | 可参与 | 主力维护(可持续) | 4 |
| 000001 | 平安银行 | **2026-10-09** | 高位 77.6% | 正常 1.24x | 量价中性 | 主力在场(维护) | 可参与 | 主力维护(可持续) | 4 |
| 688530 | 欧莱新材 | **2026-10-09** | 中位 27.7% | 放量 1.30x | 量价中性 | 主力在场(维护) | 可参与 | 主力维护(可持续) | 4 |

已入库 vp_judgments id=70/71/72(run 时间 15:31)。

**两个必须看的前提:**
1. **信息截止是 10-09,不是今天**:15:31 实跑时 `data_hub` 日线最新 bar = `20261009`(10-12 的日bar还没落),所以这3条判断用的是上一交易日收盘。10-12 的 bar 落库后,verify 会按 10-12 收盘起算(详见缺陷2)。
2. **与 14:35 全引擎方向冲突**:生益科技训练器判「可参与」,全引擎判「**清仓**」(#2020,止损已破 -11.6%、60分钟四根全在开盘下方)。差的是3个交易日的数据(10-09 收盘124.14 vs 14:48 实时120.17)。**以全引擎为准**;训练器这条已按原值落账 #2028,只当回测样本,不作交易依据。

---

## 2. 验证(`--verify`)

```
验证7天前的判断(9条)
❌ 2026-09-29 688419 耐科装备: 观察 → 3日 -10.07%
❌ 2026-09-29 300657 弘信电子: 观察 → 3日  -9.51%
❌ 2026-09-29 600345 长江通信: 观察 → 3日  -3.14%
命中: 0/3 = 0.0%   评级 🔴 需加强
```

**报「9条」,实际只处理 3 条**:另外6条(09-27×3、10-04×3)被代码静默 `continue` 掉,一条提示都没有 → 见缺陷2。

补测(为查差额,跑 `verify(days=0)` 拉全队列,只读、预期0写入):
```
验证0天前的判断(24条)
(零输出)→ 跑完后未验证剩余仍为 24
```
**24 条积压、处理 0 条、提示 0 条** —— 验证环当前是黑箱。

---

## 3. 命中率趋势(数据源 vol_price_training.db · 已验证 44 条)

| 口径 | 数字 | 判定 |
|---|---|---|
| 近30天全量 | 33条 / 19中 = **57.6%** | 含「观望」17条**自动判命中**(score_hit 里 `观望→True`),虚高 |
| 按 ISO 周 | W37 **81.8%**(11) → W38 **60.0%**(15) → W39 **58.3%**(12) → W40 **50.0%**(6) | **连续4周下行** |
| 可操作·近30天(只算「可参与」) | 11条 / 1中 = **9.1%** 🔴,均 **-2.65%/笔**(3日),盈亏比1.8:1 | 核心坏消息 |
| 「可参与」全量 | 16条 / 5中 = 31.3%,均 +0.89%/笔 | 被9月上旬的赢家抬着 |
| 分段 | 09-09~09-11 **5中4(80%)**;**09-14 起 11中1(9.1%)** | 信号是**中途坏掉的**,不是一直差 |
| 模式「主力维护(可持续)」 | 21条 / 6中 = 28.6%,均 **-0.64%/笔** | 模式本身不可用 |
| 最贵一击 | 600176 中国巨石 09-22 被判「可参与」→ 3日 **-13.64%** | 就是当前持仓巨石的坑 |

**结论:趋势 = 下降,且根因是判据(缺陷1),不是样本量。**

---

## 4. 缺陷(全部实跑取证,非推测)

### 缺陷1 · 判据断崖:Q2/Q3 量比口径不一致 → 放量大跌被判「量价中性」→ 输出「可参与」
- **代码位置**:`_q3_vp_match` L229-230(`last_change<0 and vol_ratio>1.5` 才判**放量下跌**,且只用**5日量比**)|`_q2_volume_state` L191-197(取 `max(MA20, 5日)`,`>1.3` 就判**放量**)|`_q4_mainforce` L286-293(`vp_match∈{放量上涨,量价中性}` + 量稳 → **主力在场(维护) conf4**)|`_q5_action` L343-344(conf≥4 → **可参与**)
- **实测 600183(10-09)**:价 **-5.85%**、5日量比 **1.477** → Q2 说「放量 1.48x」,Q3 说「量价中性」(差 **0.023x** 没过 1.5)→ Q4「主力持续维护」→ Q5「可参与」
- **反事实真跑**(把 Q3 阈值 1.5 对齐 Q2 的 1.3,其余不动):

| 代码 | 现状 | 反事实 |
|---|---|---|
| 600183 | 量价中性 → 主力在场(维护)4 → **可参与** | 放量下跌 → 不明2 → **观望** |
| 688530 | 量价中性 → 主力在场(维护)4 → **可参与** | 放量下跌 → 不明2 → **观望** |
| 000001 | 量价中性 → 主力在场(维护)4 → 可参与 | 不变(1.083x 本就中性)→ 可参与 |

→ **今日3条「可参与」里 2 条是阈值造成的伪信号。**
- **牵连面(改1处=搜全库)**:① Q4/Q5 分发逻辑 ② `vol_price_weekly_review.py`(同一 vp_judgments 库统计)③ `tests/test_vol_price_hit_scoring.py`(词表守卫)④ 历史 44 条已验证判断**按新阈值不可比**,需设分界日或整段重算 ⑤ `judgement_drift_guard` 会把「输入未变、结论变」判红 → 必须显式登记。
- **状态:未改**。补丁一行待批:`_q3_vp_match` L229 `vol_ratio > 1.5` → `vol_ratio > 1.3`(L231 同步对齐);**需转后端 + 先定分界日**,否则历史命中率会静默断层。

### 缺陷2 · 验证链静默断链:`date` 写的是运行日,不是交易日
- **代码位置**:L1598 `today = strftime('%Y-%m-%d')` 被当作 `date` 入库;L1729 `if date_norm not in trade_dates: continue` —— **静默,无日志**。
- **实测积压 24 条,其中 15 条的 date 根本不在交易日历里 → 永久无法验证**:
  - 09-27(周日)3 条、10-04(周日)3 条 —— **已实测被跳过**(本次「9条」里那6条差额)
  - 10-06(国庆假期)6 条、10-07(国庆假期)3 条 —— 同一代码路径,到期后会同样被跳过(这9条是假期里跑的,用的是 09-30 的数据,bar 序列 `0930 → 1008`)
  - 10-06 有 **6 条 = 当天跑了两次**,重复样本
  - 另 10-08/10-09/10-12 共9条是正常待验(缺未来3根bar)
- **后果**:① 报告数字与实处理数对不上,差额不报(今天实测 9 vs 3)② 这15条永不进命中率 → **选择偏差**(只有"恰好在交易日跑"的判断被计分)③ 队列只增不减。
- **修法(两处)**:写入端 `date` 改用 `df['trade_date'].iloc[-1]`(**信息日**);verify 端精确日期缺失时回退到「≤date 的最近交易日」并**打印跳过原因**。
- **状态:未改**,同上待批。牵连:`vol_price_weekly_review.py` L64 按 date 过滤,语义一并受影响。

### 缺陷3 · 旁路发现(1条,别的cron)
台账隔离表 `judgments_rejected` id=1:**14:40尾盘**那条「退潮中继·总仓位压0-2成·12278.78多空分界」因 **no_reason** 被拒收(14:56:09)→ 没进回测环。需上游补 reason 回填,否则这条方向判断永远无命中率。

---

## 5. 判断落账(judgment_ledger · 已写入并回读 #2028–#2031,reason/falsify 齐全,0 拒收)

| id | 方向 | 标的 | 证伪条件(可自动核对) | 窗 | 置信 |
|---|---|---|---|---|---|
| 2028 | 看多 | 生益科技(训练器原判·可参与) | 2026-10-15 收盘 ≤ 2026-10-12 收盘 | 3日 | 2 |
| 2029 | 看多 | 平安银行(训练器原判·可参与) | 2026-10-15 收盘 ≤ 2026-10-12 收盘 | 3日 | 3 |
| 2030 | 看多 | 欧莱新材(训练器原判·可参与) | 2026-10-15 收盘 ≤ 2026-10-12 收盘 | 3日 | 2 |
| 2031 | 中性 | 训练器「可参与」信号 · **暂停采用** | 2026-10-12 起30天内新增「可参与」3日胜率 ≥55%(即归因错误,本判断作废) | 20日 | 4 |

#2028–2030 是**训练器原值**(供信号质量回测),不是交易指令;#2031 是我基于 44 条实测 + 阈值反事实的判断。

---

## 6. 未完成 / 阻塞项(诚实报)
- **未改代码**:缺陷1、缺陷2 的补丁已定位到行并给出,**阻塞在「前端只读」模式 + 改判据必须先定历史分界日** → 需转后端批准后一次改到位(含 weekly_review、测试、分界日登记)。
- **未回填**:缺陷3 的被拒收判断属别的 cron,未代填 reason。
- 本报告是**训练任务**,不给交易建议;生益/巨石的清仓指令见 14:35 全引擎 #2019/#2020。

---

**✅ 归档已验证**:IMA「爱马仕」库回读命中 `ima_upload_量价训练-每日提醒_20261012_完整版_154040.md`(get_knowledge_list 第1页),`/tmp/ima_archive_errors.log` 无记录。

To stop or manage this job, send me a new message (e.g. "stop reminder 量价训练-每日提醒").