Files
MoFin/analyst-knowledge-log.md
T
知微 7c0e85af28 硬性策略质量门禁 validate_strategy()
新增 STRATEGY_QUALITY_GATES 检查清单(9条红线):
CRITICAL: 止损/止盈存在+>0, 买入区下沿<上沿
HIGH: 止损≤买入区, 买入推荐含RR≥1.5, 港股标currency=HKD
MEDIUM: signal短词, tech_snapshot含技术位

enforce_strategy_quality() 插在写入链的两处:
1. reassess_with_context() return前 → 单只重评必过
2. regenerate_all() for d in decisions: 写DB前 → 批量重评必过

不过的:status=review_needed, signal降级→信号不充分
不会写进DB/JSON,除非修复了CRITICAL问题
2026-07-02 13:46:53 +08:00

200 lines
12 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.
记录知微对MoFin系统的缺陷修复和知识萃取项。
## 2026-07-02 11:30 macro_context_collector.py Pattern 9 百分比阈值修复 + 跨句涨幅匹配修复
**发现了什么:** 自愈执行器报告false positive——"中概领涨"被标记为HIGH风险。追踪发现Pattern 9 `指数[^。]*?(?:跌幅|下跌)[^。]*?[2-9]%`有两个Bug
1. 小数阈值Bug: `[2-9]%`在"0.3%"中提取"3%"匹配,误将<2%跌幅标为HIGH
2. 跨句匹配Bug: "指数集体下跌的背景下...中概收涨近3%"中,`[^。]*?`跨过整个句子把"下跌"和"3%"连起来,但"下跌"是指美股下跌,"3%"是指中概收涨——两个不同语境
**修改了什么:**
- 文件: `/home/hmo/MoFin/scripts/macro_context_collector.py`
- Pattern 9: `指数[^。]*?(?:跌幅|下跌)[^。]*?[2-9]%`
`指数[^。]*?(?:跌幅[^。]{0,20}(?:扩大至|达|至|超|为|逾)[^。]*?(?<![0-9.])(?:[2-9]|[1-9][0-9])(?:\.\d+)?%|下跌(?!.*?涨)[^。]*?(?<![0-9.])(?:[2-9]|[1-9][0-9])(?:\.\d+)?%)`
- "跌幅"分支:要求跌幅后有测量词(扩大至/达/至/超/为/逾),防止"跌幅"和其他分句的"%"跨句匹配
- "下跌"分支:用`(?!.*?涨)`负向前瞻阻断含有"涨"的上下文(如"收涨近3%"
- 阈值修复:`(?<![0-9.])(?:[2-9]|[1-9][0-9])(?:\.\d+)?%` 防止"0.3%"中"3%"被提取
- Pattern 10: `(?:暴跌|重挫|熔断).*[5-9]%` → 同样加小数排除 + 改成`[5-9]|[1-9][0-9]`范围
- `_PATTERN_CHECKS``_KNOWN_BAD_SIGS`同步更新
- `intraday_health_check.py`: 宏观风险HIGH去重,防止同一风险状态累积多个TODO
## 2026-06-23 09:00 数据采集脚本修复
**发现了什么:** `market_watch.py` cron任务报错,exit code 1
- 错误:`ModuleNotFoundError: No module named 'mofin_db'`
- 原因:脚本在 `/home/hmo/.hermes/scripts/` 下运行,Python路径不包含 `/home/hmo/MoFin/`
**修改了什么:**
- 文件:`/home/hmo/.hermes/scripts/market_watch.py`
- 在第19行(`from mofin_db import` 之前)插入:
```python
import sys
sys.path.insert(0, '/home/hmo/MoFin')
```
**效果预期:** 下次cron触发时脚本能正常导入mofin_db并完成市场数据采集+SQLite写入。
**同步发现的策略检查问题:**
- 自选股18只全部处于买入区(价格距离买入区<3%),属正常范围
- 其中2只策略为空(楚江新材、中谷物流)— 需补充
- 整体仓位93.02%,弱势+深套占比41.9%>40%
## 2026-06-25 11:50 价格监控updated_at修复
**发现了什么:** 健康检查误报"价格数据649秒未更新(portfolio.json"
**根因链:**
1. `price_monitor.py` 写 portfolio.json 时仅在价格变化时写入,且不更新 `updated_at` 字段
2. 盘中价格稳定(如午盘横盘)→ portfolio.json 长时间不更新 → `updated_at` 停留在上次变动时间
3. `intraday_health_check.py` 检查 `updated_at` 是否超过10分钟无更新 → 触发误报
**修改了什么:**
- 文件:`/home/hmo/MoFin/price_monitor.py`(同步到 profile scripts 副本)
- 逻辑变更:
- 价格变化写入时:同时更新 `pf['updated_at']` 为当前时间
- 价格无变化时:每10分钟强制刷新一次 `updated_at`,避免横盘期误报
**效果预期:** 价格稳定横盘时 portfolio.json 的 updated_at 仍每10分钟刷新一次,健康检查不再误报。
## 2026-06-25 13:20 stale_push_wlin 流程修复:先重评后推送
**发现了什么:** 自选买入提醒中推送的策略数据可能滞后。例如13:11报告中德明利止盈810.78但现价882已超过。
**根因链:**
1. stale_push_wlin 只在 `[STRATEGY_STALE]` 标记的票触发重评,非stale的票直接推旧策略
2. 策略的止盈/止损/信号在推送前未刷新,可能出现推了止盈位但价格已超过的情况
3. Dad 指出正确流程应该是:推荐前先重评 → 重评确认有效再推
**修改了什么:**
- 文件:`/home/hmo/.hermes/profiles/position-analyst/scripts/stale_push_wlin.py`
- 逻辑变更:
- 收集所有在买入区的自选(stale + 非stale),统一先调 trigger_regen_sync() 重评
- 重评完成后重新读取 decisions.json 获取最新策略数据
- 用重评后的 timing_signal 重新判断是否可推(不再用旧 is_stale 标记)
- 同一次推送中可能有多只票,全部用新数据出报告
**效果预期:** 每次推送自选提醒前,所有预推票都经过最新一次策略重评,止盈/止损/信号不滞后。
## 2026-06-25 14:00 三点联动修复
**发现了什么:** Dad反馈三个问题:(1) price_monitor的区进区出/重评告警太吵 (2) 现金只有total字段,没有区分可用/冻结,买力算错 (3) 德明利卖出后未及时更新止盈
**修改了什么:**
**① price_monitor XMPP推送降噪**
- 文件:`/home/hmo/MoFin/price_monitor.py`
- 原:所有outputs(⚡进入买入区 🔄重评 📊新策略 ✅全量重评)全部推XMPP
- 改:只推 ⚠️止损跌破 和 🌀情景切换,其余只local print不推
**② 现金三级结构**
- 文件:`/home/hmo/MoFin/data/portfolio.json`
- 新增 `cash_available`(可用买力)和 `cash_frozen`(冻结在途)字段
- stale_push_wlin.pyload_cash() 和 calc_position() 优先读 cash_availablefallback到 cash
- 推荐中的买力计算现在用可用现金而非总现金
**③ 德明利自选策略重评**
- 文件中:`/home/hmo/MoFin/data/decisions.json`
- 原止盈810.78(已被涨停突破)
- 新止损810.0 新止盈1153.26 新买入区873.18~908.82 | RR=3.24
- 已保证自选策略和其他自选一样走自动重评流程
**效果预期:** 系统不再推送区进出/重评噪音,推荐用可用现金算买力,德明利自选随时可重新入场。
## 2026-06-25 14:50 price_monitor 自选止损止盈告警屏蔽
**发现了什么:** 德明利(001309)已清仓转自选,但 price_monitor 仍对其推送止盈警报("⚡ 德明利进入止盈区间"),数据无误但信号无意义,在Dad卖飞后伤口撒盐。
**根因:** get_trigger_zones() 对自选和持仓一视同仁返回止损/止盈区间,price_monitor检查所有active decision。
**修改了什么:**
- 文件:`/home/hmo/MoFin/price_monitor.py`
- 函数 `get_trigger_zones(d)`
- 买入区间:自选和持仓都监控(自选需要zone to trigger重评)
- 止损+止盈:仅持仓(share>0)才监控,自选不生成止损/止盈zone
**效果预期:** 已清仓的德明利/药明康德等自选不再推送止损止盈告警。买入区进出仍触发重评(内部不推送),保证策略持续更新。
## 2026-06-27 三维分析框架固化(news-flow-analysis skill
**发现了什么:** 协鑫能科(002015)分析暴露三个系统性问题:
1. 之前分析脱离大盘环境看个股,给出孤立判断
2. 资金流数据只看单日暴量不看连续性,被6/24→6/25反向流误导
3. 没有离场预警框架,只关注买入机会不关注风险信号
**新设了什么:**
- Skill: finance/news-flow-analysis — 新闻+资金流+大盘三维分析法
- 四个层面印证框架(消息面→技术面异常→资金流验证→资金性质追踪)
- 反向框架(离场预警信号)
- 六项报告输出规则(大盘→板块→个股异常→资金验证→资金性质→明确结论)
**自检清单(所有报告产出必须检查):**
□ 有没有考虑大盘环境?
□ 有没有考虑板块背景?
□ 逆势信号有没有识别?
□ 资金流向有没有验证?
□ 是单日暴量还是连续趋势?
□ 有没有离场预警的反向思考?
□ 结论有没有具体价格?
□ RIP原则:数据是否已核实(非模拟伪造)?
**效果预期:** 所有个股分析自动走三维印证流程,避免孤立判断。资金流分析看趋势不看单日。每份报告自带离场预警条件。
## 2026-06-29 数据新鲜度铁律(数据准确零容忍 · 违反记录)
**违反了什么:** 周一(6/29) 15:20 和 15:48 两次分析使用了 multi_tf_cache.json(周五 23:05 缓存的收盘价)作为价格依据,未拉取腾讯实时价。
**导致的错误:** 中芯国际 H 建议止损(实际+10%盈利)、建滔积层板建议止损(实际盈利+11%)、中国神华建议止损(实际反弹+15%)。完全错误的操作建议。
**根因:** LLM 分析时图方便读了本地缓存文件,没有执行「先拉实时价」这个基本动作。
**修复规则(永久写入):**
- 任何分析、报告、回复,第一行代码必须是拉取腾讯实时报价
- 严禁从 multi_tf_cache.json / decisions.json 等缓存文件直接读取价格数据来推操作建议
- 唯一允许的价格源:腾讯实时 APIqt.gtimg.cn)或 price_monitor 刚写入的 events/state
- 违反这条 → 自动回滚,追加到违规记录
## 2026-07-02 10:00 盘中自检 NameError 修复
**发现了什么:** 自愈执行器报 `盘中自检: 价格数据新鲜度检查失败: name 'mo_data' is not defined`
- 根因:`intraday_health_check.py` 第11行用 `from mo_data import read_portfolio`(直接导入函数),但第117行写的是 `mo_data.read_portfolio()`(当模块名调用)
**修改了什么:**
- 文件:`/home/hmo/MoFin/scripts/intraday_health_check.py`
- 变更:`mo_data.read_portfolio()` → `read_portfolio()`
**效果预期:** 盘中自检不再因这个 NameError 报异常,能正常检查 portfolio.json 数据新鲜度。
## 2026-07-02 10:51 宏观风险HIGH升级应对
**发现了什么:** 自愈执行器上报当日第二次HIGH信号(科创50扩大至-5%、创业板-4%)。同时KOSPI从-7%收窄至-3%(改善方向信号)。
**修改了什么:**
- 文件:`macro_risk_state.json`
- 变更:升级模式更新state,分别标注恶化(科创50/创业板扩大跌幅)和改善(KOSPI收窄、恒指+1.3%)两个方向,避免笼统"附加新数据点"
**萃取知识:**
1. B类板块冲击下,防御仓位(紫金+6.8%、黄金ETF+2%、神华+1.2%)当日有效对冲科技股损失,验证了组合构建合理性
2. 中芯国际A(688981)是当日最危险持仓(距止损2.14%),中芯国际AH走势分化(A-2.96% vs H-8.05%)值得关注——A股有溢价保护,H股更直接暴露于全球半导体卖压
3. 分歧检测bias=opportunity + A/H科技背离>5pp → 极端背离时不能简单看空,A股科技暴跌时港股科技反而上涨,资金在跨市场迁移而非逃离科技板块
## 2026-07-02 盘中 价格数据新鲜度检查格式不兼容
**发现了什么:** 自愈执行器报 `盘中自检: 价格数据新鲜度检查失败: unconverted data remains: :06`
**根因:** `intraday_health_check.py` 的 `datetime.strptime(pf_updated, "%Y-%m-%d %H:%M:%S")` 硬编码要求带秒格式,但 `price_monitor.py` 等写入 `updated_at` 用 `strftime('%Y-%m-%d %H:%M')` 无秒格式。当 `read_portfolio()` 回退到 JSON 冷备时读到无秒时间戳 → 解析失败。
**修改了什么:**
- 文件:`/home/hmo/MoFin/scripts/intraday_health_check.py`
- 变更:引入 `_parse_updated_at()` 函数,先试带秒格式 `%Y-%m-%d %H:%M:%S`,失败则回退无秒格式 `%Y-%m-%d %H:%M`;两次都失败时明确记录"格式无法解析"而非抛异常
**效果预期:** 无论 `updated_at` 是 `'2026-07-02 10:43'`(无秒)还是 `'2026-07-02 10:43:53'`(有秒),都能正确解析并计算新鲜度。
## 2026-07-02 11:47 宏风险HIGH持续——系统无故障,已知市场事件延续
**发现了什么:** 自愈执行器报盘中自检→宏观风险HIGH。核实后发现该风险已在11:27向Dad推送过完整报告,且到损位均未触发。这不是系统故障,是已知市场状态(全球半导体抛售)的延续。
**附带的data issue** portfolio.json的`currency`字段将所有港股(8只)标为CNY而非HKD。影响跨币种计算准确性。
- 根因追踪:`import_holding_xls.py`(line67)正确设HKD,但`strategy_lifecycle.py`(line2027)的`setdefault('currency','CNY')`在策略更新时覆盖了币种标记
- 修复计划:盘后(非交易时段)统一排查并修正currency字段在数据管道中的传播路径
**萃取知识:**
1. 自愈执行器对宏风险的报警是设计行为(health check标记risk=high→写TODO→升级处理),需要按"已知市场状态"处理而非"系统故障"
2. 腾讯(00700)距止损2.76%是所有持仓中最接近止损位的——本轮冲击前未被重点标记,暴露了"只关注风险最大的几个"忽略了中游风险
|