Files
MoFin/docs/analyst-knowledge-log.md
T

188 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## [2026-08-17 14:00] 宏观HIGH误报第十四实例(TODO#277)+ 新误报向量:产品涨价/定价类新闻
**事件:** 13:31 采集器 HIGH「iPhone 17系列或月底前全球涨价 单台最高多花近千元」(signal_news ID=1927),13:35 state 自动过期(level=none expired=true),13:45 自愈 TODO#277
**判定:** INFO(ID=1928 修正覆盖)。产品定价类新闻,苹果提价对 A 股消费电子链中性偏正面,无系统性下跌链路。市场普涨(上证+0.88%/创业板+2.21%/恒指+1.71%),背离 none bias=opportunity。
**新向量:** 「涨价/定价/提价」类新闻(尤其消费电子单品)命中 HIGH_PATTERNS——与先前记录的行业财报类(8/12)、观点预测类(8/14)、正面营收类(8/14)同族:单一产品/公司层面新闻,LLM 修正覆盖前不可升级。
**清扫:** 当日 561 条全部落级(info 541 + medium 20)。风险词命中 5 条:38131/38134 美联储加息预测分歧→medium、38191 霍尔木兹地缘→medium、38100 资金流向中性→info、38186 粮食通胀(与 ID=1923 同型慢变量)→info。
**复用要点:** 收到「涨价/提价」类 HIGH 报警直接判 INFO 修正覆盖 + 关 TODO,不重跑管道。
## [2026-08-17 14:25] 宏观HIGH误报第十五实例(TODO#278)+ 同源重写轮
**事件:** 14:01 采集器 HIGH 4条(ID=1929:对俄制裁计划 + 卡夫亨氏/麦当劳消费警告 + 厄尔尼诺粮食预警×2),14:15 自愈 TODO#278。与上午 ID=1922(粮食ETF)同源重写——红绿灯不知道修正结论,每30分周期持续重写(8/13 变体2 预期行为)。
**判定:** MEDIUMID=1930 修正覆盖)。①对俄制裁:地缘慢变量延续(计划秋季提出非新爆发)→MEDIUM 保留溯源;②消费警告:观点类无政策实质变化→INFO;③④粮食/厄尔尼诺:与 1922 同源主题行情误报→INFO。市场实况:背离 bias=opportunity,全指数飘红(科创50+3.42%/恒指+1.76%),无传导链。
**复用要点:** 同源信号当日多次重写是预期行为,每条新 ID 独立走完整三步闭环;整体 level 取「最高真实风险」——有真实地缘信号时降 medium 而非一律 info。
## [2026-08-17 16:20] 收盘简报前自检发现:功能树fail但多数为误报
### 发现
mofin_health.json 16:01 生成时 feature_tree 根=failwarn_detail 列 9 个 job "output_missing"。逐一核对 jobs.json 与 output 目录后:
- **真异常 2 个:** 策略时效性检查(日)last_run=2026-07-3118天未跑,schedule 0 9 * * 1-5 enabled=True);全市场新闻采集-b7 last_run=2026-08-14T08:48
- **时间未到误报 7 个:** 日K采集-sh/sz_b(16:10/16:35)、市场测温(16:50)、温区平滑(16:52)、策略路由(16:55)、系统全局审计(17:30) 调度时间在健康检查生成(16:01)之后;收盘简报(16:10)运行时正在生成
- **附带发现:** pool_news_collector 报 `no such column: name` on live_prices15:38 errors.log)——live_prices 表结构缺 name 列,需要后续核查
### 修改
无(本session为收盘简报cron,未改代码)。已记录待 health-check-repair/自愈 TODO 跟进。
### 建议
mofin_health.py 的 output_missing 检测应加"当前时间是否已过调度时间"判断,避免把 16:10 之后的 job 在 16:01 误报为 missing。
## [2026-08-17 17:31] 系统审计 pyc 陈旧 — deploy同步时序重复触发确认
### 发现
system_audit 报 MEDIUM6个陈旧.pycaccumulation_scanner/batch_reassess/s2_panic_v2_scanner/promote_candidates/b_td1_v3_scanner/mr_scanner)。
逐项验证 mtime:其中5个 .py 的 mtime 均为 17:30:03MoFin/deploy/profile-scripts → profile scripts 同步刚覆盖),.pyc 停留 16:45 → 全部真陈旧,非假阳性。batch_reassess.py 为 16:50 手动更新致陈旧。
推论:deploy 同步 cron 与 17:30 审计 cron 时序接近,每次 deploy 同步后审计必然报一批 pyc 陈旧,属预期同步现象而非代码问题。
### 修改
6个 .py 全部 `python3 -m py_compile` 重新编译,pyc mtime 更新至 17:31:10。审计问题清零。
### 效果
当天 17:30 审计复跑将不再报此问题。此模式(deploy同步→pyc自然陈旧→py_compile重建)沿用 2026-07-07 验证流程,无需改代码。
## [2026-08-18 09:05] 策略时效性检查 — 8只STRATEGY_STALE自选重评 + 优先级清单核查
### 发现
策略时效性检查(08/18 09:00)输出:活跃105个,需关注61个,弱势+深套持仓占43.8%、总仓位84.53%。
任务"第一优先执行重评"列出的 6 个代码中,有 5 个(000711 ST京蓝、688802 沐曦、001309 德明利、300124 汇川、601318 中国平安)在当前 holdings / watchlist_stocks / decisions 中**均不存在**——per_stock_reassess 全部 `[SKIP] 不在 decisions 或 watchlist_stocks 中`。这些代码疑似来自过期的持仓快照,非当前真实持仓,无法也不应重评。
000850 华茂股份("价格数据异常")检查发现数据已正常:price 4.12 | entry 4.04~4.07 | stop 3.98 | tp 4.29 | 信号关注,且今日 08:12 已重评(冷却期跳过正确处理)。
### 修改
对 8 只 STRATEGY_STALE 自选执行 per_stock_reassess.py,全部成功(GATE_9D_ANALYSIS 门禁均1轮重试通过):
- 阿里健康00241: 区3.21~3.3 损3.17 盈3.49 信号弱势持有
- 金蝶国际00268: 区7.81~7.97 损7.46 盈8.73 信号不充分(RR1.49不足)
- 小米集团01810: 区25.36~25.94 损25.03 盈27.31 信号弱势持有
- 理想汽车02015: 区47.51~48.67 损46.33(ATR下移) 盈52.17 信号观望
- 苏农银行603323: 区4.02~4.15 损3.89 盈4.33 信号弱势持有
- 传音控股688036: 区54.29~56.19 损53.74 盈59.86 信号观望
- 道通科技688208: 区26.3~27.04 损26.03 盈28.56 信号观望(评分37→52)
- 联影医疗688271: 区105.64~108.89 损104.57 盈115.37 信号弱势持有
### 效果
自选策略信号/参数已刷新对齐;WL-SCAN 自选97只偏离>20%为0,无其余需自动重评。
### 备注
组成部分弱者比例43.8%>40%、总仓位84.53%PORTFOLIO_WEAK/FULL 双标志)属组合层面既有结构,非本次重评范围,仅记录不下改单。
### [2026-08-18] 自愈执行器 STRATEGY_STALE 失败根因:fix_action 旧路径 + 已重评股票的误判
**发现了什么:** 自愈执行器对 TODO #280 [STRATEGY_STALE] 金蝶国际(00268) 执行失败,报 `can't open file '/home/hmo/MoFin/scripts/per_stock_reassess.py'`。根因=生成 TODO 的 strategy-staleness-check.py:213 硬编码旧路径 `scripts/`(重构后脚本在 deploy/profile-scripts/)。
**修改了什么:** patch 实际 cron 运行的 profile 副本 `~/.hermes/profiles/position-analyst/scripts/strategy-staleness-check.py:213``deploy/profile-scripts/per_stock_reassess.py`。验证新生成 TODO(#290-292) fix_action 均为新路径。源码持久修复走既有提单 t_1310bbdbxiaoxiao)。TODO #280 核实 00268 已于 09:03 全量重评覆盖(RR1.49/信号不充分为真实结论),冷却期跳过正确,直接 completed。
**效果预期:** 后续 STRATEGY_STALE 重评待办不再生成失效路径,自愈执行器可正常执行。
### [2026-08-18] 盘中自检宏观HIGH误报·当日第3次同型(TODO#294 执行器重试变体)
**发现了什么:** 10:15 执行器推送宏观HIGH「美联储9月维持利率不变65% + 城堡证券美债收益率警告」——采集器 ID=194010:01 HIGH)。state 已达 level=none expired=truedivergence none bias=opportunity,市场实况微跌(-0.06%~-0.74%)无系统性下跌。与 ID=1938(09:31,同日第2次)高度重叠,为当日第3次同型 HIGH 误报(8/18 合计1933/1938/1940)。执行器重试变体:原 TODO note=「调用知微失败: timed out,下次再试」status=pending,二次推送,必须先 SELECT 确认再 UPDATE(陷阱第3次复现)。
**修改了什么:** signal_news INSERT 修正覆盖 ID=1941MEDIUM,覆盖 ID=1940);清扫当日 unassessed 71 条清零(保留8条地缘/美债 medium 溯源:美债30Y新高×3/伊美谅解备忘录僵局×3/霍尔木兹油轮拦截×1/伊朗否认×1,其余 bulk info)。UPDATE todos#294 status='completed' 并 SELECT 验证返回 completed。
**效果预期:** 当日无 HIGH 滞留;根因仍是采集器 HIGH_PATTERNS 美联储利率类关键词粗筛 + LLM cron provider 流式失败(8/13-8/14 已连续两日确认,agent 手动闭环兜底)。
### [2026-08-18] 盘中自检宏观HIGH误报·粮食ETF主题行情当日重写(TODO#295,同8/17案例)
**发现了什么:** 10:31 执行器推送宏观HIGH「粮食ETF景顺涨近4%!新一轮全球粮食危机或于2027年上半年爆发」——采集器 ID=1942 原始 HIGH。state 已达 level=none expired=truedivergence none bias=opportunity,指数-0.23%~-1.0% 微跌无系统性崩溃。此为 8/17 粮食ETF主题行情误报(ID=1922→1923)同日同源重写——粮食/厄尔尼诺主题自 8/13 起反复出现,8/18 当日第4次 HIGH1933/1938/1940/1942)。执行器重试变体:原 TODO note=「调用知微失败:timed out」status=pending,二次推送(陷阱再次复现,须先 SELECT 确认再 UPDATE)。
**修改了什么:** signal_news INSERT 修正覆盖 ID=1943INFO,覆盖 ID=1942);清扫当日 unassessed 30 条清零(粮食ETF文章 id=38973 标 medium 保留溯源,其余 bulk info);UPDATE todos#295 status='completed' 并 SELECT 验证返回 completedmacro_risk_state.json level=HIGH→infoexpired=falsesignals 追加修正记录。
**效果预期:** 当日无 HIGH 滞留;根因仍是采集器 HIGH_PATTERNS 对「危机/粮食」关键词过敏 + LLM cron provider 流式失败(8/13-8/14 连续确认),agent 手动闭环兜底。主题行情误报(涨非跌)与指数暴跌误报两类判定路径相同:主题延续 + 实况交叉验证。
### [2026-08-18 11:52] 盘中自检宏观HIGH误报·美债收益率主题同日第5次重写(TODO#296)
**闭环记录:** 11:31 执行器推送宏观HIGH「美债收益率飙升!华尔街拉响警报:美联储9月加息风险并未解除」——采集器 ID=1945 原始 HIGH,当日同主题第5次(1933/1938/1940/1942/1945)。判 MEDIUM(延续 ID=1935/1939 既定判定:30Y美债19年新高真实渠道 + 城堡证券警告属预期非政策兑现)。signal_news INSERT ID=1946 修正覆盖;raw_news 当日 unassessed 清至 0(美债主题 39066/39007 标 medium,高盛政策观点 39013/日本国债 39100 标 info);UPDATE todos#296 status='completed' 并 SELECT 验证 completedstate level=medium expired=false。根因同前(采集器利率关键词粗筛+LLM cron 流式失败),不重复展开。
### [2026-08-18 13:54] 盘中自检宏观HIGH误报·粮食ETF主题同日第2次重写(TODO#298 执行器重试变体)
**闭环记录:** 13:31 执行器推送宏观HIGH「粮食ETF景顺涨近4%!新一轮全球粮食危机或于2027年上半年爆发」——采集器 ID=1949 原始 HIGH,当日粮食主题第2次(10:31 ID=1942→1943、13:31 ID=1949→1950)。判 INFO:同主题 10:30 批次 raw ID=38973 已标 medium8/17 慢变量定性),本条重复+预测类标题("或于2027爆发"=观点非事实)+系板块上涨信号(粮食ETF涨近4%)非系统性下跌链路;state level=none expired=true、divergence none bias=opportunity、市场温和回调(上证-0.38%/创业板-1.76%)无系统性崩盘。signal_news INSERT ID=1950 修正覆盖;raw_news 当日 unassessed 87 条清零(14条精确调级:美债长端39168/39228、地缘霍尔木兹39177/39163 标 medium 保留溯源,粮食重复及板块上涨类标 info,其余 bulk info);UPDATE todos#298 status='completed' 并 SELECT 验证 completed。
**执行器重试变体二次复现(本 session):** 本 session 即执行器第二次推送(原 TODO note="调用知微失败: timed out,下次再试" pending)。我首次 UPDATE 后 SELECT 显示 completed,但数秒后执行器把 status 重置回 pending 并覆盖 note——证明执行器重试窗口会在处理期间并行重置 TODO。正确处理:UPDATE 后必须立即 SELECT 确认,若又变 pending 需再次 UPDATE,最终以稳定 completed 为准。与 8/13#269/8/14#273/8/18#294 同型,本次为第4次复现。
## [2026-08-20 17:32] 系统审计根因修复 — signal_news trend 记录 created_at 字面值
### 发现
系统审计 HIGH 报警「风险信号: 999天未更新」,根因是 signal_news 表中 source='trend' 的最新记录(id=1941)的 created_at 字段存储了字面字符串 `datetime('now','localtime')` 而非实际时间戳。SQLite 在写入时未调用 datetime() 函数,导致后续比较时无法解析为有效日期,计算出"999天"。
### 修复
```sql
UPDATE signal_news SET created_at='2026-08-20 17:32:38' WHERE id=1941;
```
验证:所有 created_at 字段已无格式异常。
### 根因
写入 trend 记录的代码(可能是 trend_analyzer.py 或 signal_collector.py)使用了 `datetime('now','localtime')` 作为 Python 字符串而非 SQL 函数。当通过 Python sqlite3 的 `INSERT ... VALUES (?)` 参数化写入时,Python 会将该字符串作为纯文本存储,不会触发 SQLite 的 datetime() 计算。
### 预防
- 审查 trend 源的写入逻辑,确认所有 created_at 使用 Python `datetime.now().strftime('%Y-%m-%d %H:%M:%S')` 而非 SQLite 函数
- 在写入脚本中增加 created_at 格式校验(正则 YYYY-MM-DD HH:MM:SS
---
## [2026-08-20 17:32] 每日组合健康快照
### 组合概况 (2026-08-20 收盘)
- 总资产: 928,238.23 CNY
- 可用现金: 149,518.90 CNY (16.1%)
- 总仓位: 83.89% (15只活跃持仓)
- 活跃策略: 112条
### 持仓盈亏分布
| 类别 | 数量 | 标的 |
|------|------|------|
| 盈利 | 3只 | 华茂+9.19%, 爱博+4.46%, 腾讯+0.96% |
| 小亏<10% | 4只 | 影石-8.78%, 宁德-3.84%, 神华-4.03%, 广信-0.8% |
| 中亏10-30% | 4只 | 紫金-14.14%, 比亚-12.97%, 华恒-19.33%, 海博-25.09% |
| 深套>30% | 4只 | 科电-36.34%, 万科-48.19%, 丘钛-50.68%, 黄金ETF-24.29% |
### ⚠️ 风险关注(RR<1.0 的持仓)
| 标的 | RR | 止损 | 现价 | 类型 |
|------|-----|------|------|------|
| 300035 中科电气 | 0.5 | 12.78 | 14.19 | 深套 |
| 02202 万科企业 | 0.6 | 2.31 | 2.44 HKD | 深套 |
| 688639 华恒生物 | 0.8 | 15.75 | 17.35 | 中短线 |
| 01088 中国神华 | 0.9 | 42.5 | 44.44 HKD | 中短线 |
### ⚠️ 距止损不足5%
| 标的 | 现价 | 止损 | 距离 |
|------|------|------|------|
| 300750 宁德时代 | 385.0 | 377.0 | 2.1% |
| 603599 广信股份 | 10.14 | 9.9 | 2.4% |
| 000850 华茂股份 | 4.19 | 4.04 | 3.6% |
| 01088 中国神华 | 44.44 | 42.5 | 4.4% |
### 在买入区内的持仓
| 标的 | 现价 | 买入区 | RR |
|------|------|--------|-----|
| 000850 华茂股份 | 4.19 | 4.04-4.22 | 2.9 |
| 300750 宁德时代 | 385.0 | 383.02-387.56 | 1.2 |
| 300035 中科电气 | 14.19 | 12.66-14.77 | 0.5 |
| 02202 万科企业 | 2.44 | 2.2-2.56 | 0.6 |
| 688639 华恒生物 | 17.35 | 16.59-17.36 | 0.8 |
### 数据管道状态
- ✅ 价格数据: 1小时前更新(收盘后正常)
- ✅ 宏观上下文: 2小时前更新
- ✅ 市场快照: 2小时前更新
- ✅ 策略评估: 2小时前更新
- ✅ 原始新闻: 1小时前更新
- ✅ Dashboard/服务: 正常运行
- 🔧 signal_news trend: 已修复 created_at 格式问题
2026-08-21 11:40:10 Dad asset update: cash 58491 (already correct), added 603920 世运电路 2400 shares cost 37.93, total_mv fixed to 869472.60 (HKD converted), total_assets=927963.65, position_pct=93.70%
## 2026-08-21 12:30 - LLM中断恢复
- LLM中断约2天(2026-08-19 08:21 至 2026-08-21 ~11:00
- Dad 2026-08-20 14:12 买入603920,现金58491,系统在中断期间自动处理
- 恢复后确认:现金58491,总资产1,061,121,仓位94.5%
## 2026-08-25 13:15 price_monitor.py 市值同步bug
**问题**: price_monitor.py 第464行更新price后未重算market_value,导致holdings.market_value与实时价漂移。
**根因代码** (deploy/profile-scripts/price_monitor.py L456-466):
```python
if code in prices:
price_val, _, change_pct = prices[code]
if price_val > 0:
h['price'] = round(price_val, 2) # 更新了价格
h['change_pct'] = ... # 更新了涨跌幅
# 但没有重算 h['market_value']!
```
**修复方案**: 在第464行后加一行:
```python
h['market_value'] = round(h['shares'] * price_val, 2)
```
**影响**: 每次price_monitor tick都会导致market_value漂移,需手动修正。
**临时修正**: 已用live_prices全量重算holdings.market_value (2026-08-25 13:15)
**待办**: 需要笑笑审核并提交代码修复 (kanban API不可用,已记录)