diff --git a/analyst-knowledge-log.md b/analyst-knowledge-log.md index fc7a84d..f1a04f9 100644 --- a/analyst-knowledge-log.md +++ b/analyst-knowledge-log.md @@ -196,5 +196,21 @@ **萃取知识:** 1. 自愈执行器对宏风险的报警是设计行为(health check标记risk=high→写TODO→升级处理),需要按"已知市场状态"处理而非"系统故障" -2. 腾讯(00700)距止损2.76%是所有持仓中最接近止损位的——本轮冲击前未被重点标记,暴露了"只关注风险最大的几个"忽略了中游风险 -| \ No newline at end of file +| 腾讯(00700)距止损2.76%是所有持仓中最接近止损位的——本轮冲击前未被重点标记,暴露了"只关注风险最大的几个"忽略了中游风险 + +## 2026-07-04 周末宏观风险评估(首次独立周末扫描) + +**发现了什么:** 采集器08:00输出2条HIGH信号,但经LLM深度分析确认为误报: +1. 「单一押注有色 百亿基金栽在盛达资源」→ LOW(基金级个股新闻,误报模式4:公司/基金事件误标为宏观风险) +2. 「北约领导人宣布伊朗不得拥核」→ MEDIUM(政治声明,但整体美伊趋势为降级降级谈判/石油恢复/海峡共管推进) + +**执行操作:** signal_news ID=760 修正覆盖(UPDATE) + ID=761 插入正确MEDIUM信号 + +**综合判定:** MEDIUM(新闻维度MEDIUM+组合高暴露MEDIUM→2个MEDIUM) + +**关键发现:** 周末数据采集(Curl东方财富首页+macro_raw_news 50条)确认一周来最大的系统性风险变化是——美伊冲突全面降级(OPEC产量恢复、伊朗洽售石油、多哈会谈推进),而这在signal_news历史HIGH信号中完全未体现。采集器只抓取了北约声明这个单独事件,忽略了整体趋势改善的上下文。**周末扫描的核心价值在于提供采集器无法做到的语境整合判断。** + +**萃取知识:** +1. 周末扫描的第一步(检查未评级新闻)如果为空,必须主动从curl数据中提取Fetched新事件INSERT入库——不能直接输出"无未评级新闻" +2. 背离检测器在非交易日持续运行,divergence_state的level=none+bias=opportunity为本次MEDIUM判定提供了关键支撑——无市场结构风险 +3. 非农数据"弱于预期"是反向逻辑(鸽派利好),采集器关键词无法区分方向性语义,LLM修正时需特别注意误报模式11 \ No newline at end of file diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..a9c3776 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,52 @@ +# MoFin 文档中心 + +> 文档驱动开发。每次代码变更必须同步更新对应文档。 + +--- + +## 阅读指引 + +### 🚀 新手入门(按顺序读) + +| # | 文档 | 内容 | 时间 | +|---|------|------|------| +| 1 | **[SYSTEM_ARCHITECTURE.md](SYSTEM_ARCHITECTURE.md)** | 系统总览:架构图、数据流、模块职责 | 10 min | +| 2 | **[portfolio-data-model.md](portfolio-data-model.md)** | 核心数据模型:表结构、币种规则、常见错误 | 10 min | +| 3 | **[DEVELOPMENT_STANDARDS.md](DEVELOPMENT_STANDARDS.md)** | 开发规范:代码结构、DB 规范、Prompt 规范、开发流程 | 15 min | +| 4 | **[CHANGELOG.md](../CHANGELOG.md)** | 变更日志:所有改动的完整记录 | 5 min | + +### 🔧 日常开发 + +| 文档 | 何时查阅 | +|------|---------| +| [DEVELOPMENT_STANDARDS.md](DEVELOPMENT_STANDARDS.md) | 每次写代码前 | +| [TEST_PLAN.md](TEST_PLAN.md) | 每次改完代码后跑测试 | +| [CHANGELOG.md](../CHANGELOG.md) | 改完后追加变更记录 | + +### 📊 运维参考 + +| 文档 | 内容 | +|------|------| +| [cron-catalog.md](cron-catalog.md) | Cron 任务清单(知微维护) | +| [decisions-db-migration.md](decisions-db-migration.md) | JSON→DB 迁移记录(✅ 已完成) | + +### 📦 历史文档(archive/) + +旧的设计文档、需求文档、分析报告。仅供参考,不代表当前系统状态。 + +--- + +## 文档规范 + +- 每个 .md 文件顶部标注版本和日期 +- 过时内容追加 `> **已废弃** — 见 XXX 替代` +- 不直接删除旧文档,移到 `archive/` 保留 +- 交叉引用使用相对路径 `[xxx](xxx.md)` + +## 当前系统状态 + +- **数据**:纯 SQLite(`/home/hmo/web-dashboard/data/mofin.db`) +- **币种**:港股存 HKD,A 股存 CNY,汇总时转换 +- **JSON**:已全部移除,无残留 +- **测试**:`scripts/run_all_tests.py` — 33/33 通过 +- **最新**:`CHANGELOG.md` 查看完整变更 diff --git a/docs/SELF_GROWTH_SYSTEM.md b/docs/SELF_GROWTH_SYSTEM.md index 5647eca..75e37a3 100644 --- a/docs/SELF_GROWTH_SYSTEM.md +++ b/docs/SELF_GROWTH_SYSTEM.md @@ -1,367 +1,366 @@ -# MoFin 自成长系统设计文档 - -> 最后更新:2026-06-23 -> 维护人:知微 -> 原则:每增加一个系统机制,必须在此同步更新文档并签入 git - ---- - -## 一、四层循环架构(Sense → Respond → Adapt → Improve) - -MoFin 不再是一个简单的价格监控 + 推送工具,而是一个**能够自我感知、自我决策、自我适应、自我成长**的循环系统。 - -``` - ┌──────────────────────────────────────┐ - │ IMPROVE (自成长) │ - │ 知识萃取 | 策略评估 | 分支剪枝 │ - │ 硬编码审计 | 分析师复查 │ - └────────────┬─────────────────────────┘ - │ 每周/每日 - ┌────────────▼─────────────────────────┐ - │ ADAPT (适应) │ - │ 停损上移 | 仓位调整 | 分支触发记录 │ - │ 情景切换 | 策略重评 | 缓存刷新 │ - └────────────┬─────────────────────────┘ - │ 盘中 - ┌────────────▼─────────────────────────┐ - │ RESPOND (决策+推送) │ - │ price_monitor→XMPP | 分支扫描→推荐 │ - │ 开盘简报 | 收盘简报 | 自选买入提醒 │ - └────────────┬─────────────────────────┘ - │ 实时 - ┌────────────▼─────────────────────────┐ - │ SENSE (感受) │ - │ price_monitor | 宏观采集 | 小果扫描 │ - │ 汇率刷新 | 趋势检测 | 多周期缓存 │ - └──────────────────────────────────────┘ -``` - -### 1.1 SENSE — 感受层 - -所有数据采集,不生成判断,只给数据。 - -| 组件 | 调度 | 输出 | 说明 | -|------|------|------|------| -| price_monitor.py | */2 9-16 交易日 | price_events.json, 分支触发 | 腾讯行情API,每2分钟扫全部持仓+自选 | -| macro_context_collector.py | 9:35, 12:00 交易日 | macro_context.json | A股大盘指数+情绪指标 | -| hk_rate.py | 每日首用刷新 | ~/.cache/hk_exchange_rate.json | HKD→CNY汇率,缓存24小时,API失效时用上次有效值 | -| xiaoguo_scanner.py | */5 9-15 交易日 | 热榜+新闻→数据库 | 独立扫描线(5分钟间隔),轮询东方财富/同花顺热度榜 | -| refresh_mtf_cache.py | 9:00 交易日 | MTF缓存 | 多周期均线/支撑阻力计算预热 | -| trend_detector | 每30分钟 | sector_signals | 板块资金异动/涨跌比反转(通过 market_watch 脚本) | -| stale_detector.py | 每日9:00 | strategy_staleness_report.json | 所有策略的价格偏离/过期检查 | - -### 1.2 RESPOND — 决策+推送层 - -所有数据驱动判断,有触发才推送。 - -| 组件 | 调度 | 触发条件 | 推送目标 | -|------|------|---------|---------| -| price_monitor → 分支评估 | 每2分钟 | 价格触及买入区 ±1% | 私信(有触发才推) | -| price_monitor → 情景切换检测 | 每2分钟 | 情景ID变化 | 私信 | -| stale_push_wlin.py | 9:01, 9:31, ... 每30分 | 自选在买入区且RR≥1.5 | 私信(报推荐/重评) | -| branch_scanner.py | 9:15, 9:45 每30分 | 有分支操作推荐 | 私信 | -| 开盘简报 (LLM) | 9:35 | - | 私信 | -| 收盘简报 (LLM) | 16:10 | - | 私信 | - -**推送必经链路:** -1. no_agent 脚本 → stdout → cron 调度器 → `deliver=local` -2. `deliver=local` 命中 `cron_to_xmpp.py` 管道→ XMPP bridge (5805) → 知微Bot → Dad 私信 -3. LLM cron → 知微回复 → XMPP bridge → Dad 私信 - -### 1.3 ADAPT — 适应层 - -盘中触发的自动调整,不需要手动干预。 - -| 组件 | 调度 | 行为 | -|------|------|------| -| per_stock_reassess.py | 9:00, 12:00 | 所有自选重评 + 初始化分支树 | -| stale_push 在线重评 | 每30分钟检测到STALE时 | 串行等重评完再出报告 | -| 移动止损保护 | 持仓价跌破重评止损线时自动触发 | 停损线上移(不下移) | -| 分支触发记录 | 价格触发分支条件时 | trigger_count+1,记录在strategy_tree内 | -| 情景切换 | 价格监控每次扫描 | 比较当前情景与上次,变化则推送+重新排序分支 | -| MTF缓存刷新 | 9:00 | 多周期技术面指标预热 | - -### 1.4 IMPROVE — 自成长层 - -系统自我诊断、自我修正的机制。 - -| 组件 | 调度 | 行为 | -|------|------|------| -| 知识萃取 (LLM) | 16:30 | 当日分析提炼→写入analyst-knowledge-log.md | -| 策略评估-每日 (LLM) | 21:00 | 六维度评估全部策略→推荐调整 | -| 策略评估-每周 (no_agent) | 周六21:00 | 宽度+深度评估 | -| 建议对账-每周 | 周六20:00 | 交易建议 vs 实际执行核对 | -| 分析师持仓复查 | 周四20:00 | 基本面+技术面持仓复查 | -| **硬编码审计** | **17:25** | **扫描所有.py中大额硬编码数字→告警** | -| 系统全局审计 (LLM) | 17:30 | 7维度系统健康检查 | -| **分支剪枝** | **周六6:00** | **trigger_count≥5且成功率<30%→归档** | - ---- - -## 二、多分支策略树 - -### 2.1 为什么需要分支? - -传统买入区+止损策略在单一市场情景下够用。但A股经常出现: -- 弱震荡时低吸 → 急跌需要割肉 → 反弹要追涨 → 轮动需切换 - -不同情景需要不同的策略响应。所以每个股票不再只有一个策略,而是一棵**决策树**。 - -### 2.2 结构 - -```json -{ - "code": "000001", - "strategy_tree": { - "scenario": "weak_consolidation", - "last_scenario_check": "2026-06-23T14:30:00", - "branches": [ - { - "id": "buy_dip", - "scenario": "weak_consolidation", - "condition": "price <= buy_low AND volume < avg_volume * 0.7", - "action": "买入", - "priority": 1, - "trigger_count": 3, - "success_rate": 0.67 - }, - { - "id": "stop_loss", - "scenario": "all", - "condition": "price <= stop_loss", - "action": "止损", - "priority": 0, - "trigger_count": 1, - "success_rate": null - } - ], - "pruned_branches": [] - } -} -``` - -### 2.3 分支生命周期 - -``` -创建:per_stock_reassess 初始化时(init_default_branches) - ↓ -活跃:price_monitor 每2分钟检查(evaluate_branches) - ↓ -触发:价格符合条件 → record_branch_trigger → trigger_count++ - ↓ -剪枝:每周六 prune_low_performance_branches - 条件:trigger_count ≥ 5 且 success_rate < 30% - 动作:移入 pruned_branches(可追溯,不直接删除) -``` - -### 2.4 情景定义(strategy_tree.py) - -| 情景ID | 标签 | 触发条件 | 组合建议 | -|--------|------|---------|---------| -| sharp_decline | 急跌防御 | mood=bearish, sector_crash=True | 减仓至80%以下 | -| weak_consolidation | 弱势震荡 | mood=neutral, breadth=weak | 保持仓位90%以内 | -| sector_rotation | 板块轮动 | mood=neutral, rotation=True | 跟随板块切换 | -| bullish_recovery | 反弹上行 | mood=bullish | 加仓至95% | - ---- - -## 三、自成长机制:硬编码审计 - -### 3.1 为什么? - -2026-06-23 发现代码中存在3处硬编码现金/汇率值。这些值不会自己老化,必须通过自动化扫描。 - -### 3.2 hardcode_scanner.py - -扫描规则: -- 所有 `.py` 文件中的赋值语句(=, return, default) -- 数字 ≥ 4 位且不是明显的日期/时间阈值 → 标记 -- 排除 `LIMIT 200`, `timeout=60`, `CACHE_TTL=86400` 等合法常量 -- 输出 JSON 到 `/home/hmo/web-dashboard/data/hardcode_audit.json` - -调度:每周一至周五 17:25(在系统审计 17:30 之前5分钟) - -### 3.3 响应流程 - -``` -硬编码审计发现问题 - → 知微在下次回复中主动告警 - → 判断是否真硬编码 - → 是:改为从 data/*.json 或 API 实时读取 - → 改完在回复中附上改动摘要 -``` - -### 3.4 发现的已知问题(2026-06-23 修复) - -| 位置 | 问题 | 修复 | -|------|------|------| -| stale_push_wlin.py | load_cash() 返146837硬编码 | 改为读 portfolio.json,读不到返0 | -| stale_push_wlin.py | lot_cost 汇率写死0.93 | 改为 hkd_to_cny() 动态 | -| stale_push_wlin.py | 港股每手默认500股 | 改为 Tencent API f[60] 字段实时 | -| hk_rate.py | FALLBACK = 0.87 硬编码 | 改为存最近一次有效汇率到缓存 | -| price_monitor.py | HK_RATE = 0.87 fallback | 最低层兜底,暂时保留(hk_rate全挂时用) | - ---- - -## 四、Cron 清单 - -> 更新时间:2026-06-23 -> 总 job 数:31(其中活跃:约22个交易日核心jobs) - -### 4.1 盘中核心(交易日 9:00~16:10) - -| 名称 | 调度 | 类型 | 脚本 | 用途 | -|------|------|------|------|------| -| 价格监控-高频 | */2 9-16 | no_agent | price_monitor.py | 每2分钟扫价+分支评估+情景检测 | -| 分支扫描-盘中 | 15,45 9-15 | no_agent | branch_scanner.py | 全持仓分支状态扫描 | -| 自选买入区提醒 | 1,31 9-15 | no_agent | stale_push_wlin.py | 自选买入推荐+自动重评 | -| 小果独立扫描 | */5 9-15 | no_agent | xiaoguo_scanner.py | 热榜+新闻 | -| 自选买入区提醒-盘前+午间 | 0 9,12 | no_agent | per_stock_reassess.py | 全部自选重评 | -| 宏观采集-早盘 | 35 9 | no_agent | macro_context_collector.py | 早盘大盘状态 | -| 宏观采集-午间 | 0 12 | no_agent | macro_context_collector.py | 午间大盘状态 | -| 多周期缓存刷新 | 0 9 | no_agent | refresh_mtf_cache.py | 技术指标预热 | -| 开盘简报 | 35 9 | LLM | - | 生成开盘简报 | -| 收盘简报 | 10 16 | LLM | - | 生成收盘简报 | -| 芯碁微装-价格监控 | 0 10,14 | LLM | - | 单票专用监控(新策略期间临时) | -| 策略时效性检查 | 0 9 | LLM | strategy-staleness-check.py | 策略过期检查 | - -### 4.2 盘后(交易日 16:00~21:00) - -| 名称 | 调度 | 类型 | 脚本/技能 | 用途 | -|------|------|------|----------|------| -| 小果情感分析 | 0 16 | LLM | xiaoguo情感分析 | 持仓+自选新闻情感 | -| 知识萃取-盘后 | 30 16 | LLM | finance/analyst-knowledge | 当日经验→知识库 | -| 硬编码扫描-每日 | 25 17 | no_agent | hardcode_scanner.py | 自成长审计 | -| 系统全局审计 | 30 17 | LLM | system_audit.py | 7维度健康检查 | -| 数据采集-策略评估前 | 30 20 | no_agent | collect_evaluation_data.py | 评估数据准备 | -| 策略评估-每日 | 0 21 | LLM | stale_detector.py | 策略六维评估 | - -### 4.3 每周(周末) - -| 名称 | 调度 | 类型 | 用途 | -|------|------|------|------| -| 分析师-持仓复查 | 周四20:00 | LLM | 基本面+技术面复查 | -| 建议对账-每周 | 周六20:00 | no_agent | 建议vs执行核对 | -| 策略评估-每周 | 周六21:00 | no_agent | 宽度+深度评估 | -| 分支剪枝-每周 | 周六6:00 | no_agent | 低效分支自动淘汰 | - -### 4.4 暂停/不活跃 - -| 名称 | 状态 | 原因 | -|------|------|------| -| MoFin盘前中监控 | 暂停 | 被实时 price_monitor 替代 | -| MoFin午后监控 | 暂停 | 同上 | -| 区间维护 | 暂停 | 2026-06-03已暂停 | -| 市场数据采集 | 暂停 | 被小果扫描替代 | -| 知微洞察生成 | 暂停 | 被实时推送替代 | -| 小果市场筛选 | 暂停 | 被全市场管道替代 | -| 市场精选推荐 | 暂停 | 被实时分支扫描替代 | - ---- - -## 五、关键数据文件 - -| 文件 | 路径 | 用途 | -|------|------|------| -| decisions.json | /home/hmo/web-dashboard/data/decisions.json | 所有股票策略(含分支树) | -| portfolio.json | /home/hmo/web-dashboard/data/portfolio.json | 持仓+现金 | -| price_events.json | /home/hmo/web-dashboard/data/price_events.json | 价格触发事件记录 | -| strategy_staleness_report.json | /home/hmo/web-dashboard/data/strategy_staleness_report.json | 策略过期报告 | -| macro_context.json | /home/hmo/web-dashboard/data/macro_context.json | 大盘宏观状态 | -| hardcode_audit.json | /home/hmo/web-dashboard/data/hardcode_audit.json | 硬编码扫描结果 | -| system_audit_report.json | /home/hmo/MoFin/data/system_audit_report.json | 系统审计报告 | -| ~/.cache/hk_exchange_rate.json | 用户目录 | HKD汇率缓存(含上次有效值) | - ---- - -## 六、关键设计原则 - -1. **有触发才推** — 所有监控脚本默认静默,有操作信号才生成输出。no_agent + SILENT原则 -2. **数据驱动** — 所有数字从文件/API读,禁止硬编码现金、汇率、手数 -3. **先重评再出报告** — 自选提醒必须先等重评完成,再用重评后数据出报告 -4. **no_agent 优于 LLM 用于纯数据管道** — 数据采集/转发用 no_agent 脚本(零token),判断/分析用 LLM -5. **分支可追溯** — 分支剪枝不直接删除,移入 pruned_branches 历史字段 -6. **自成长必须自动化** — 能扫的不要等人发现,能修的不要等人报 - ---- - -## 七、元自成长层(Meta-Growth) - -### 7.1 为什么需要元层? - -前三层的循环(Sense→Respond→Adapt→Improve)有一个根本局限:**Improve层本身不会成长。** - -- hardcode_scanner 只扫当前定义的规则,不会自己发现"还需要扫什么" -- 分支剪枝只基于现有的成功/触发统计,不会自己引入新的评估维度 -- 知识萃取只做分析经验积累,不会从修复模式中学习新的问题类型 - -**元层(meta-growth)的功能:定期审视所有自成长机制本身,基于近期修复模式自动扩展扫描类别。** - -### 7.2 meta_growth.py - -``` -交易日 12:45 和 00:45 运行(自成长机制中的最高层) - ↓ -12:45: 读取上午盘git log → 分析发现的新问题 - → 如果发现新模式 → 注入硬编码扫描规则 - → 下午盘的 hardcode 审计 17:25 就能用上新规则 - -00:45: 读取全天git log → 分析修复模式 - → 更新 growth_registry - → 注入新规则(次日生效) -``` - -### 7.3 为什么每天两次? - -| 调度 | 作用 | -|------|------| -| **12:45**(午间) | 上午盘中发现问题 → 注入新扫描规则 → **下午17:25的硬编码审计就能用上新规则**。例如知微上午修了一个"港股每手股数"问题,12:45 meta_growth 分析git log识别到新模式并注入,17:25自动扫出同类问题。半天内完成闭环。 | -| **00:45**(凌晨) | 全天修复汇总 → 注册表更新 → 下一天的所有审计带新规则运行。 | - -### 7.4 问题类别注册表(growth_registry.json) - -路径:`/home/hmo/web-dashboard/data/growth_registry.json` - -记录所有历史上的问题类别和对应的扫描规则: -- 已发现的类别 -- 已添加的扫描规则 -- 当前周期的新建议 -- 自成长元层最近运行时间 - -### 7.5 扩展点机制 - -`hardcode_scanner.py` 中预置扩展点注释: - -```python -# 扩展点 — meta_growth 在此追加新规则 -``` - -`meta_growth.py` 检测到新模式后,直接在扩展点后插入新规则元组。下次 hardcode_scanner 运行时自动执行新规则。 - -### 7.6 自成长机制的迭代链路 - -``` -第一周: - hardcode_scanner 扫出 cash 硬编码(手动发现的) - → 修复 - → meta_growth 发现 "hardcode_cash"模式 - → 添加 asset硬编码扫描规则 - -第二周: - hardcode_scanner 自动运行新规则 - → 扫出下一个硬编码 - → 修复 - → meta_growth 发现新模式... - -每一轮迭代,扫描规则自动扩展。 -``` - -### 7.7 元层的自我审视 - -meta_growth 每次运行也会检查自成长系统本身的健康度: -- hardcode_scanner 是否存在 -- 注册表是否可写 -- 本周是否正常执行过 -- 上次提出的建议是否已实施 - -如果发现某条自成长机制失效(如 hardcode_scanner 连续3周无输出、cron job 挂掉),meta_growth 会输出告警。 +# MoFin 自成长系统设计文档 + +> 状态:设计文档 | 最后更新:2026-06-23 | 维护人:知微 +> 当前架构见 [SYSTEM_ARCHITECTURE.md](SYSTEM_ARCHITECTURE.md) | 开发规范见 [DEVELOPMENT_STANDARDS.md](DEVELOPMENT_STANDARDS.md) + +--- + +## 一、四层循环架构(Sense → Respond → Adapt → Improve) + +MoFin 不再是一个简单的价格监控 + 推送工具,而是一个**能够自我感知、自我决策、自我适应、自我成长**的循环系统。 + +``` + ┌──────────────────────────────────────┐ + │ IMPROVE (自成长) │ + │ 知识萃取 | 策略评估 | 分支剪枝 │ + │ 硬编码审计 | 分析师复查 │ + └────────────┬─────────────────────────┘ + │ 每周/每日 + ┌────────────▼─────────────────────────┐ + │ ADAPT (适应) │ + │ 停损上移 | 仓位调整 | 分支触发记录 │ + │ 情景切换 | 策略重评 | 缓存刷新 │ + └────────────┬─────────────────────────┘ + │ 盘中 + ┌────────────▼─────────────────────────┐ + │ RESPOND (决策+推送) │ + │ price_monitor→XMPP | 分支扫描→推荐 │ + │ 开盘简报 | 收盘简报 | 自选买入提醒 │ + └────────────┬─────────────────────────┘ + │ 实时 + ┌────────────▼─────────────────────────┐ + │ SENSE (感受) │ + │ price_monitor | 宏观采集 | 小果扫描 │ + │ 汇率刷新 | 趋势检测 | 多周期缓存 │ + └──────────────────────────────────────┘ +``` + +### 1.1 SENSE — 感受层 + +所有数据采集,不生成判断,只给数据。 + +| 组件 | 调度 | 输出 | 说明 | +|------|------|------|------| +| price_monitor.py | */2 9-16 交易日 | price_events.json, 分支触发 | 腾讯行情API,每2分钟扫全部持仓+自选 | +| macro_context_collector.py | 9:35, 12:00 交易日 | macro_context.json | A股大盘指数+情绪指标 | +| hk_rate.py | 每日首用刷新 | ~/.cache/hk_exchange_rate.json | HKD→CNY汇率,缓存24小时,API失效时用上次有效值 | +| xiaoguo_scanner.py | */5 9-15 交易日 | 热榜+新闻→数据库 | 独立扫描线(5分钟间隔),轮询东方财富/同花顺热度榜 | +| refresh_mtf_cache.py | 9:00 交易日 | MTF缓存 | 多周期均线/支撑阻力计算预热 | +| trend_detector | 每30分钟 | sector_signals | 板块资金异动/涨跌比反转(通过 market_watch 脚本) | +| stale_detector.py | 每日9:00 | strategy_staleness_report.json | 所有策略的价格偏离/过期检查 | + +### 1.2 RESPOND — 决策+推送层 + +所有数据驱动判断,有触发才推送。 + +| 组件 | 调度 | 触发条件 | 推送目标 | +|------|------|---------|---------| +| price_monitor → 分支评估 | 每2分钟 | 价格触及买入区 ±1% | 私信(有触发才推) | +| price_monitor → 情景切换检测 | 每2分钟 | 情景ID变化 | 私信 | +| stale_push_wlin.py | 9:01, 9:31, ... 每30分 | 自选在买入区且RR≥1.5 | 私信(报推荐/重评) | +| branch_scanner.py | 9:15, 9:45 每30分 | 有分支操作推荐 | 私信 | +| 开盘简报 (LLM) | 9:35 | - | 私信 | +| 收盘简报 (LLM) | 16:10 | - | 私信 | + +**推送必经链路:** +1. no_agent 脚本 → stdout → cron 调度器 → `deliver=local` +2. `deliver=local` 命中 `cron_to_xmpp.py` 管道→ XMPP bridge (5805) → 知微Bot → Dad 私信 +3. LLM cron → 知微回复 → XMPP bridge → Dad 私信 + +### 1.3 ADAPT — 适应层 + +盘中触发的自动调整,不需要手动干预。 + +| 组件 | 调度 | 行为 | +|------|------|------| +| per_stock_reassess.py | 9:00, 12:00 | 所有自选重评 + 初始化分支树 | +| stale_push 在线重评 | 每30分钟检测到STALE时 | 串行等重评完再出报告 | +| 移动止损保护 | 持仓价跌破重评止损线时自动触发 | 停损线上移(不下移) | +| 分支触发记录 | 价格触发分支条件时 | trigger_count+1,记录在strategy_tree内 | +| 情景切换 | 价格监控每次扫描 | 比较当前情景与上次,变化则推送+重新排序分支 | +| MTF缓存刷新 | 9:00 | 多周期技术面指标预热 | + +### 1.4 IMPROVE — 自成长层 + +系统自我诊断、自我修正的机制。 + +| 组件 | 调度 | 行为 | +|------|------|------| +| 知识萃取 (LLM) | 16:30 | 当日分析提炼→写入analyst-knowledge-log.md | +| 策略评估-每日 (LLM) | 21:00 | 六维度评估全部策略→推荐调整 | +| 策略评估-每周 (no_agent) | 周六21:00 | 宽度+深度评估 | +| 建议对账-每周 | 周六20:00 | 交易建议 vs 实际执行核对 | +| 分析师持仓复查 | 周四20:00 | 基本面+技术面持仓复查 | +| **硬编码审计** | **17:25** | **扫描所有.py中大额硬编码数字→告警** | +| 系统全局审计 (LLM) | 17:30 | 7维度系统健康检查 | +| **分支剪枝** | **周六6:00** | **trigger_count≥5且成功率<30%→归档** | + +--- + +## 二、多分支策略树 + +### 2.1 为什么需要分支? + +传统买入区+止损策略在单一市场情景下够用。但A股经常出现: +- 弱震荡时低吸 → 急跌需要割肉 → 反弹要追涨 → 轮动需切换 + +不同情景需要不同的策略响应。所以每个股票不再只有一个策略,而是一棵**决策树**。 + +### 2.2 结构 + +```json +{ + "code": "000001", + "strategy_tree": { + "scenario": "weak_consolidation", + "last_scenario_check": "2026-06-23T14:30:00", + "branches": [ + { + "id": "buy_dip", + "scenario": "weak_consolidation", + "condition": "price <= buy_low AND volume < avg_volume * 0.7", + "action": "买入", + "priority": 1, + "trigger_count": 3, + "success_rate": 0.67 + }, + { + "id": "stop_loss", + "scenario": "all", + "condition": "price <= stop_loss", + "action": "止损", + "priority": 0, + "trigger_count": 1, + "success_rate": null + } + ], + "pruned_branches": [] + } +} +``` + +### 2.3 分支生命周期 + +``` +创建:per_stock_reassess 初始化时(init_default_branches) + ↓ +活跃:price_monitor 每2分钟检查(evaluate_branches) + ↓ +触发:价格符合条件 → record_branch_trigger → trigger_count++ + ↓ +剪枝:每周六 prune_low_performance_branches + 条件:trigger_count ≥ 5 且 success_rate < 30% + 动作:移入 pruned_branches(可追溯,不直接删除) +``` + +### 2.4 情景定义(strategy_tree.py) + +| 情景ID | 标签 | 触发条件 | 组合建议 | +|--------|------|---------|---------| +| sharp_decline | 急跌防御 | mood=bearish, sector_crash=True | 减仓至80%以下 | +| weak_consolidation | 弱势震荡 | mood=neutral, breadth=weak | 保持仓位90%以内 | +| sector_rotation | 板块轮动 | mood=neutral, rotation=True | 跟随板块切换 | +| bullish_recovery | 反弹上行 | mood=bullish | 加仓至95% | + +--- + +## 三、自成长机制:硬编码审计 + +### 3.1 为什么? + +2026-06-23 发现代码中存在3处硬编码现金/汇率值。这些值不会自己老化,必须通过自动化扫描。 + +### 3.2 hardcode_scanner.py + +扫描规则: +- 所有 `.py` 文件中的赋值语句(=, return, default) +- 数字 ≥ 4 位且不是明显的日期/时间阈值 → 标记 +- 排除 `LIMIT 200`, `timeout=60`, `CACHE_TTL=86400` 等合法常量 +- 输出 JSON 到 `/home/hmo/web-dashboard/data/hardcode_audit.json` + +调度:每周一至周五 17:25(在系统审计 17:30 之前5分钟) + +### 3.3 响应流程 + +``` +硬编码审计发现问题 + → 知微在下次回复中主动告警 + → 判断是否真硬编码 + → 是:改为从 data/*.json 或 API 实时读取 + → 改完在回复中附上改动摘要 +``` + +### 3.4 发现的已知问题(2026-06-23 修复) + +| 位置 | 问题 | 修复 | +|------|------|------| +| stale_push_wlin.py | load_cash() 返146837硬编码 | 改为读 portfolio.json,读不到返0 | +| stale_push_wlin.py | lot_cost 汇率写死0.93 | 改为 hkd_to_cny() 动态 | +| stale_push_wlin.py | 港股每手默认500股 | 改为 Tencent API f[60] 字段实时 | +| hk_rate.py | FALLBACK = 0.87 硬编码 | 改为存最近一次有效汇率到缓存 | +| price_monitor.py | HK_RATE = 0.87 fallback | 最低层兜底,暂时保留(hk_rate全挂时用) | + +--- + +## 四、Cron 清单 + +> 更新时间:2026-06-23 +> 总 job 数:31(其中活跃:约22个交易日核心jobs) + +### 4.1 盘中核心(交易日 9:00~16:10) + +| 名称 | 调度 | 类型 | 脚本 | 用途 | +|------|------|------|------|------| +| 价格监控-高频 | */2 9-16 | no_agent | price_monitor.py | 每2分钟扫价+分支评估+情景检测 | +| 分支扫描-盘中 | 15,45 9-15 | no_agent | branch_scanner.py | 全持仓分支状态扫描 | +| 自选买入区提醒 | 1,31 9-15 | no_agent | stale_push_wlin.py | 自选买入推荐+自动重评 | +| 小果独立扫描 | */5 9-15 | no_agent | xiaoguo_scanner.py | 热榜+新闻 | +| 自选买入区提醒-盘前+午间 | 0 9,12 | no_agent | per_stock_reassess.py | 全部自选重评 | +| 宏观采集-早盘 | 35 9 | no_agent | macro_context_collector.py | 早盘大盘状态 | +| 宏观采集-午间 | 0 12 | no_agent | macro_context_collector.py | 午间大盘状态 | +| 多周期缓存刷新 | 0 9 | no_agent | refresh_mtf_cache.py | 技术指标预热 | +| 开盘简报 | 35 9 | LLM | - | 生成开盘简报 | +| 收盘简报 | 10 16 | LLM | - | 生成收盘简报 | +| 芯碁微装-价格监控 | 0 10,14 | LLM | - | 单票专用监控(新策略期间临时) | +| 策略时效性检查 | 0 9 | LLM | strategy-staleness-check.py | 策略过期检查 | + +### 4.2 盘后(交易日 16:00~21:00) + +| 名称 | 调度 | 类型 | 脚本/技能 | 用途 | +|------|------|------|----------|------| +| 小果情感分析 | 0 16 | LLM | xiaoguo情感分析 | 持仓+自选新闻情感 | +| 知识萃取-盘后 | 30 16 | LLM | finance/analyst-knowledge | 当日经验→知识库 | +| 硬编码扫描-每日 | 25 17 | no_agent | hardcode_scanner.py | 自成长审计 | +| 系统全局审计 | 30 17 | LLM | system_audit.py | 7维度健康检查 | +| 数据采集-策略评估前 | 30 20 | no_agent | collect_evaluation_data.py | 评估数据准备 | +| 策略评估-每日 | 0 21 | LLM | stale_detector.py | 策略六维评估 | + +### 4.3 每周(周末) + +| 名称 | 调度 | 类型 | 用途 | +|------|------|------|------| +| 分析师-持仓复查 | 周四20:00 | LLM | 基本面+技术面复查 | +| 建议对账-每周 | 周六20:00 | no_agent | 建议vs执行核对 | +| 策略评估-每周 | 周六21:00 | no_agent | 宽度+深度评估 | +| 分支剪枝-每周 | 周六6:00 | no_agent | 低效分支自动淘汰 | + +### 4.4 暂停/不活跃 + +| 名称 | 状态 | 原因 | +|------|------|------| +| MoFin盘前中监控 | 暂停 | 被实时 price_monitor 替代 | +| MoFin午后监控 | 暂停 | 同上 | +| 区间维护 | 暂停 | 2026-06-03已暂停 | +| 市场数据采集 | 暂停 | 被小果扫描替代 | +| 知微洞察生成 | 暂停 | 被实时推送替代 | +| 小果市场筛选 | 暂停 | 被全市场管道替代 | +| 市场精选推荐 | 暂停 | 被实时分支扫描替代 | + +--- + +## 五、关键数据文件 + +| 文件 | 路径 | 用途 | +|------|------|------| +| decisions.json | /home/hmo/web-dashboard/data/decisions.json | 所有股票策略(含分支树) | +| portfolio.json | /home/hmo/web-dashboard/data/portfolio.json | 持仓+现金 | +| price_events.json | /home/hmo/web-dashboard/data/price_events.json | 价格触发事件记录 | +| strategy_staleness_report.json | /home/hmo/web-dashboard/data/strategy_staleness_report.json | 策略过期报告 | +| macro_context.json | /home/hmo/web-dashboard/data/macro_context.json | 大盘宏观状态 | +| hardcode_audit.json | /home/hmo/web-dashboard/data/hardcode_audit.json | 硬编码扫描结果 | +| system_audit_report.json | /home/hmo/MoFin/data/system_audit_report.json | 系统审计报告 | +| ~/.cache/hk_exchange_rate.json | 用户目录 | HKD汇率缓存(含上次有效值) | + +--- + +## 六、关键设计原则 + +1. **有触发才推** — 所有监控脚本默认静默,有操作信号才生成输出。no_agent + SILENT原则 +2. **数据驱动** — 所有数字从文件/API读,禁止硬编码现金、汇率、手数 +3. **先重评再出报告** — 自选提醒必须先等重评完成,再用重评后数据出报告 +4. **no_agent 优于 LLM 用于纯数据管道** — 数据采集/转发用 no_agent 脚本(零token),判断/分析用 LLM +5. **分支可追溯** — 分支剪枝不直接删除,移入 pruned_branches 历史字段 +6. **自成长必须自动化** — 能扫的不要等人发现,能修的不要等人报 + +--- + +## 七、元自成长层(Meta-Growth) + +### 7.1 为什么需要元层? + +前三层的循环(Sense→Respond→Adapt→Improve)有一个根本局限:**Improve层本身不会成长。** + +- hardcode_scanner 只扫当前定义的规则,不会自己发现"还需要扫什么" +- 分支剪枝只基于现有的成功/触发统计,不会自己引入新的评估维度 +- 知识萃取只做分析经验积累,不会从修复模式中学习新的问题类型 + +**元层(meta-growth)的功能:定期审视所有自成长机制本身,基于近期修复模式自动扩展扫描类别。** + +### 7.2 meta_growth.py + +``` +交易日 12:45 和 00:45 运行(自成长机制中的最高层) + ↓ +12:45: 读取上午盘git log → 分析发现的新问题 + → 如果发现新模式 → 注入硬编码扫描规则 + → 下午盘的 hardcode 审计 17:25 就能用上新规则 + +00:45: 读取全天git log → 分析修复模式 + → 更新 growth_registry + → 注入新规则(次日生效) +``` + +### 7.3 为什么每天两次? + +| 调度 | 作用 | +|------|------| +| **12:45**(午间) | 上午盘中发现问题 → 注入新扫描规则 → **下午17:25的硬编码审计就能用上新规则**。例如知微上午修了一个"港股每手股数"问题,12:45 meta_growth 分析git log识别到新模式并注入,17:25自动扫出同类问题。半天内完成闭环。 | +| **00:45**(凌晨) | 全天修复汇总 → 注册表更新 → 下一天的所有审计带新规则运行。 | + +### 7.4 问题类别注册表(growth_registry.json) + +路径:`/home/hmo/web-dashboard/data/growth_registry.json` + +记录所有历史上的问题类别和对应的扫描规则: +- 已发现的类别 +- 已添加的扫描规则 +- 当前周期的新建议 +- 自成长元层最近运行时间 + +### 7.5 扩展点机制 + +`hardcode_scanner.py` 中预置扩展点注释: + +```python +# 扩展点 — meta_growth 在此追加新规则 +``` + +`meta_growth.py` 检测到新模式后,直接在扩展点后插入新规则元组。下次 hardcode_scanner 运行时自动执行新规则。 + +### 7.6 自成长机制的迭代链路 + +``` +第一周: + hardcode_scanner 扫出 cash 硬编码(手动发现的) + → 修复 + → meta_growth 发现 "hardcode_cash"模式 + → 添加 asset硬编码扫描规则 + +第二周: + hardcode_scanner 自动运行新规则 + → 扫出下一个硬编码 + → 修复 + → meta_growth 发现新模式... + +每一轮迭代,扫描规则自动扩展。 +``` + +### 7.7 元层的自我审视 + +meta_growth 每次运行也会检查自成长系统本身的健康度: +- hardcode_scanner 是否存在 +- 注册表是否可写 +- 本周是否正常执行过 +- 上次提出的建议是否已实施 + +如果发现某条自成长机制失效(如 hardcode_scanner 连续3周无输出、cron job 挂掉),meta_growth 会输出告警。 diff --git a/docs/SYSTEM_ARCHITECTURE.md b/docs/SYSTEM_ARCHITECTURE.md index 73a1779..3753206 100644 --- a/docs/SYSTEM_ARCHITECTURE.md +++ b/docs/SYSTEM_ARCHITECTURE.md @@ -1,223 +1,223 @@ -# 莫荷系统架构文档 — 完整总览 - -> 最后更新:2026-06-11 -> 维护人:莫荷(Hermes Agent) -> 铁律:任何系统改动必须先读本文档,改完必须同步更新 - ---- - -## 一、系统总览 - -``` -┌──────────────────────────────────────────────────────────────┐ -│ Linux 192.168.1.246 │ -│ │ -│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ -│ │ 默认gateway │ │ 知微gateway │ │ 小果gateway │ │ -│ │ :8642 │ │ :8643 │ │ :8645 │ │ -│ │ 微信+XMPP │ │ position- │ │ xiaoguo │ │ -│ │ mohe网关 │ │ analyst │ │ profile │ │ -│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ -│ │ │ │ │ -│ ▼ ▼ ▼ │ -│ ┌─────────────────────────────────────────────────┐ │ -│ │ state.db (SQLite) │ │ -│ │ sessions / messages / FTS5 / compression_locks │ │ -│ │ 消息存储:全量保存,永不删除 │ │ -│ │ 上下文加载:最多200条,永不压缩 │ │ -│ └─────────────────────────────────────────────────┘ │ -│ │ -│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ -│ │ xmpp_bot │ │ xmpp_ │ │ xmpp_ │ │ -│ │ mohe │ │ zhiwei_bot │ │ xiaoguo_bot │ │ -│ │ mohe@yoin │ │ zhiwei@yoin │ │ xiaoguo@ │ │ -│ │ .fun │ │ .fun │ │ yoin.fun │ │ -│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ -│ │ │ │ │ -│ └──────┬─────────┴────────┬───────┘ │ -│ ▼ ▼ │ -│ ┌──────────────┐ ┌──────────────┐ │ -│ │ ejabberd │ │ 内核组 │ │ -│ │ Docker │ │ coregroup@ │ │ -│ │ port 5222 │ │ conference │ │ -│ └──────────────┘ │ .yoin.fun │ │ -│ └──────────────┘ │ -│ │ -│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ -│ │ 价格监控 │ │ cron调度器 │ │ Obsidian │ │ -│ │ 1分钟·纯脚本 │ │ 14个jobs │ │ 知识库 │ │ -│ └─────────────┘ └─────────────┘ │ :8890 │ │ -│ └─────────────┘ │ -└──────────────────────────────────────────────────────────────┘ - │ │ - ▼ ▼ -┌─────────────────┐ ┌─────────────────┐ -│ Windows 192.168 │ │ Mac 192.168.1 │ -│ .1.16 │ │ .122 │ -│ 小小莫(wechat) │ │ 小果(oMLX) │ -│ OpenCode :4096 │ │ Qwen3.6-27B │ -│ 微信通道 :5801 │ │ :18003 │ -└─────────────────┘ └─────────────────┘ -``` - -## 二、Gateway 一览 - -| 端口 | 名称 | Profile | PID(当前) | 用途 | -|------|------|---------|-----------|------| -| 8642 | 默认gateway | 默认 | 1925504 | 微信小荷 + XMPP mohe | -| 8643 | 知微gateway | position-analyst | 1913506 | 知微分析 | -| 8645 | 小果gateway | xiaoguo | 1925602 | 小果Mac端 | -| 8646 | mohe gateway | mohe | 1620276 | mohe独立网关 | - -每个gateway共用 `/home/hmo/hermes-agent/hermes_state.py` 里的 `get_messages_as_conversation()` — **LIMIT 200硬截断**。 - -## 三、XMPP Bot 架构 - -### 3.1 Bot 列表 - -| Bot | JID | 服务名 | 脚本路径 | 接入gateway | -|-----|-----|--------|---------|------------| -| 莫荷 | mohe@yoin.fun | xmpp-bot | /home/hmo/xmpp_bot.py | :8642 | -| 知微 | zhiwei@yoin.fun | xmpp-zhiwei | /home/hmo/xmpp_zhiwei_bot.py | :8643 | -| 小果 | xiaoguo@yoin.fun | xmpp-xiaoguo | /home/hmo/xmpp_xiaoguo_bot.py | :8645 | - -### 3.2 连接管理(2026-06-11 修复) - -**禁用** `auto_reconnect = True`(与手动重连环冲突,导致"Replaced by new connection"循环) -**禁用** `xep_0199` ping 保活(ejabberd不支持,导致ping超时→误判断线) - -**重连机制**: -- 主循环每15秒检查 `is_connected()` -- 断线后指数退避重连:1s → 2s → 4s → ... → 60s max -- 重连后自动重新加入 MUC(内核组 coregroup@conference.yoin.fun) - -**历史问题**: -- 2026-06-08: bot断线后无法自动重连,session膨胀到3700条/26M tokens -- 2026-06-10: auto_reconnect导致10个重复连接 -- 2026-06-11: 修复auto_reconnect冲突 + API key拼写错误 - -### 3.3 群聊规则 - -Bot只回复内核组中来自 `hmo` 或 `xxm` 的消息。私聊只回复 `hmo@yoin.fun`。 - -## 四、Session 管理 —— 核心设计(2026-06-10 最终方案) - -### 4.1 方案:硬截断200条 + 永不压缩 - -```python -# hermes_state.py → get_messages_as_conversation() -SELECT id, role, content, ... -FROM ( - SELECT id, role, content, ... - FROM messages WHERE session_id = ? - AND active = 1 - ORDER BY id DESC LIMIT 200 ← 只取最近200条 -) ORDER BY id ASC ← 按正序排回 -``` - -### 4.2 Compression 配置(所有profile统一) - -```yaml -compression: - enabled: false ← 永久关闭 - threshold: 0.99 - protect_last_n: 200 - hygiene_hard_message_limit: 100000 -``` - -### 4.3 效果 - -| 指标 | 之前 | 之后 | -|------|------|------| -| 每次请求token | 26M(全量加载) | ~22K(200条) | -| 上下文窗口用量 | 2500% | 2.2% | -| 响应时间 | 10分钟+超时 | 10-20秒 | -| 内容丢失 | 压缩丢细节 | 永不丢失 | -| 旧消息可查 | 压缩后摘要 | 全量DB可搜 | - -### 4.4 Session 列表(当前) - -| Session ID | 消息数 | 用途 | -|-----------|--------|------| -| sisyphus | 9504 | 微信(旧session,已重建) | -| xmpp-mohe | 3705 | XMPP mohe(旧session) | -| xmpp-mohe-v2 | ~200 | XMPP mohe(新session,LIMIT 200) | -| xmpp-zhiwei | 2241 | 知微 | -| 20260610_090241_2235fb | ~900 | 当前CLI会话 | - -## 五、Provider 链(2026-06-10 最终版) - -| Agent | 默认 | Fallback 1 | Fallback 2 | Fallback 3 | -|-------|------|-----------|-----------|-----------| -| **我(CLI)** | ocg-new | ocg-old | volcengine | - | -| **mohe gateway** | ocg-new | ocg-old | volcengine | - | -| **知微** | ocg-old | ocg-new | volcengine(cred池) | - | -| **小果** | volcengine | ocg-old | ocg-new | oMLX(本地Mac) | - -**当前实际状态(2026-06-11):** -- ocg-new: ✅ 可用(当前会话走这个) -- ocg-old: ⚠️ 返回403但gateway cred pool缓存了有效key -- volcengine: ❌ 周配额已尽,6月15日周一恢复 - -## 六、SOUL.md 关键规则(2026-06-10 最终版) - -位置:`/home/hmo/.hermes/profiles/default/SOUL.md` - -### 沟通方式 -- 对老爸:直接、不加修饰 -- 反驳时:**必须带证据**(日志、数据、代码、截图)。不是为了显得聪明而反驳 -- 听指令:用户明确说"闭嘴""停"时立即停止,不继续分析不解释 - -### 行动铁律 — 讲证据 -1. 发现问题 → 2. 收集证据(至少两条独立证据) → 3. 验证假设 → 4. 只改对的 → 5. 改完验证 -- 禁止猜根因、没有证据就动手、猜用户意图、多个改动同时做 - -### 授权边界 -- ✅ 直接行动:读文件、查日志、搜知识库、分析数据、提建议 -- ⚠️ 问清楚再做:改系统配置、重启服务、清数据、写文件 -- ❌ 必须等批准:不可逆删除、修改API key、改provider链、清session - -## 七、知识库(Obsidian) - -路径:`/home/hmo/Obsidian/` -HTTP API:`:8890`(只读) - -结构: -``` -Obsidian/ -├── raw/ — 原始资料(只追加只读) -├── knowledge/ — 加工笔记(tech/finance/ai/psychology/education/life) -├── index.md — 全库索引 -├── SCHEMA.md — 操作规则 -└── log.md — 更新日志 -``` - -## 八、MoFin 股票系统 - -详见 `EXPERT_SYSTEM_DESIGN.md` 和 **`SELF_GROWTH_SYSTEM.md`**(自成长架构,2026-06-23新增),核心: -- 31个cron jobs(约22个交易日活跃) -- 四层循环架构:Sense → Respond → Adapt → Improve -- 价格监控每2分钟腾讯批量API + 分支评估 -- XMPP中继推送报告 -- 硬编码审计 + 分支剪枝 + 知识萃取等自成长机制 - -## 九、近期改动日志 - -### 2026-06-11 -- LIMIT 200硬截断 + 关闭所有compression -- SOUL.md 最终版定稿 -- XMPP bot重连逻辑修复(删除auto_reconnect + ping保活) -- API key typo修复(知微bot `hermess123` → `hermes123`) -- 小果provider链:volc → ocg-old → ocg-new → oMLX -- 默认provider链:ocg-new → ocg-old → volcengine - -### 2026-06-10 -- 重建SOUL.md(讲证据+授权边界+责任闭环) -- 发现并清除orphaned compression flag -- 多个gateway反复重启,systemd服务冲突 -- Windows wechat_agent API key不匹配 - -### 2026-06-09 -- 知微SOUL新增对话识别规则 -- position-analyst 启用压缩 -- 价格监控全面改造(纯脚本+腾讯批量API) +# 莫荷系统架构文档 — 完整总览 + +> 最后更新:2026-06-11 +> 维护人:莫荷(Hermes Agent) +> 铁律:任何系统改动必须先读本文档,改完必须同步更新 + +--- + +## 一、系统总览 + +``` +┌──────────────────────────────────────────────────────────────┐ +│ Linux 192.168.1.246 │ +│ │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │ 默认gateway │ │ 知微gateway │ │ 小果gateway │ │ +│ │ :8642 │ │ :8643 │ │ :8645 │ │ +│ │ 微信+XMPP │ │ position- │ │ xiaoguo │ │ +│ │ mohe网关 │ │ analyst │ │ profile │ │ +│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ +│ │ │ │ │ +│ ▼ ▼ ▼ │ +│ ┌─────────────────────────────────────────────────┐ │ +│ │ state.db (SQLite) │ │ +│ │ sessions / messages / FTS5 / compression_locks │ │ +│ │ 消息存储:全量保存,永不删除 │ │ +│ │ 上下文加载:最多200条,永不压缩 │ │ +│ └─────────────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │ xmpp_bot │ │ xmpp_ │ │ xmpp_ │ │ +│ │ mohe │ │ zhiwei_bot │ │ xiaoguo_bot │ │ +│ │ mohe@yoin │ │ zhiwei@yoin │ │ xiaoguo@ │ │ +│ │ .fun │ │ .fun │ │ yoin.fun │ │ +│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ +│ │ │ │ │ +│ └──────┬─────────┴────────┬───────┘ │ +│ ▼ ▼ │ +│ ┌──────────────┐ ┌──────────────┐ │ +│ │ ejabberd │ │ 内核组 │ │ +│ │ Docker │ │ coregroup@ │ │ +│ │ port 5222 │ │ conference │ │ +│ └──────────────┘ │ .yoin.fun │ │ +│ └──────────────┘ │ +│ │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │ 价格监控 │ │ cron调度器 │ │ Obsidian │ │ +│ │ 1分钟·纯脚本 │ │ 14个jobs │ │ 知识库 │ │ +│ └─────────────┘ └─────────────┘ │ :8890 │ │ +│ └─────────────┘ │ +└──────────────────────────────────────────────────────────────┘ + │ │ + ▼ ▼ +┌─────────────────┐ ┌─────────────────┐ +│ Windows 192.168 │ │ Mac 192.168.1 │ +│ .1.16 │ │ .122 │ +│ 小小莫(wechat) │ │ 小果(oMLX) │ +│ OpenCode :4096 │ │ Qwen3.6-27B │ +│ 微信通道 :5801 │ │ :18003 │ +└─────────────────┘ └─────────────────┘ +``` + +## 二、Gateway 一览 + +| 端口 | 名称 | Profile | PID(当前) | 用途 | +|------|------|---------|-----------|------| +| 8642 | 默认gateway | 默认 | 1925504 | 微信小荷 + XMPP mohe | +| 8643 | 知微gateway | position-analyst | 1913506 | 知微分析 | +| 8645 | 小果gateway | xiaoguo | 1925602 | 小果Mac端 | +| 8646 | mohe gateway | mohe | 1620276 | mohe独立网关 | + +每个gateway共用 `/home/hmo/hermes-agent/hermes_state.py` 里的 `get_messages_as_conversation()` — **LIMIT 200硬截断**。 + +## 三、XMPP Bot 架构 + +### 3.1 Bot 列表 + +| Bot | JID | 服务名 | 脚本路径 | 接入gateway | +|-----|-----|--------|---------|------------| +| 莫荷 | mohe@yoin.fun | xmpp-bot | /home/hmo/xmpp_bot.py | :8642 | +| 知微 | zhiwei@yoin.fun | xmpp-zhiwei | /home/hmo/xmpp_zhiwei_bot.py | :8643 | +| 小果 | xiaoguo@yoin.fun | xmpp-xiaoguo | /home/hmo/xmpp_xiaoguo_bot.py | :8645 | + +### 3.2 连接管理(2026-06-11 修复) + +**禁用** `auto_reconnect = True`(与手动重连环冲突,导致"Replaced by new connection"循环) +**禁用** `xep_0199` ping 保活(ejabberd不支持,导致ping超时→误判断线) + +**重连机制**: +- 主循环每15秒检查 `is_connected()` +- 断线后指数退避重连:1s → 2s → 4s → ... → 60s max +- 重连后自动重新加入 MUC(内核组 coregroup@conference.yoin.fun) + +**历史问题**: +- 2026-06-08: bot断线后无法自动重连,session膨胀到3700条/26M tokens +- 2026-06-10: auto_reconnect导致10个重复连接 +- 2026-06-11: 修复auto_reconnect冲突 + API key拼写错误 + +### 3.3 群聊规则 + +Bot只回复内核组中来自 `hmo` 或 `xxm` 的消息。私聊只回复 `hmo@yoin.fun`。 + +## 四、Session 管理 —— 核心设计(2026-06-10 最终方案) + +### 4.1 方案:硬截断200条 + 永不压缩 + +```python +# hermes_state.py → get_messages_as_conversation() +SELECT id, role, content, ... +FROM ( + SELECT id, role, content, ... + FROM messages WHERE session_id = ? + AND active = 1 + ORDER BY id DESC LIMIT 200 ← 只取最近200条 +) ORDER BY id ASC ← 按正序排回 +``` + +### 4.2 Compression 配置(所有profile统一) + +```yaml +compression: + enabled: false ← 永久关闭 + threshold: 0.99 + protect_last_n: 200 + hygiene_hard_message_limit: 100000 +``` + +### 4.3 效果 + +| 指标 | 之前 | 之后 | +|------|------|------| +| 每次请求token | 26M(全量加载) | ~22K(200条) | +| 上下文窗口用量 | 2500% | 2.2% | +| 响应时间 | 10分钟+超时 | 10-20秒 | +| 内容丢失 | 压缩丢细节 | 永不丢失 | +| 旧消息可查 | 压缩后摘要 | 全量DB可搜 | + +### 4.4 Session 列表(当前) + +| Session ID | 消息数 | 用途 | +|-----------|--------|------| +| sisyphus | 9504 | 微信(旧session,已重建) | +| xmpp-mohe | 3705 | XMPP mohe(旧session) | +| xmpp-mohe-v2 | ~200 | XMPP mohe(新session,LIMIT 200) | +| xmpp-zhiwei | 2241 | 知微 | +| 20260610_090241_2235fb | ~900 | 当前CLI会话 | + +## 五、Provider 链(2026-06-10 最终版) + +| Agent | 默认 | Fallback 1 | Fallback 2 | Fallback 3 | +|-------|------|-----------|-----------|-----------| +| **我(CLI)** | ocg-new | ocg-old | volcengine | - | +| **mohe gateway** | ocg-new | ocg-old | volcengine | - | +| **知微** | ocg-old | ocg-new | volcengine(cred池) | - | +| **小果** | volcengine | ocg-old | ocg-new | oMLX(本地Mac) | + +**当前实际状态(2026-06-11):** +- ocg-new: ✅ 可用(当前会话走这个) +- ocg-old: ⚠️ 返回403但gateway cred pool缓存了有效key +- volcengine: ❌ 周配额已尽,6月15日周一恢复 + +## 六、SOUL.md 关键规则(2026-06-10 最终版) + +位置:`/home/hmo/.hermes/profiles/default/SOUL.md` + +### 沟通方式 +- 对老爸:直接、不加修饰 +- 反驳时:**必须带证据**(日志、数据、代码、截图)。不是为了显得聪明而反驳 +- 听指令:用户明确说"闭嘴""停"时立即停止,不继续分析不解释 + +### 行动铁律 — 讲证据 +1. 发现问题 → 2. 收集证据(至少两条独立证据) → 3. 验证假设 → 4. 只改对的 → 5. 改完验证 +- 禁止猜根因、没有证据就动手、猜用户意图、多个改动同时做 + +### 授权边界 +- ✅ 直接行动:读文件、查日志、搜知识库、分析数据、提建议 +- ⚠️ 问清楚再做:改系统配置、重启服务、清数据、写文件 +- ❌ 必须等批准:不可逆删除、修改API key、改provider链、清session + +## 七、知识库(Obsidian) + +路径:`/home/hmo/Obsidian/` +HTTP API:`:8890`(只读) + +结构: +``` +Obsidian/ +├── raw/ — 原始资料(只追加只读) +├── knowledge/ — 加工笔记(tech/finance/ai/psychology/education/life) +├── index.md — 全库索引 +├── SCHEMA.md — 操作规则 +└── log.md — 更新日志 +``` + +## 八、MoFin 股票系统 + +详见 `EXPERT_SYSTEM_DESIGN.md` 和 **`SELF_GROWTH_SYSTEM.md`**(自成长架构,2026-06-23新增),核心: +- 31个cron jobs(约22个交易日活跃) +- 四层循环架构:Sense → Respond → Adapt → Improve +- 价格监控每2分钟腾讯批量API + 分支评估 +- XMPP中继推送报告 +- 硬编码审计 + 分支剪枝 + 知识萃取等自成长机制 + +## 九、近期改动日志 + +### 2026-06-11 +- LIMIT 200硬截断 + 关闭所有compression +- SOUL.md 最终版定稿 +- XMPP bot重连逻辑修复(删除auto_reconnect + ping保活) +- API key typo修复(知微bot `hermess123` → `hermes123`) +- 小果provider链:volc → ocg-old → ocg-new → oMLX +- 默认provider链:ocg-new → ocg-old → volcengine + +### 2026-06-10 +- 重建SOUL.md(讲证据+授权边界+责任闭环) +- 发现并清除orphaned compression flag +- 多个gateway反复重启,systemd服务冲突 +- Windows wechat_agent API key不匹配 + +### 2026-06-09 +- 知微SOUL新增对话识别规则 +- position-analyst 启用压缩 +- 价格监控全面改造(纯脚本+腾讯批量API) diff --git a/docs/TDX_RELAY_COLLAB.md b/docs/TDX_RELAY_COLLAB.md index 58cae0c..81cd2b9 100644 --- a/docs/TDX_RELAY_COLLAB.md +++ b/docs/TDX_RELAY_COLLAB.md @@ -1,297 +1,297 @@ -# MoFin / TDX-Relay 协作文档 - -> 最后更新:2026-06-12 -> 维护人:知微 + 小小莫(xxm) -> 铁律:任何 relay 相关改动必须先读本文档,改完必须同步更新 - ---- - -## 一、什么是 tdx-relay - -tdx-relay 是小小莫(xxm)开发的 Windows 端通达信中继程序。 -作用:通过 opentdx 协议直连招商证券 7727 扩展行情服务器, -为 MoFin 系统提供港股低延迟实时行情。 - -### 为什么需要它 - -原本 MoFin 的港股行情来源是腾讯 API(qt.gtimg.cn), -存在约 15 分钟延迟,对于盘中决策不够及时。 -tdx-relay 将港股行情延迟从约 15 分钟降到接近实时(1~3 秒)。 - ---- - -## 二、系统架构 - -``` -Windows 端(小小莫负责) -┌─────────────────────────────────────────┐ -│ tdx-relay 项目 │ -│ │ -│ tdx_client.py │ -│ └─ opentdx MacExtendedClient │ -│ └─ 直连 招商证券 7727 扩展行情服务器 │ -│ → 拉取 17 只港股实时行情 │ -│ │ -│ run_relay.py │ -│ └─ 断线自动重连(5s/15s/30s 三次退避) │ -│ └─ 推送 → POST /api/update/realtime │ -│ │ -│ start_tdx_relay.bat │ -│ └─ 一键启动脚本 │ -└───────────────┬─────────────────────────┘ - │ HTTP POST (JSON) - ▼ -Linux 端(知微负责) -┌─────────────────────────────────────────┐ -│ MoFin 系统 (web-dashboard) │ -│ │ -│ server.py │ -│ ├─ /api/update/realtime (POST) │ -│ │ ← 接收 tdx-relay 推送的实时行情 │ -│ │ → 更新 portfolio.json + watchlist │ -│ │ → 写入 data_source = "tdx_relay" │ -│ │ │ -│ ├─ /api/relay/status (GET) │ -│ │ ← 查询 relay 状态(在线/离线/时间) │ -│ │ │ -│ price_monitor.py │ -│ └─ relay_active 检测 │ -│ ├─ relay 在线 → 跳过港股腾讯API拉取 │ -│ │ (保留 tdx-relay 的实时价不覆盖) │ -│ └─ relay 掉线 → 回退腾讯 API 兜底 │ -│ │ -│ 数据文件 │ -│ ├─ data/portfolio.json │ -│ │ └─ 每只港股: data_source=txton/tdx │ -│ ├─ data/watchlist.json │ -│ └─ data/relay_state.json (新增) │ -│ └─ online: true/false │ -│ └─ last_ping: 时间戳 │ -└─────────────────────────────────────────┘ -``` - -## 三、职责边界 - -### 小小莫(xxm)— Windows 端 - -负责: -1. tdx_client.py 的开发维护 - - 直连券商行情服务器的稳定性 - - 港股代码列表的维护(当前 17 只) - - 行情数据的正确性验证 -2. run_relay.py 的重连机制 - - 断线自动恢复(3 次退避重连) - - relan 状态上报 -3. 行情推送的稳定性 - - 每 X 秒推送一次实时行情 - - 推送失败的处理 -4. Windows 端部署维护 - - 开机自启动 - - 日志管理 - - 异常告警 - -不负责: -- MoFin API 的修改(但需要配合 server.py 新增端点) -- Linux 端 price_monitor 的回退逻辑 -- 持仓分析和策略制定 - -### 知微(zhiwei)— Linux 端(MoFin) - -负责: -1. MoFin API 的 relay 兼容 - - /api/update/realtime 端点(已实现) - - /api/relay/status 端点(待实现) - - relay_state 持久化(待实现) -2. price_monitor 的 relay 检测(待实现) - - relay 在线 → 跳过港股腾讯 API 拉取 - - relay 掉线 → 回退腾讯 API 兜底 -3. tdx-relay 接入后的数据一致性保障 - - 腾讯 API 和 tdx-relay 的数据源标记区分 - - 价格更新不互相覆盖 -4. 行情来源对分析层的透明化 - - 分析层(cron prompt)不需要关心行情来源 - - 直接读 portfolio.json 即可 - - 数据源标记在 data_source 字段中 - -不负责: -- Windows 端程序的开发和部署 -- 通达信协议的细节 -- 券商行情服务器的维护 - -### 共同维护 - -1. 港股代码列表 — 两边保持一致 -2. 数据格式 — tdx-relay 推送的 JSON 格式与 MoFin 期望的格式 -3. 接口联调 — 新端点上线后的验证 - ---- - -## 四、数据流详解 - -### 正常流程(relay 在线) - -``` -tdx-relay (Windows) - │ 每 X 秒推送 {stocks: [{code, price, change_pct, ...}]} - │ POST → http://192.168.1.246:8899/api/update/realtime - ▼ -server.py 接收 - ├─ 更新 portfolio.json(港股 data_source = "tdx_relay") - ├─ 更新 watchlist.json(港股 data_source = "tdx_relay") - └─ 更新 relay_state.json(online=true, last_ping=now) - │ - ▼ - price_monitor.py(每分钟运行) - ├─ A股 → 腾讯 API(不变) - ├─ 港股 → 检查 relay_state - │ ├─ relay 在线 → 跳过(保留 tdx-relay 的实时价) - │ └─ relay 离线(>60秒无推送)→ 回退腾讯 API - └─ 数据源标记 → 写入 portfolio/watchlist -``` - -### 异常流程(relay 离线) - -``` -tdx-relay 断线 - │ 60秒内无推送 - ▼ -price_monitor.py 检测到 relay_state.online=false - │ 或 last_ping > 60秒前 - ├─ 港股 → 回退腾讯 API 拉取 - ├─ 写入时 data_source = "tencent" - └─ 记录日志 "relay offline, fallback to tencent" - -tdx-relay 恢复 - │ 推送到达 /api/update/realtime - ▼ -server.py 接收更新 - ├─ 更新 relay_state.json(online=true) - └─ 正常接收行情 -``` - ---- - -## 五、接口规范 - -### POST /api/update/realtime (已实现) - -接收 tdx-relay 推送的实时行情。 - -请求格式: -```json -{ - "stocks": [ - { - "code": "00700", - "price": 467.20, - "change_pct": 3.09, - "high": 470.00, - "low": 460.00, - "open": 462.00, - "volume": 15000000 - } - ], - "source": "tdx_relay" -} -``` - -响应: -```json -{ - "status": "ok", - "updated": 15, - "source": "tdx_relay", - "timestamp": "2026-06-12T14:30:00" -} -``` - -### GET /api/relay/status (待实现) - -查询 tdx-relay 当前状态。 - -响应: -```json -{ - "online": true, - "source": "tdx_relay", - "last_ping": "2026-06-12T14:29:55", - "age_seconds": 5, - "stocks_count": 15, - "fallback_active": false -} -``` - ---- - -## 六、当前实现状态 - -### 已完成(全部 ✅) -- server.py `/api/update/realtime` 端点 ✅ -- server.py `/api/relay/status` GET 端点 ✅ -- relay_state.json 持久化 ✅ -- price_monitor.py relay_active 检测 ✅ -- price_monitor 回退逻辑(relay 离线→腾讯 API 兜底)✅ -- tdx-relay 心跳上报(每15秒推送)✅ -- 断线自动重连(3次退避)✅ -- 17只港股全量推送 ✅ -- 数据层重构:JSON+SQLite 双写 + 消费者切 SQLite 优先 ✅ - -### 2026-06-20 数据层重构(小小莫完成) - -**新增文件**: -- `mofin_db.py` — 统一 SQLite 访问层(13张表 + 18个查询函数 + 4个写入函数) -- `migrate_all.py` — 一次性 JSON→SQLite 迁移脚本 -- `mofin_query.py` — 通用查询工具 -- `docs/DATABASE_ARCHITECTURE.md` — 完整架构文档 - -**修改文件**: -- `market_watch.py` — JSON+SQLite 双写 -- `multi_timeframe.py` — K线双写 -- `price_monitor.py` — 价格事件双写 -- `server.py` — SQLite 优先读取(/api/portfolio, /api/watchlist, /api/overview, /api/market) -- `strategy_lifecycle.py` — SQLite 优先读取(stock_sector_map, market_context, holdings, watchlist) -- `market_insight.py` — SQLite 优先读取 -- `strategy_feedback.py` — SQLite 优先读取 price_events -- `system_health_check.py` — SQLite 优先读取 price_events - -**设计原则**: -- 所有消费者:SQLite 优先 → 失败回退 JSON,系统不中断 -- 所有写入:JSON+SQLite 双写,SQLite 失败不影响 JSON 管道 -- 迁移脚本幂等可重跑,JSON 文件不修改 - ---- - -## 七、港股代码列表(双方保持一致) - -当前 17 只港股(来自 portfolio.json + watchlist.json): - -| 代码 | 名称 | 持仓/自选 | -|------|------|----------| -| 00700 | 腾讯控股 | 持仓 | -| 00981 | 中芯国际 | 持仓 | -| 01211 | 比亚迪股份 | 持仓 | -| 09988 | 阿里巴巴 | 持仓 | -| 02202 | 万科企业 | 持仓 | -| 02388 | 中银香港 | 持仓 | -| 01478 | 丘钛科技 | 持仓 | -| 09868 | 小鹏集团 | 自选(已清仓) | -| 01088 | 中国神华 | 持仓 | -| 02359 | 药明康德 | 自选 | -| 01888 | 建滔积层板 | 自选 | -| 00968 | 信义光能 | 自选 | -| 01070 | TCL电子 | 自选 | -| 02318 | 中国平安 | 自选 | -| 02628 | 中国人寿 | 自选 | -| 06160 | 百济神州 | 自选(已清仓) | -| 06869 | 长飞光纤 | 自选 | - ---- - -## 八、故障处理 - -| 现象 | 可能原因 | 处理方式 | -|------|---------|---------| -| relay 显示离线 | Windows 端掉线 | 检查 Windows 端运行状态,双击 start_tdx_relay.bat | -| relay 在线但数据不更新 | 推送异常 | 查 Windows 端日志,重启 tdx-relay | -| 港股价格异常 | 数据源错乱 | 检查 data_source 字段,确认 relay 是否覆盖了错误数据 | -| 港股价格用腾讯旧数据 | relay 离线超过 60s 自动回退 | 正常行为,relay 恢复后自动切回 | +# MoFin / TDX-Relay 协作文档 + +> 最后更新:2026-06-12 +> 维护人:知微 + 小小莫(xxm) +> 铁律:任何 relay 相关改动必须先读本文档,改完必须同步更新 + +--- + +## 一、什么是 tdx-relay + +tdx-relay 是小小莫(xxm)开发的 Windows 端通达信中继程序。 +作用:通过 opentdx 协议直连招商证券 7727 扩展行情服务器, +为 MoFin 系统提供港股低延迟实时行情。 + +### 为什么需要它 + +原本 MoFin 的港股行情来源是腾讯 API(qt.gtimg.cn), +存在约 15 分钟延迟,对于盘中决策不够及时。 +tdx-relay 将港股行情延迟从约 15 分钟降到接近实时(1~3 秒)。 + +--- + +## 二、系统架构 + +``` +Windows 端(小小莫负责) +┌─────────────────────────────────────────┐ +│ tdx-relay 项目 │ +│ │ +│ tdx_client.py │ +│ └─ opentdx MacExtendedClient │ +│ └─ 直连 招商证券 7727 扩展行情服务器 │ +│ → 拉取 17 只港股实时行情 │ +│ │ +│ run_relay.py │ +│ └─ 断线自动重连(5s/15s/30s 三次退避) │ +│ └─ 推送 → POST /api/update/realtime │ +│ │ +│ start_tdx_relay.bat │ +│ └─ 一键启动脚本 │ +└───────────────┬─────────────────────────┘ + │ HTTP POST (JSON) + ▼ +Linux 端(知微负责) +┌─────────────────────────────────────────┐ +│ MoFin 系统 (web-dashboard) │ +│ │ +│ server.py │ +│ ├─ /api/update/realtime (POST) │ +│ │ ← 接收 tdx-relay 推送的实时行情 │ +│ │ → 更新 portfolio.json + watchlist │ +│ │ → 写入 data_source = "tdx_relay" │ +│ │ │ +│ ├─ /api/relay/status (GET) │ +│ │ ← 查询 relay 状态(在线/离线/时间) │ +│ │ │ +│ price_monitor.py │ +│ └─ relay_active 检测 │ +│ ├─ relay 在线 → 跳过港股腾讯API拉取 │ +│ │ (保留 tdx-relay 的实时价不覆盖) │ +│ └─ relay 掉线 → 回退腾讯 API 兜底 │ +│ │ +│ 数据文件 │ +│ ├─ data/portfolio.json │ +│ │ └─ 每只港股: data_source=txton/tdx │ +│ ├─ data/watchlist.json │ +│ └─ data/relay_state.json (新增) │ +│ └─ online: true/false │ +│ └─ last_ping: 时间戳 │ +└─────────────────────────────────────────┘ +``` + +## 三、职责边界 + +### 小小莫(xxm)— Windows 端 + +负责: +1. tdx_client.py 的开发维护 + - 直连券商行情服务器的稳定性 + - 港股代码列表的维护(当前 17 只) + - 行情数据的正确性验证 +2. run_relay.py 的重连机制 + - 断线自动恢复(3 次退避重连) + - relan 状态上报 +3. 行情推送的稳定性 + - 每 X 秒推送一次实时行情 + - 推送失败的处理 +4. Windows 端部署维护 + - 开机自启动 + - 日志管理 + - 异常告警 + +不负责: +- MoFin API 的修改(但需要配合 server.py 新增端点) +- Linux 端 price_monitor 的回退逻辑 +- 持仓分析和策略制定 + +### 知微(zhiwei)— Linux 端(MoFin) + +负责: +1. MoFin API 的 relay 兼容 + - /api/update/realtime 端点(已实现) + - /api/relay/status 端点(待实现) + - relay_state 持久化(待实现) +2. price_monitor 的 relay 检测(待实现) + - relay 在线 → 跳过港股腾讯 API 拉取 + - relay 掉线 → 回退腾讯 API 兜底 +3. tdx-relay 接入后的数据一致性保障 + - 腾讯 API 和 tdx-relay 的数据源标记区分 + - 价格更新不互相覆盖 +4. 行情来源对分析层的透明化 + - 分析层(cron prompt)不需要关心行情来源 + - 直接读 portfolio.json 即可 + - 数据源标记在 data_source 字段中 + +不负责: +- Windows 端程序的开发和部署 +- 通达信协议的细节 +- 券商行情服务器的维护 + +### 共同维护 + +1. 港股代码列表 — 两边保持一致 +2. 数据格式 — tdx-relay 推送的 JSON 格式与 MoFin 期望的格式 +3. 接口联调 — 新端点上线后的验证 + +--- + +## 四、数据流详解 + +### 正常流程(relay 在线) + +``` +tdx-relay (Windows) + │ 每 X 秒推送 {stocks: [{code, price, change_pct, ...}]} + │ POST → http://192.168.1.246:8899/api/update/realtime + ▼ +server.py 接收 + ├─ 更新 portfolio.json(港股 data_source = "tdx_relay") + ├─ 更新 watchlist.json(港股 data_source = "tdx_relay") + └─ 更新 relay_state.json(online=true, last_ping=now) + │ + ▼ + price_monitor.py(每分钟运行) + ├─ A股 → 腾讯 API(不变) + ├─ 港股 → 检查 relay_state + │ ├─ relay 在线 → 跳过(保留 tdx-relay 的实时价) + │ └─ relay 离线(>60秒无推送)→ 回退腾讯 API + └─ 数据源标记 → 写入 portfolio/watchlist +``` + +### 异常流程(relay 离线) + +``` +tdx-relay 断线 + │ 60秒内无推送 + ▼ +price_monitor.py 检测到 relay_state.online=false + │ 或 last_ping > 60秒前 + ├─ 港股 → 回退腾讯 API 拉取 + ├─ 写入时 data_source = "tencent" + └─ 记录日志 "relay offline, fallback to tencent" + +tdx-relay 恢复 + │ 推送到达 /api/update/realtime + ▼ +server.py 接收更新 + ├─ 更新 relay_state.json(online=true) + └─ 正常接收行情 +``` + +--- + +## 五、接口规范 + +### POST /api/update/realtime (已实现) + +接收 tdx-relay 推送的实时行情。 + +请求格式: +```json +{ + "stocks": [ + { + "code": "00700", + "price": 467.20, + "change_pct": 3.09, + "high": 470.00, + "low": 460.00, + "open": 462.00, + "volume": 15000000 + } + ], + "source": "tdx_relay" +} +``` + +响应: +```json +{ + "status": "ok", + "updated": 15, + "source": "tdx_relay", + "timestamp": "2026-06-12T14:30:00" +} +``` + +### GET /api/relay/status (待实现) + +查询 tdx-relay 当前状态。 + +响应: +```json +{ + "online": true, + "source": "tdx_relay", + "last_ping": "2026-06-12T14:29:55", + "age_seconds": 5, + "stocks_count": 15, + "fallback_active": false +} +``` + +--- + +## 六、当前实现状态 + +### 已完成(全部 ✅) +- server.py `/api/update/realtime` 端点 ✅ +- server.py `/api/relay/status` GET 端点 ✅ +- relay_state.json 持久化 ✅ +- price_monitor.py relay_active 检测 ✅ +- price_monitor 回退逻辑(relay 离线→腾讯 API 兜底)✅ +- tdx-relay 心跳上报(每15秒推送)✅ +- 断线自动重连(3次退避)✅ +- 17只港股全量推送 ✅ +- 数据层重构:JSON+SQLite 双写 + 消费者切 SQLite 优先 ✅ + +### 2026-06-20 数据层重构(小小莫完成) + +**新增文件**: +- `mofin_db.py` — 统一 SQLite 访问层(13张表 + 18个查询函数 + 4个写入函数) +- `migrate_all.py` — 一次性 JSON→SQLite 迁移脚本 +- `mofin_query.py` — 通用查询工具 +- `docs/DATABASE_ARCHITECTURE.md` — 完整架构文档 + +**修改文件**: +- `market_watch.py` — JSON+SQLite 双写 +- `multi_timeframe.py` — K线双写 +- `price_monitor.py` — 价格事件双写 +- `server.py` — SQLite 优先读取(/api/portfolio, /api/watchlist, /api/overview, /api/market) +- `strategy_lifecycle.py` — SQLite 优先读取(stock_sector_map, market_context, holdings, watchlist) +- `market_insight.py` — SQLite 优先读取 +- `strategy_feedback.py` — SQLite 优先读取 price_events +- `system_health_check.py` — SQLite 优先读取 price_events + +**设计原则**: +- 所有消费者:SQLite 优先 → 失败回退 JSON,系统不中断 +- 所有写入:JSON+SQLite 双写,SQLite 失败不影响 JSON 管道 +- 迁移脚本幂等可重跑,JSON 文件不修改 + +--- + +## 七、港股代码列表(双方保持一致) + +当前 17 只港股(来自 portfolio.json + watchlist.json): + +| 代码 | 名称 | 持仓/自选 | +|------|------|----------| +| 00700 | 腾讯控股 | 持仓 | +| 00981 | 中芯国际 | 持仓 | +| 01211 | 比亚迪股份 | 持仓 | +| 09988 | 阿里巴巴 | 持仓 | +| 02202 | 万科企业 | 持仓 | +| 02388 | 中银香港 | 持仓 | +| 01478 | 丘钛科技 | 持仓 | +| 09868 | 小鹏集团 | 自选(已清仓) | +| 01088 | 中国神华 | 持仓 | +| 02359 | 药明康德 | 自选 | +| 01888 | 建滔积层板 | 自选 | +| 00968 | 信义光能 | 自选 | +| 01070 | TCL电子 | 自选 | +| 02318 | 中国平安 | 自选 | +| 02628 | 中国人寿 | 自选 | +| 06160 | 百济神州 | 自选(已清仓) | +| 06869 | 长飞光纤 | 自选 | + +--- + +## 八、故障处理 + +| 现象 | 可能原因 | 处理方式 | +|------|---------|---------| +| relay 显示离线 | Windows 端掉线 | 检查 Windows 端运行状态,双击 start_tdx_relay.bat | +| relay 在线但数据不更新 | 推送异常 | 查 Windows 端日志,重启 tdx-relay | +| 港股价格异常 | 数据源错乱 | 检查 data_source 字段,确认 relay 是否覆盖了错误数据 | +| 港股价格用腾讯旧数据 | relay 离线超过 60s 自动回退 | 正常行为,relay 恢复后自动切回 | diff --git a/docs/DATABASE_ARCHITECTURE.md b/docs/archive/DATABASE_ARCHITECTURE.md similarity index 100% rename from docs/DATABASE_ARCHITECTURE.md rename to docs/archive/DATABASE_ARCHITECTURE.md diff --git a/docs/EXPERT_SYSTEM_DESIGN.md b/docs/archive/EXPERT_SYSTEM_DESIGN.md similarity index 100% rename from docs/EXPERT_SYSTEM_DESIGN.md rename to docs/archive/EXPERT_SYSTEM_DESIGN.md diff --git a/docs/archive/README.md b/docs/archive/README.md new file mode 100644 index 0000000..c2c136f --- /dev/null +++ b/docs/archive/README.md @@ -0,0 +1,20 @@ +# Archive — 历史文档 + +这些文档是早期设计、需求分析、诊断报告。**不代表当前系统状态**。保留供参考。 + +| 文件 | 内容 | 日期 | +|------|------|------| +| REQUIREMENTS.md | 初始需求文档 | 2026-06 | +| EXPERT_SYSTEM_DESIGN.md | 专家系统设计 | 2026-06 | +| data-pipeline-diagnosis.md | 数据管道诊断 | 2026-06 | +| refactor-for-xiaoxiao.md | 重构方案 | 2026-06 | +| session-handover-20260630.md | 会话交接 | 2026-06 | +| DATABASE_ARCHITECTURE.md | 旧 DB 架构(被 portfolio-data-model 取代) | 2026-06 | +| mofin-database-architecture.md | 旧 DB 架构 | 2026-06 | +| market-data-requirements.md | 旧市场数据需求 | 2026-06 | +| market-screening-system-design.md | 旧市场筛选设计 | 2026-06 | +| strategy-evaluation-requirements.md | 旧策略评估需求 | 2026-06 | +| self-healing-loop.md | 旧自愈循环 | 2026-06 | +| analyst-knowledge-log.md | 分析师知识日志 | 2026-07 | + +当前系统文档见 `../README.md`。 diff --git a/docs/REQUIREMENTS.md b/docs/archive/REQUIREMENTS.md similarity index 100% rename from docs/REQUIREMENTS.md rename to docs/archive/REQUIREMENTS.md diff --git a/docs/analyst-knowledge-log.md b/docs/archive/analyst-knowledge-log.md similarity index 100% rename from docs/analyst-knowledge-log.md rename to docs/archive/analyst-knowledge-log.md diff --git a/docs/data-pipeline-diagnosis.md b/docs/archive/data-pipeline-diagnosis.md similarity index 100% rename from docs/data-pipeline-diagnosis.md rename to docs/archive/data-pipeline-diagnosis.md diff --git a/docs/market-data-requirements.md b/docs/archive/market-data-requirements.md similarity index 100% rename from docs/market-data-requirements.md rename to docs/archive/market-data-requirements.md diff --git a/docs/market-screening-system-design.md b/docs/archive/market-screening-system-design.md similarity index 100% rename from docs/market-screening-system-design.md rename to docs/archive/market-screening-system-design.md diff --git a/docs/mofin-database-architecture.md b/docs/archive/mofin-database-architecture.md similarity index 100% rename from docs/mofin-database-architecture.md rename to docs/archive/mofin-database-architecture.md diff --git a/docs/refactor-for-xiaoxiao.md b/docs/archive/refactor-for-xiaoxiao.md similarity index 100% rename from docs/refactor-for-xiaoxiao.md rename to docs/archive/refactor-for-xiaoxiao.md diff --git a/docs/self-healing-loop.md b/docs/archive/self-healing-loop.md similarity index 100% rename from docs/self-healing-loop.md rename to docs/archive/self-healing-loop.md diff --git a/docs/session-handover-20260630.md b/docs/archive/session-handover-20260630.md similarity index 100% rename from docs/session-handover-20260630.md rename to docs/archive/session-handover-20260630.md diff --git a/docs/strategy-evaluation-requirements.md b/docs/archive/strategy-evaluation-requirements.md similarity index 100% rename from docs/strategy-evaluation-requirements.md rename to docs/archive/strategy-evaluation-requirements.md diff --git a/docs/cron-catalog.md b/docs/cron-catalog.md index 3cf6dfd..7f3ee62 100644 --- a/docs/cron-catalog.md +++ b/docs/cron-catalog.md @@ -1,91 +1,91 @@ -# MoFin Cron 完全手册 - -> 版本: v1 | 最后更新: 2026-06-27 -> 用途: 所有定时任务的完整文档,含设计意图、实现方式、数据流、代码结构、依赖关系。 - -## 一、系统健康 - -| 脚本 | 调度 | 设计意图 | 数据流 | 关键代码 | -|------|------|---------|--------|---------| -| `morning_health_check.py` | 交易日8:00 | 开盘前全面体检8类48项,发现异常→auto_fix/TODO | 读:checklist.json/DB/进程/端口/API → 写:health_check_log表+todos表 | main() → run_check() → write_todos_for_issues() → auto_fix_issue() | -| `intraday_health_check.py` | 交易日每15分 9-15 | 盘中轻量自检,XMPP/Gateway/Scanner/价格/信号管道 | 读:DB/进程/API/macro_risk_state.json → 写:todos表 | main() → check_bots/gateways/xiaoguo/price_monitor/signal_pipeline → write_todos() | -| `system_health_check.py` | 每日9:00 | 传统系统检查(进程/端口/文件/数据新鲜度)——被morning_health_check替代 | 读:系统状态 → stdout | run() | -| `system_audit.py` | 交易日17:30 | 7维度审计(信号/股票/策略/建议/组合/数据管道/服务) | 读:DB+JSON → 写:audit_report.json | audit_signals/stocks/strategies/advice/portfolio/pipeline/services() | -| `memory_guardian.py` | 每日7:00 | 按SOUL记忆规则检查并清理共享memory | 读:MEMORY.md+gateway → 调gateway清理 + report | check_memory_md() → cleanup_memory() | - -## 二、数据采集 - -| 脚本 | 调度 | 设计意图 | 数据流 | 关键代码 | -|------|------|---------|--------|---------| -| `price_monitor.py` | 交易日每2分 9-16 | 腾讯API实时价→更新portfolio.json+price_events表 | 腾讯API→price_events表+portfolio.json(price更新) | main() → fetch_quote() → write_price_event() → update_portfolio() | -| `macro_context_collector.py` | 工作日每30分 8-15 + 周末 | 宏观新闻采集+实时红绿灯检测+指数采集 | akshare→macro_raw_news表+signal_news(macro_watch)+macro_risk_state.json+macro_context_log表 | main() → fetch_news() → detect_risk() → write_risk_signal() → 指数→DB | -| `divergence_detector.py` | 工作日每30分 8-15 + 周末 | 跨市场5项背离检测→风险信号 | 腾讯API→计算背离→signal_news(macro_watch) | main() → check_divergences() → write_signal() | -| `refresh_mtf_cache.py` | 交易日9:00 | 开盘前预填多周期K线缓存 | 腾讯API→multi_tf_cache.json | main() → batch_update_all() | -| `collect_evaluation_data.py` | 交易日20:30 | 六维评估原始数据采集 | 各API→evaluation_input.json | main() → collect_index/sector/fundamental/money_flow() | - -## 三、策略与交易 - -| 脚本 | 调度 | 设计意图 | 数据流 | 关键代码 | -|------|------|---------|--------|---------| -| `stale_push_wlin.py` | 交易日每30分 9-15 | 自选买入区提醒+自动重评+换仓评估+T+2前瞻 | 读:decisions.json+portfolio.json+code_data → 推XMPP | main() → evaluate_swap() → check_tplus2() → push_to_xmpp() | -| `stale_detector.py` | 每30分(被stale_push_wlin调用) | 检测价格偏离/策略过期/RR<1.5→标记STALE | 读:decisions.json → stdout(WL_IN/DRIFT/STALE等) | main() → check_entries() | -| `per_stock_reassess.py` | 交易日9:00/12:00 + 盘中触发 | 个股策略重评(技术面→止损/止盈/买入区) | 读:decisions.json+腾讯API → 写:decisions.json | main() → reassess_strategy() for each code | -| `strategy-staleness-check.py` | 交易日9:00 | 策略时效性扫描→staleness_report.json | 读:decisions.json → 写:strategy_staleness_report.json | main() → check_age/drift/invalid() | -| `strategy_evaluator.py` | 每周六21:00 | 双维度策略评估 | 读:evaluation_input.json+decisions.json → evaluation结果+accuracy_stats | main() → evaluate_holdings/watchlist() | -| `advice_reconciliation.py` | 每周六20:00 | 建议对账:追踪建议执行情况 | 读:advice_timeline表+portfolio.json → 报告 | main() → reconcile() | -| `strategy_review.py` | 交易日20:00 | 三层复盘(信号/执行/综合),失败模式归因 | 读:decisions.json+腾讯API → 写:accuracy_stats表 | review() → evaluate_strategy() → classify_outcome() | -| `data_governance.py` | 每周六10:00 | holding_strategies去重+缺失策略检查+深套统计 | 读:DB+decisions.json → 归档+报告 | clean_holding_strategies() → check_missing_strategies() | - -## 四、信号消费 - -| 脚本 | 调度 | 设计意图 | 数据流 | 关键代码 | -|------|------|---------|--------|---------| -| `xiaoguo_scanner.py` | 交易日每5分 9-15 | 全市场排行榜→新闻搜索→情感判断→signal_news | akshare→小果LLM→signal_news(xiaoguo) | main() → fetch_hot_board/rotating_board/sector_leaders() → check_stock() | -| `xiaoguo_signal_consumer.py` | 交易日每30分 9-15 | 消费xiaoguo信号→五维评估→加自选/关注/跳过 | 读:signal_news(xiaoguo)+腾讯行情 → 写:watchlist.json+标记processed | main() → quick_assess() → evaluate_and_act() | -| `macro_signal_consumer.py` | 交易日每15分 9-15 | 消费宏观风险信号→macro_risk_state.json | 读:signal_news(macro_watch) → 写:macro_risk_state.json+标记processed | main() → read_signals() → update_risk_state() | - -## 五、自成长 - -| 脚本 | 调度 | 设计意图 | 数据流 | 关键代码 | -|------|------|---------|--------|---------| -| `branch_scanner.py` | 交易日每15分 9-15 | 分支状态变化检测→触发计数+剪枝候选 | 读:decisions.json+strategy_tree+当前情景 → 写:trigger_count+scanner_state.json | main() → evaluate_branches() → detect_changes() | -| `prune_branches.py` | 交易日21:00 | 低效分支剪枝(触发≥5次+成功率<50%) | 读:strategy_tree.branches → 移入pruned_branches | main() → prune() | -| `hardcode_scanner.py` | 交易日17:25 | 扫描.py中大额数字硬编码 | 读:所有.py → 写:audit JSON | main() → scan_files() | -| `meta_growth.py` | 每个交易日12:45+0:45 | 分析git log修复模式→扩展hardcode_scanner规则 | 读:git log+growth_registry → 写:hardcode_scanner扩展点+growth_registry | main() → analyze_fixes() → extend_rules() | - -## 六、LLM Cron(调度LLM分析,非纯脚本) - -| 任务 | 调度 | 设计意图 | 加载skill | -|------|------|---------|-----------| -| 开盘简报 | 9:35 | 简短开盘简报(需操作票+分支理由+其他不变) | cron-report-format, analyst-knowledge | -| 收盘简报 | 16:10 | 当日回顾+明日关注+情景判断 | cron-report-format, analyst-knowledge | -| 策略评估-每日 | 21:00 | 六维分析+三阶段递进判断 | analyst-knowledge, strategy-reassessment, strategy-evaluation | -| 策略评估-每周 | 周六21:00 | 周度回顾 | (no_agent: strategy_evaluator.py) | -| 知识萃取-盘后 | 16:30 | 当日经验沉淀 | analyst-knowledge | -| 系统全局审计 | 17:30 | 审计报告解读 | analyst-knowledge | -| 宏观风险扫描 | 8:30/11:30 + 周末 | 宏观新闻→系统性风险评估 | macro-risk-scanner | -| 小果情感分析 | 16:00 | 持仓+自选新闻情感分析 | (LLM cron, 调xiaoguo API) | - -## 七、暂停/废弃 - -| 脚本 | 原因 | 替代 | -|------|------|------| -| MoFin 盘前中/午后监控 | Dad说不需要盘中推 | intraday_health_check(静默采集) | -| 核心区间维护 | 被高频价格监控替代 | price_monitor | -| 知微洞察生成 | 被每日评估替代 | strategy_evaluation | -| 小果市场筛选-全市场 | 小果LLM不可靠 | xiaoguo_scanner(降级版) | -| 市场数据采集 | 整合到macro_context_collector | macro_context_collector | -| 市场精选推荐-每日 | Dad不需要 | — | - -## 八、cron数量统计 - -| 分类 | 启用 | 暂停 | 合计 | -|------|------|------|------| -| 系统健康 | 5 | 0 | 5 | -| 数据采集 | 5 | 0 | 5 | -| 策略与交易 | 8 | 0 | 8 | -| 信号消费 | 3 | 0 | 3 | -| 自成长 | 4 | 0 | 4 | -| LLM Cron | 8 | 0 | 8 | -| 暂停/废弃 | 0 | 5 | 5 | -| **合计** | **33** | **5** | **38** | +# MoFin Cron 完全手册 + +> 版本: v1 | 最后更新: 2026-06-27 +> 用途: 所有定时任务的完整文档,含设计意图、实现方式、数据流、代码结构、依赖关系。 + +## 一、系统健康 + +| 脚本 | 调度 | 设计意图 | 数据流 | 关键代码 | +|------|------|---------|--------|---------| +| `morning_health_check.py` | 交易日8:00 | 开盘前全面体检8类48项,发现异常→auto_fix/TODO | 读:checklist.json/DB/进程/端口/API → 写:health_check_log表+todos表 | main() → run_check() → write_todos_for_issues() → auto_fix_issue() | +| `intraday_health_check.py` | 交易日每15分 9-15 | 盘中轻量自检,XMPP/Gateway/Scanner/价格/信号管道 | 读:DB/进程/API/macro_risk_state.json → 写:todos表 | main() → check_bots/gateways/xiaoguo/price_monitor/signal_pipeline → write_todos() | +| `system_health_check.py` | 每日9:00 | 传统系统检查(进程/端口/文件/数据新鲜度)——被morning_health_check替代 | 读:系统状态 → stdout | run() | +| `system_audit.py` | 交易日17:30 | 7维度审计(信号/股票/策略/建议/组合/数据管道/服务) | 读:DB+JSON → 写:audit_report.json | audit_signals/stocks/strategies/advice/portfolio/pipeline/services() | +| `memory_guardian.py` | 每日7:00 | 按SOUL记忆规则检查并清理共享memory | 读:MEMORY.md+gateway → 调gateway清理 + report | check_memory_md() → cleanup_memory() | + +## 二、数据采集 + +| 脚本 | 调度 | 设计意图 | 数据流 | 关键代码 | +|------|------|---------|--------|---------| +| `price_monitor.py` | 交易日每2分 9-16 | 腾讯API实时价→更新portfolio.json+price_events表 | 腾讯API→price_events表+portfolio.json(price更新) | main() → fetch_quote() → write_price_event() → update_portfolio() | +| `macro_context_collector.py` | 工作日每30分 8-15 + 周末 | 宏观新闻采集+实时红绿灯检测+指数采集 | akshare→macro_raw_news表+signal_news(macro_watch)+macro_risk_state.json+macro_context_log表 | main() → fetch_news() → detect_risk() → write_risk_signal() → 指数→DB | +| `divergence_detector.py` | 工作日每30分 8-15 + 周末 | 跨市场5项背离检测→风险信号 | 腾讯API→计算背离→signal_news(macro_watch) | main() → check_divergences() → write_signal() | +| `refresh_mtf_cache.py` | 交易日9:00 | 开盘前预填多周期K线缓存 | 腾讯API→multi_tf_cache.json | main() → batch_update_all() | +| `collect_evaluation_data.py` | 交易日20:30 | 六维评估原始数据采集 | 各API→evaluation_input.json | main() → collect_index/sector/fundamental/money_flow() | + +## 三、策略与交易 + +| 脚本 | 调度 | 设计意图 | 数据流 | 关键代码 | +|------|------|---------|--------|---------| +| `stale_push_wlin.py` | 交易日每30分 9-15 | 自选买入区提醒+自动重评+换仓评估+T+2前瞻 | 读:decisions.json+portfolio.json+code_data → 推XMPP | main() → evaluate_swap() → check_tplus2() → push_to_xmpp() | +| `stale_detector.py` | 每30分(被stale_push_wlin调用) | 检测价格偏离/策略过期/RR<1.5→标记STALE | 读:decisions.json → stdout(WL_IN/DRIFT/STALE等) | main() → check_entries() | +| `per_stock_reassess.py` | 交易日9:00/12:00 + 盘中触发 | 个股策略重评(技术面→止损/止盈/买入区) | 读:decisions.json+腾讯API → 写:decisions.json | main() → reassess_strategy() for each code | +| `strategy-staleness-check.py` | 交易日9:00 | 策略时效性扫描→staleness_report.json | 读:decisions.json → 写:strategy_staleness_report.json | main() → check_age/drift/invalid() | +| `strategy_evaluator.py` | 每周六21:00 | 双维度策略评估 | 读:evaluation_input.json+decisions.json → evaluation结果+accuracy_stats | main() → evaluate_holdings/watchlist() | +| `advice_reconciliation.py` | 每周六20:00 | 建议对账:追踪建议执行情况 | 读:advice_timeline表+portfolio.json → 报告 | main() → reconcile() | +| `strategy_review.py` | 交易日20:00 | 三层复盘(信号/执行/综合),失败模式归因 | 读:decisions.json+腾讯API → 写:accuracy_stats表 | review() → evaluate_strategy() → classify_outcome() | +| `data_governance.py` | 每周六10:00 | holding_strategies去重+缺失策略检查+深套统计 | 读:DB+decisions.json → 归档+报告 | clean_holding_strategies() → check_missing_strategies() | + +## 四、信号消费 + +| 脚本 | 调度 | 设计意图 | 数据流 | 关键代码 | +|------|------|---------|--------|---------| +| `xiaoguo_scanner.py` | 交易日每5分 9-15 | 全市场排行榜→新闻搜索→情感判断→signal_news | akshare→小果LLM→signal_news(xiaoguo) | main() → fetch_hot_board/rotating_board/sector_leaders() → check_stock() | +| `xiaoguo_signal_consumer.py` | 交易日每30分 9-15 | 消费xiaoguo信号→五维评估→加自选/关注/跳过 | 读:signal_news(xiaoguo)+腾讯行情 → 写:watchlist.json+标记processed | main() → quick_assess() → evaluate_and_act() | +| `macro_signal_consumer.py` | 交易日每15分 9-15 | 消费宏观风险信号→macro_risk_state.json | 读:signal_news(macro_watch) → 写:macro_risk_state.json+标记processed | main() → read_signals() → update_risk_state() | + +## 五、自成长 + +| 脚本 | 调度 | 设计意图 | 数据流 | 关键代码 | +|------|------|---------|--------|---------| +| `branch_scanner.py` | 交易日每15分 9-15 | 分支状态变化检测→触发计数+剪枝候选 | 读:decisions.json+strategy_tree+当前情景 → 写:trigger_count+scanner_state.json | main() → evaluate_branches() → detect_changes() | +| `prune_branches.py` | 交易日21:00 | 低效分支剪枝(触发≥5次+成功率<50%) | 读:strategy_tree.branches → 移入pruned_branches | main() → prune() | +| `hardcode_scanner.py` | 交易日17:25 | 扫描.py中大额数字硬编码 | 读:所有.py → 写:audit JSON | main() → scan_files() | +| `meta_growth.py` | 每个交易日12:45+0:45 | 分析git log修复模式→扩展hardcode_scanner规则 | 读:git log+growth_registry → 写:hardcode_scanner扩展点+growth_registry | main() → analyze_fixes() → extend_rules() | + +## 六、LLM Cron(调度LLM分析,非纯脚本) + +| 任务 | 调度 | 设计意图 | 加载skill | +|------|------|---------|-----------| +| 开盘简报 | 9:35 | 简短开盘简报(需操作票+分支理由+其他不变) | cron-report-format, analyst-knowledge | +| 收盘简报 | 16:10 | 当日回顾+明日关注+情景判断 | cron-report-format, analyst-knowledge | +| 策略评估-每日 | 21:00 | 六维分析+三阶段递进判断 | analyst-knowledge, strategy-reassessment, strategy-evaluation | +| 策略评估-每周 | 周六21:00 | 周度回顾 | (no_agent: strategy_evaluator.py) | +| 知识萃取-盘后 | 16:30 | 当日经验沉淀 | analyst-knowledge | +| 系统全局审计 | 17:30 | 审计报告解读 | analyst-knowledge | +| 宏观风险扫描 | 8:30/11:30 + 周末 | 宏观新闻→系统性风险评估 | macro-risk-scanner | +| 小果情感分析 | 16:00 | 持仓+自选新闻情感分析 | (LLM cron, 调xiaoguo API) | + +## 七、暂停/废弃 + +| 脚本 | 原因 | 替代 | +|------|------|------| +| MoFin 盘前中/午后监控 | Dad说不需要盘中推 | intraday_health_check(静默采集) | +| 核心区间维护 | 被高频价格监控替代 | price_monitor | +| 知微洞察生成 | 被每日评估替代 | strategy_evaluation | +| 小果市场筛选-全市场 | 小果LLM不可靠 | xiaoguo_scanner(降级版) | +| 市场数据采集 | 整合到macro_context_collector | macro_context_collector | +| 市场精选推荐-每日 | Dad不需要 | — | + +## 八、cron数量统计 + +| 分类 | 启用 | 暂停 | 合计 | +|------|------|------|------| +| 系统健康 | 5 | 0 | 5 | +| 数据采集 | 5 | 0 | 5 | +| 策略与交易 | 8 | 0 | 8 | +| 信号消费 | 3 | 0 | 3 | +| 自成长 | 4 | 0 | 4 | +| LLM Cron | 8 | 0 | 8 | +| 暂停/废弃 | 0 | 5 | 5 | +| **合计** | **33** | **5** | **38** | diff --git a/docs/lifecycle-management.md b/docs/lifecycle-management.md index 28d935d..d33495b 100644 --- a/docs/lifecycle-management.md +++ b/docs/lifecycle-management.md @@ -1,314 +1,314 @@ -# MoFin 对象生命周期管理 — 完整规范 - -> 版本: v1.0 | 最后更新: 2026-06-22 -> 核心理念:每个对象都有完整的生命周期,从生到死都有流程覆盖,不留孤儿。 - ---- - -## 一、总览:五大对象及其生命周期 - -``` - ┌──────────┐ - │ 信号Signal │ - └────┬─────┘ - │ 评估分流 - ▼ -┌──────────┐ ┌──────────┐ ┌──────────┐ -│ 候选股 │ → │ 自选股 │ → │ 持仓股 │ -│ (watching)│ │ (watchlist)│ │ (holdings)│ -└──────────┘ └────┬─────┘ └────┬─────┘ - │ │ - ▼ ▼ - ┌──────────┐ ┌──────────┐ - │ 策略 │ ← │ 建议 │ - │ (strategy)│ │ (advice) │ - └────┬─────┘ └────┬─────┘ - │ │ - ▼ ▼ - ┌──────────┐ ┌──────────┐ - │ 评估结果 │ │ 执行结果 │ - │ (evaluation)│ │ (result) │ - └──────────┘ └──────────┘ - ↘ ↙ - ┌──────────┐ - │ 反馈修正 │ - │ (feedback)│ - └──────────┘ -``` - ---- - -## 二、对象一:信号(Signal) - -### 定义 -xiaoguo_scanner 或 trend_detector 产出的原始信号,表示一只股票在某方面有异常。 - -### 状态流转 -``` -source写入(signal_news表) - │ - ▼ - ┌──────┐ - │ 未处理 │ ←─ source='xiaoguo' 或 'xiaoguo_risk' 或 'trend' - └──┬───┘ - │ 知微(盯盘cron)读取并评估 - ├──────────────────────────────────────┐ - ▼ ▼ - ┌──────┐ ┌──────┐ - │ 已采纳 │ │ 已忽略 │ - │ → 入自选│ │ → 跳过 │ - └──────┘ └──────┘ -``` - -### 处理流程 -1. **写入**:xiaoguo_scanner(每5min) / trend_detector(每25min) → INSERT INTO signal_news -2. **读取**:盯盘cron(每15-25min) → SELECT FROM signal_news WHERE source LIKE 'xiaoguo%' ORDER BY id DESC -3. **评估**:五维全面分析(大盘→行业→个股,消息+基本面+技术面) -4. **分流**: - - 采纳 → 加入自选(watchlist) + 生成策略(decisions.json) - - 关注 → 加入关注列表(watchlist status=watching) - - 忽略 → 不处理 - -### 当前缺口 -- [x] signal_news 缺 processed 标记 → 已修复(6/22): 加processed列,cron处理完后UPDATE标记 -- [x] xiaoguo_risk 信号已接入(cron prompt处理) - -### 修复方案 -为 signal_news 表新增 `processed` 字段(0=未处理, 1=已处理),cron处理完后 UPDATE 标记。 - ---- - -## 三、对象二:股票(Stock) - -### 定义 -系统中出现的任何股票。按参与深度分四级。 - -### 状态流转 -``` - 发现(信号来) - │ - ▼ -┌──────────┐ -│ 关注中 │ status=watching | watchlist.json -│ (watching)│ 有价钱监控,无正式策略 -└────┬─────┘ - │ 条件触发:>3%波动 / 有新闻 / 价格入区 - ▼ -┌──────────┐ -│ 正式自选 │ status=默认 | watchlist.json + decisions.json -│ (watchlist)│ 有完整策略(买入区/止损/止盈) -└────┬─────┘ - │ 用户买入执行 - ▼ -┌──────────┐ -│ 持仓 │ holdings表 + decisions.json(type=持仓策略) -│ (holdings)│ 有成本+仓位+策略,全过程监控 -└────┬─────┘ - │ 清仓/卖出 - ▼ -┌──────────┐ -│ 已关闭 │ status=closed | decisions.json保留但隐藏 -│ (closed) │ 历史记录不删除,前端不展示 -└──────────┘ -``` - -### 参与流程 -- 关注中 → price_monitor覆盖(每2min刷新价钱) -- 正式自选 → price_monitor + multi_tf_cache(每天9:00) + stale_detector + 策略重评(9:00/12:00) + 盯盘cron -- 持仓 → 全部上述 + 止损/止盈监控 + 组合分析 - ---- - -## 四、对象三:策略(Strategy) - -### 定义 -一个股票的操作规则,包含买入区/止损/止盈/仓位。 - -### 状态流转 -``` - 创建评估 - │ - ▼ -┌──────┐ -│ 新建 │ 首次生成策略 -└──┬───┘ - │ 写入decisions.json生效 - ▼ -┌──────┐ -│active│ 正常运行中 -└──┬───┘ - │ 超过14天未更新 / 价格偏离买入区>20% - ▼ -┌──────┐ -│stale │ 标记需要重评 -└──┬───┘ - │ stale_detector发现 + 触发重评 - ▼ -┌──────┐ -│ 重评 │ regenerate_all() / per_stock_reassess() -└──┬───┘ - │ - ├── 参数更新 → active(新版本) - └── 清仓 → closed(停止监控) -``` - -### 触发重评的条件(三线) -1. **价格偏离**:超买入区上沿>20%轻度 / >35%严重 -2. **时间过期**:>14天未更新 -3. **事件触发**:财报/板块政策/大盘系统性风险 - -### 评估反馈 -每次重评对比旧策略: -- 旧止损/止盈是否正确? -- 哪些判断对了?哪些错了? -- 记入 changelog 供下次参考 - ---- - -## 五、对象四:建议(Advice) - -### 定义 -知微给出的具体操作指令,"现价XX买入XX股"、"止损设XX"等。 - -### 状态流转 -``` - 知微生成建议 - │ - ▼ -┌──────┐ -│pending│ /api/advice/record → decisions.json advice_timeline -└──┬───┘ - │ - ├── 老爸执行操作 → executed(+结果) → 闭环完成 - ├── 老爸确认看到 → confirmed - └── 无效/过时 → ignored -``` - -### 闭环要求 -- ✅ pending → 生成时记录 -- ✅ executed → 支持标记(已修复 6/22) -- ✅ result字段 → 支持记录结果 -- ❌ 自动化闭环缺失:没有机制在操作执行后自动关联到对应建议 - -### 评估反馈 -- 建议执行后,对比执行结果与建议预期 -- 准确率统计存 accuracy_stats 表 -- 每周建议对账:advice_reconciliation.py - ---- - -## 六、对象五:评估(Evaluation) - -### 定义 -对策略执行情况的定期检查结论。这是"自我提升"的核心。 - -### 双维度评估框架 -``` - 阶段一(理论维度):策略规划是否正确? - ├─ 当初的买入区/止损/止盈设置是否合理? - ├─ 基于当时的数据,判断逻辑是否有问题? - └─ 输出:策略本身的质量评分 - - 阶段二(实际维度):执行结果如何? - ├─ 策略执行后股价走势是否符合预期? - ├─ 止损/止盈是否被触发?触发了结果如何? - └─ 输出:执行效果评分 -``` - -### 评估频率 -- 每日21:00 → 策略评估-每日 cron(六维评估) -- 每周21:00周六 → 策略评估-每周 cron(双维度全面评估) -- 每周20:00周六 → 建议对账-每周 cron(advice准确率) - -### 反馈修正流 -``` -评估结果 - ↓ -发现策略偏差 → 记入 knowledge-log - ↓ -修正策略参数 → 触发重评 - ↓ -新策略上线 → 加入监控 - ↓ -下一轮评估验证修正效果 -``` - ---- - -## 七、核心:自我提升循环 - -### 循环结构 -``` - ┌────────────┐ - │ 产生信号/数据 │ - └─────┬──────┘ - │ - ▼ - ┌────────────┐ - │ 知微分析评估 │ - └─────┬──────┘ - │ - ┌─────┴──────┐ - │ │ - ▼ ▼ - ┌────────┐ ┌────────┐ - │ 执行操作 │ │ 记录结论 │ - └────┬───┘ └────┬───┘ - │ │ - └─────┬──────┘ - ▼ - ┌────────────┐ - │ 对比预期结果 │ ← 实际走势 vs 当初判断 - └─────┬──────┘ - │ - ┌─────┴──────┐ - │ │ - ▼ ▼ - ┌────────┐ ┌────────┐ - │ 对了→固化 │ │ 错了→修正 │ - │ 记入知识库 │ │ 调策略/规则 │ - └────────┘ └────────┘ - │ - ▼ - ┌────────────┐ - │ 下一轮验证 │ ← 回到顶部 - └────────────┘ -``` - -### 落地手段 -| 环节 | 机制 | 频率 | -|------|------|------| -| 产生信号 | xiaoguo_scanner / trend_detector | 5-25min | -| 分析评估 | 盯盘cron / 策略评估cron | 15min-每日 | -| 执行操作 | 老爸手动 / advice_timeline记录 | 按需 | -| 对比结果 | advice_reconciliation / 策略评估 | 每周 | -| 知识萃取 | 知识萃取cron + knowledge-log | 每日16:30 | -| **全局审计** | **system_audit.py + 审计cron** | **每日17:30** | -| 修正迭代 | stale_detector + regenerate_all | 每日9:00/12:00 | - ---- - -## 八、当前缺口与修复清单 - -### 信号层 -- [ ] signal_news 缺 processed 标记 → 知微处理完的信号下次不重复读 -- [ ] xiaoguo_risk 信号目前无人处理(盯盘cron只看持仓止损,不读xiaoguo_risk) - -### 股票层 -- [ ] 关注→正式升级的触发机制不够自动化(依赖cron LLM判断,无硬性触发器) -- [ ] 已关闭股票不会主动从 watchlist 移除,只标记 status=closed - -### 策略层 -- [x] stale_detector 已实现(价格偏离+时间过期) -- [x] per_stock_reassess 已实现(盘中触发) -- [ ] 策略版本对比未自动记录到 changelog(手动的有,自动的无) - -### 建议层 -- [x] /api/advice/record 去重(6/22修复) -- [x] /api/advice/confirm 支持executed(6/22修复) -- [ ] 建议执行后自动回写result(需对接用户交易数据) - -### 反馈层 -- [x] 知识萃取cron已运行(每日16:30) -- [ ] 知识萃取结果自动触发系统修改(目前只记录不改) -- [x] 建议对账每周跑(advice_reconciliation.py) +# MoFin 对象生命周期管理 — 完整规范 + +> 版本: v1.0 | 最后更新: 2026-06-22 +> 核心理念:每个对象都有完整的生命周期,从生到死都有流程覆盖,不留孤儿。 + +--- + +## 一、总览:五大对象及其生命周期 + +``` + ┌──────────┐ + │ 信号Signal │ + └────┬─────┘ + │ 评估分流 + ▼ +┌──────────┐ ┌──────────┐ ┌──────────┐ +│ 候选股 │ → │ 自选股 │ → │ 持仓股 │ +│ (watching)│ │ (watchlist)│ │ (holdings)│ +└──────────┘ └────┬─────┘ └────┬─────┘ + │ │ + ▼ ▼ + ┌──────────┐ ┌──────────┐ + │ 策略 │ ← │ 建议 │ + │ (strategy)│ │ (advice) │ + └────┬─────┘ └────┬─────┘ + │ │ + ▼ ▼ + ┌──────────┐ ┌──────────┐ + │ 评估结果 │ │ 执行结果 │ + │ (evaluation)│ │ (result) │ + └──────────┘ └──────────┘ + ↘ ↙ + ┌──────────┐ + │ 反馈修正 │ + │ (feedback)│ + └──────────┘ +``` + +--- + +## 二、对象一:信号(Signal) + +### 定义 +xiaoguo_scanner 或 trend_detector 产出的原始信号,表示一只股票在某方面有异常。 + +### 状态流转 +``` +source写入(signal_news表) + │ + ▼ + ┌──────┐ + │ 未处理 │ ←─ source='xiaoguo' 或 'xiaoguo_risk' 或 'trend' + └──┬───┘ + │ 知微(盯盘cron)读取并评估 + ├──────────────────────────────────────┐ + ▼ ▼ + ┌──────┐ ┌──────┐ + │ 已采纳 │ │ 已忽略 │ + │ → 入自选│ │ → 跳过 │ + └──────┘ └──────┘ +``` + +### 处理流程 +1. **写入**:xiaoguo_scanner(每5min) / trend_detector(每25min) → INSERT INTO signal_news +2. **读取**:盯盘cron(每15-25min) → SELECT FROM signal_news WHERE source LIKE 'xiaoguo%' ORDER BY id DESC +3. **评估**:五维全面分析(大盘→行业→个股,消息+基本面+技术面) +4. **分流**: + - 采纳 → 加入自选(watchlist) + 生成策略(decisions.json) + - 关注 → 加入关注列表(watchlist status=watching) + - 忽略 → 不处理 + +### 当前缺口 +- [x] signal_news 缺 processed 标记 → 已修复(6/22): 加processed列,cron处理完后UPDATE标记 +- [x] xiaoguo_risk 信号已接入(cron prompt处理) + +### 修复方案 +为 signal_news 表新增 `processed` 字段(0=未处理, 1=已处理),cron处理完后 UPDATE 标记。 + +--- + +## 三、对象二:股票(Stock) + +### 定义 +系统中出现的任何股票。按参与深度分四级。 + +### 状态流转 +``` + 发现(信号来) + │ + ▼ +┌──────────┐ +│ 关注中 │ status=watching | watchlist.json +│ (watching)│ 有价钱监控,无正式策略 +└────┬─────┘ + │ 条件触发:>3%波动 / 有新闻 / 价格入区 + ▼ +┌──────────┐ +│ 正式自选 │ status=默认 | watchlist.json + decisions.json +│ (watchlist)│ 有完整策略(买入区/止损/止盈) +└────┬─────┘ + │ 用户买入执行 + ▼ +┌──────────┐ +│ 持仓 │ holdings表 + decisions.json(type=持仓策略) +│ (holdings)│ 有成本+仓位+策略,全过程监控 +└────┬─────┘ + │ 清仓/卖出 + ▼ +┌──────────┐ +│ 已关闭 │ status=closed | decisions.json保留但隐藏 +│ (closed) │ 历史记录不删除,前端不展示 +└──────────┘ +``` + +### 参与流程 +- 关注中 → price_monitor覆盖(每2min刷新价钱) +- 正式自选 → price_monitor + multi_tf_cache(每天9:00) + stale_detector + 策略重评(9:00/12:00) + 盯盘cron +- 持仓 → 全部上述 + 止损/止盈监控 + 组合分析 + +--- + +## 四、对象三:策略(Strategy) + +### 定义 +一个股票的操作规则,包含买入区/止损/止盈/仓位。 + +### 状态流转 +``` + 创建评估 + │ + ▼ +┌──────┐ +│ 新建 │ 首次生成策略 +└──┬───┘ + │ 写入decisions.json生效 + ▼ +┌──────┐ +│active│ 正常运行中 +└──┬───┘ + │ 超过14天未更新 / 价格偏离买入区>20% + ▼ +┌──────┐ +│stale │ 标记需要重评 +└──┬───┘ + │ stale_detector发现 + 触发重评 + ▼ +┌──────┐ +│ 重评 │ regenerate_all() / per_stock_reassess() +└──┬───┘ + │ + ├── 参数更新 → active(新版本) + └── 清仓 → closed(停止监控) +``` + +### 触发重评的条件(三线) +1. **价格偏离**:超买入区上沿>20%轻度 / >35%严重 +2. **时间过期**:>14天未更新 +3. **事件触发**:财报/板块政策/大盘系统性风险 + +### 评估反馈 +每次重评对比旧策略: +- 旧止损/止盈是否正确? +- 哪些判断对了?哪些错了? +- 记入 changelog 供下次参考 + +--- + +## 五、对象四:建议(Advice) + +### 定义 +知微给出的具体操作指令,"现价XX买入XX股"、"止损设XX"等。 + +### 状态流转 +``` + 知微生成建议 + │ + ▼ +┌──────┐ +│pending│ /api/advice/record → decisions.json advice_timeline +└──┬───┘ + │ + ├── 老爸执行操作 → executed(+结果) → 闭环完成 + ├── 老爸确认看到 → confirmed + └── 无效/过时 → ignored +``` + +### 闭环要求 +- ✅ pending → 生成时记录 +- ✅ executed → 支持标记(已修复 6/22) +- ✅ result字段 → 支持记录结果 +- ❌ 自动化闭环缺失:没有机制在操作执行后自动关联到对应建议 + +### 评估反馈 +- 建议执行后,对比执行结果与建议预期 +- 准确率统计存 accuracy_stats 表 +- 每周建议对账:advice_reconciliation.py + +--- + +## 六、对象五:评估(Evaluation) + +### 定义 +对策略执行情况的定期检查结论。这是"自我提升"的核心。 + +### 双维度评估框架 +``` + 阶段一(理论维度):策略规划是否正确? + ├─ 当初的买入区/止损/止盈设置是否合理? + ├─ 基于当时的数据,判断逻辑是否有问题? + └─ 输出:策略本身的质量评分 + + 阶段二(实际维度):执行结果如何? + ├─ 策略执行后股价走势是否符合预期? + ├─ 止损/止盈是否被触发?触发了结果如何? + └─ 输出:执行效果评分 +``` + +### 评估频率 +- 每日21:00 → 策略评估-每日 cron(六维评估) +- 每周21:00周六 → 策略评估-每周 cron(双维度全面评估) +- 每周20:00周六 → 建议对账-每周 cron(advice准确率) + +### 反馈修正流 +``` +评估结果 + ↓ +发现策略偏差 → 记入 knowledge-log + ↓ +修正策略参数 → 触发重评 + ↓ +新策略上线 → 加入监控 + ↓ +下一轮评估验证修正效果 +``` + +--- + +## 七、核心:自我提升循环 + +### 循环结构 +``` + ┌────────────┐ + │ 产生信号/数据 │ + └─────┬──────┘ + │ + ▼ + ┌────────────┐ + │ 知微分析评估 │ + └─────┬──────┘ + │ + ┌─────┴──────┐ + │ │ + ▼ ▼ + ┌────────┐ ┌────────┐ + │ 执行操作 │ │ 记录结论 │ + └────┬───┘ └────┬───┘ + │ │ + └─────┬──────┘ + ▼ + ┌────────────┐ + │ 对比预期结果 │ ← 实际走势 vs 当初判断 + └─────┬──────┘ + │ + ┌─────┴──────┐ + │ │ + ▼ ▼ + ┌────────┐ ┌────────┐ + │ 对了→固化 │ │ 错了→修正 │ + │ 记入知识库 │ │ 调策略/规则 │ + └────────┘ └────────┘ + │ + ▼ + ┌────────────┐ + │ 下一轮验证 │ ← 回到顶部 + └────────────┘ +``` + +### 落地手段 +| 环节 | 机制 | 频率 | +|------|------|------| +| 产生信号 | xiaoguo_scanner / trend_detector | 5-25min | +| 分析评估 | 盯盘cron / 策略评估cron | 15min-每日 | +| 执行操作 | 老爸手动 / advice_timeline记录 | 按需 | +| 对比结果 | advice_reconciliation / 策略评估 | 每周 | +| 知识萃取 | 知识萃取cron + knowledge-log | 每日16:30 | +| **全局审计** | **system_audit.py + 审计cron** | **每日17:30** | +| 修正迭代 | stale_detector + regenerate_all | 每日9:00/12:00 | + +--- + +## 八、当前缺口与修复清单 + +### 信号层 +- [ ] signal_news 缺 processed 标记 → 知微处理完的信号下次不重复读 +- [ ] xiaoguo_risk 信号目前无人处理(盯盘cron只看持仓止损,不读xiaoguo_risk) + +### 股票层 +- [ ] 关注→正式升级的触发机制不够自动化(依赖cron LLM判断,无硬性触发器) +- [ ] 已关闭股票不会主动从 watchlist 移除,只标记 status=closed + +### 策略层 +- [x] stale_detector 已实现(价格偏离+时间过期) +- [x] per_stock_reassess 已实现(盘中触发) +- [ ] 策略版本对比未自动记录到 changelog(手动的有,自动的无) + +### 建议层 +- [x] /api/advice/record 去重(6/22修复) +- [x] /api/advice/confirm 支持executed(6/22修复) +- [ ] 建议执行后自动回写result(需对接用户交易数据) + +### 反馈层 +- [x] 知识萃取cron已运行(每日16:30) +- [ ] 知识萃取结果自动触发系统修改(目前只记录不改) +- [x] 建议对账每周跑(advice_reconciliation.py) diff --git a/docs/market-screening-pipeline.md b/docs/market-screening-pipeline.md index 5cbb64b..5c7d470 100644 --- a/docs/market-screening-pipeline.md +++ b/docs/market-screening-pipeline.md @@ -1,251 +1,251 @@ -# 全市场潜力股挖掘系统 - -## 概述 - -全自动管道:盘中每15分钟采集全市场数据 → 检测异动 → 搜新闻分析 → 我判断 → 出推荐。 - -所有数据存入 `mofin.db`(SQLite),统一供 Dashboard 市场模块展示。 - ---- - -## 一、时序总览 - -``` -交易日,每15分钟一轮,覆盖沪深A股+港股 -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -上午: - 9:25 采集链(75秒)+ 我判断 + 推报告 ← A股集合竞价完毕+港股已交易1.5h - 9:40 - 9:55 -10:10 -10:25 -10:40 -10:55 -11:10 -11:25 -11:40 ⚡ A股休市,港股交易中 -11:55 ⚡ 同上 - -下午: -13:05 -13:20 -13:35 -13:50 -14:05 -14:20 -14:35 -14:50 -15:05 -15:20 -15:35 -15:50 ← 最后一轮(港股收市前10分钟) - -每天21轮。12:10-12:55午休跳过。 -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -每轮流程(全部在一个cron内完成,~2-3分钟): - ① market_watch → 拉90个行业板块数据 - ② trend_detector → SQL检测17种信号 - ③ mofin_news → 搜新闻(原文入库) - ④ 我(知微)→ 判断信号 → 更新候选池 → 推报告/紧急消息 -``` - ---- - -## 二、数据采集(:43,no_agent) - -### market_watch.py - -拉同花顺90个行业板块,写入 `mofin.db`: - -**market_snapshots**(每次一条): -| 字段 | 说明 | -|------|------| -| timestamp | 采集时间 | -| source | ths / eastmoney | -| up_ratio | 上涨板块占比(%) | -| mood | bullish / neutral / bearish | - -**sector_snapshots**(每条一个板块,关联 snapshot_id): -| 字段 | 说明 | -|------|------| -| name | 板块名,如"半导体" | -| change_pct | 涨跌幅(%) | -| up_count / down_count | 上涨/下跌家数 | -| net_inflow | 资金净流入(亿) | -| lead_stock | 领涨股名 | -| lead_stock_change | 领涨股涨跌幅 | - ---- - -## 三、趋势检测(:45,no_agent) - -### trend_detector.py - -读取最新 snapshot,检测17种信号,写入 `sector_signals` 表。 - -按5类维度划分: - -**A. 资金流信号** - -| 信号 | 逻辑 | 严重性 | -|------|------|--------| -| A1 资金异动 | 单次净流入/出 > 近10次均值 + 3σ | high(>5σ) / medium(3-5σ) | -| A2 持续资金流入 | 连续≥3次净流入且逐次递增 | low | -| A3 持续资金流出 | 连续≥3次净流出且逐次扩大 | low | -| A4 资金转向 | 净流入从正转负或负转正 | medium | - -**B. 涨跌结构信号** - -| 信号 | 逻辑 | 严重性 | -|------|------|--------| -| B1 涨跌比反转 | 上涨占比变化 > 30个百分点 | medium | -| B2 持续走强 | 连续≥3次涨幅排全市场前10 | low | -| B3 持续走弱 | 连续≥3次跌幅排全市场前10 | low | -| B4 普涨背离 | 涨 > 3% 但上涨家数 < 50% | medium | -| B5 极端分化 | 涨跌家数比 > 5:1 或 < 1:5 | medium | - -**C. 领涨/成分股信号** - -| 信号 | 逻辑 | 严重性 | -|------|------|--------| -| C1 领涨股更替 | 领涨股与前2次采集不同 | medium | -| C2 领涨股极端涨幅 | 领涨股单次涨跌幅 > 15% | medium | - -**D. 趋势拐点信号** - -| 信号 | 逻辑 | 严重性 | -|------|------|--------| -| D1 趋势反转(多→空) | 连续≥3次净流入后突然转流出 | high | -| D2 趋势反转(空→多) | 连续≥3次净流出后突然转入流 | high | -| D3 量价背离(涨) | 涨 > 2% 且资金净流出 > 均值2倍 | medium | -| D4 量价背离(跌) | 跌 > 2% 且资金净流入 > 均值2倍 | medium | - -**E. 关联信号** - -| 信号 | 逻辑 | 严重性 | -|------|------|--------| -| E1 板块轮动 | 前次TOP3全部跌出前10 | medium | -| E2 产业链联动 | 同产业链多板块同时触发A/B/D类 | low | -| E3 持仓关联 | 持仓股所在板块触发任何high信号 | high | - -写入 `sector_signals` 时附带: -- related_stocks — 该板块的领涨股 + 成分股(从 stock_sectors 查) -- holdings_in_sector — 该板块中的持仓股(查 holdings 表) -- watchlist_in_sector — 该板块中的自选股(查 watchlist_stocks 表) - ---- - -## 四、新闻采集(:48,no_agent) - -### mofin_news.py - -读取未处理 signal(每次1条),用 akshare 搜新闻: -- 搜索范围:领涨股 + 成分股 + 持仓股 + 自选股 -- 去重后取前5篇,含标题 + 正文全文 -- 写入 signal_news,标记「待知微判断」 - -**不做情感分析,不调LLM。** 新闻分析由知微在下一轮cron中完成。 - -| 字段 | 说明 | -|------|------| -| signal_id | 关联 sector_signals | -| overall_sentiment | 总体情感(利好/利空/中性) | -| summary | 汇总摘要 | -| key_articles | JSON [{title, sentiment, summary}] | -| searched_stocks | 本次搜了哪些股票 | - -**节流规则:** 同一板块同一signal类型24小时内已有 → 跳过。无未处理 signals → 本轮跳过。 - ---- - -## 五、知微判断与决策(:00/:15/:30/:45,LLM cron) - -盯盘 cron prompt 中包含信号处理逻辑。 - -### 5.1 处理流程 - -``` -进入盯盘 cron 后: -──────────────────────────────────────── -1. 读最近15分钟的 signal_news(高严重性优先) - │ -2. 逐条判断: - │ - ├── severity=high 且 sentiment=利空 - │ → 检查持仓中是否有该板块个股 - │ → 有 → 推老爸(风险预警) - │ → 无 → 记入待观察 - │ - ├── severity=high 且 sentiment=利好 且置信 - │ → 查腾讯API实时价 - │ → 判断入场条件是否成熟(现价在合理区间) - │ ├── 可操作 → 给星级+策略 → 插入candidates - │ │ → 同时加入 watchlist_stocks 表(自动入自选) - │ │ → 推老爸(今日推荐) - │ └── 需等待 → 标记待观察,记录入场条件 - │ - └── severity=medium/low - → 累积,收盘汇总 - │ -3. 照常做持仓/自选盯盘输出 - 如果本轮有紧急推荐,单独推一条消息;盯盘报告里不加额外篇幅 -``` - -### 5.2 推送给老爸的规则 - -只在以下情况才推: - -| 情况 | 推送内容 | 渠道 | -|------|---------|------| -| 持仓股板块出现利空 | 风险预警+建议操作 | 立即推 | -| 发现高置信潜力股,现价在买入区内 | 推荐+星级+入场策略 | 立即推 | -| 常规盯盘报告 | 三段式600字以内 | 定时走cron | - -### 5.3 自动加入自选 - -当确认一只新的潜力股(不在持仓且不在自选)时: -- 写入 candidates 表 -- 同时 INSERT INTO watchlist_stocks -- 这样 Dashboard 自选模块和策略引擎都能看到 - ---- - -## 六、收盘后处理(16:00,LLM cron) - -盘中每轮已经完成了判断和推送。16:00额外一轮主要是做**知识萃取**: -- 回顾当日所有 signals + 判断记录 -- 提炼可复用的判断经验 → 写入 analyst-knowledge-log.md -- 供后续分析参考 - ---- - -## 七、数据库表 - -### 市场信号相关表 - -| 表 | 用途 | 关键字段 | -|----|------|---------| -| market_snapshots | 每次采集元信息 | id, timestamp, up_ratio, mood | -| sector_snapshots | 板块快照 | snapshot_id, name, change_pct, net_inflow | -| sector_signals | 检测到的异常信号 | type, sector, severity, related_stocks, processed | -| signal_news | 小果情报分析 | signal_id, overall_sentiment, summary, key_articles | -| candidates | 候选池 | code, zhiwei_star, promoted, dropped | -| candidate_score_history | 评分变更历史 | code, score, source, created_at | - -### 自选自动写入 - -新确认的潜力股自动写入 `watchlist_stocks` 表,Dashboard 自选模块即时可见。 - ---- - -## 八、Dashboard 市场模块展示 - -mofin.db 中的所有数据直接在 Dashboard 上展示: - -| Dashboard 页面 | 数据源 | 刷新频率 | -|---------------|--------|---------| -| 行业热点 | market_snapshots + sector_snapshots 最新一次 | 每15分 | -| 知微洞察 | signal_news(当日汇总) | 每15分 | -| 潜力股挖掘 | candidates(zhiwei_star 非空) | 实时 | -| 自选股 | watchlist_stocks | 实时 | +# 全市场潜力股挖掘系统 + +## 概述 + +全自动管道:盘中每15分钟采集全市场数据 → 检测异动 → 搜新闻分析 → 我判断 → 出推荐。 + +所有数据存入 `mofin.db`(SQLite),统一供 Dashboard 市场模块展示。 + +--- + +## 一、时序总览 + +``` +交易日,每15分钟一轮,覆盖沪深A股+港股 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +上午: + 9:25 采集链(75秒)+ 我判断 + 推报告 ← A股集合竞价完毕+港股已交易1.5h + 9:40 + 9:55 +10:10 +10:25 +10:40 +10:55 +11:10 +11:25 +11:40 ⚡ A股休市,港股交易中 +11:55 ⚡ 同上 + +下午: +13:05 +13:20 +13:35 +13:50 +14:05 +14:20 +14:35 +14:50 +15:05 +15:20 +15:35 +15:50 ← 最后一轮(港股收市前10分钟) + +每天21轮。12:10-12:55午休跳过。 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +每轮流程(全部在一个cron内完成,~2-3分钟): + ① market_watch → 拉90个行业板块数据 + ② trend_detector → SQL检测17种信号 + ③ mofin_news → 搜新闻(原文入库) + ④ 我(知微)→ 判断信号 → 更新候选池 → 推报告/紧急消息 +``` + +--- + +## 二、数据采集(:43,no_agent) + +### market_watch.py + +拉同花顺90个行业板块,写入 `mofin.db`: + +**market_snapshots**(每次一条): +| 字段 | 说明 | +|------|------| +| timestamp | 采集时间 | +| source | ths / eastmoney | +| up_ratio | 上涨板块占比(%) | +| mood | bullish / neutral / bearish | + +**sector_snapshots**(每条一个板块,关联 snapshot_id): +| 字段 | 说明 | +|------|------| +| name | 板块名,如"半导体" | +| change_pct | 涨跌幅(%) | +| up_count / down_count | 上涨/下跌家数 | +| net_inflow | 资金净流入(亿) | +| lead_stock | 领涨股名 | +| lead_stock_change | 领涨股涨跌幅 | + +--- + +## 三、趋势检测(:45,no_agent) + +### trend_detector.py + +读取最新 snapshot,检测17种信号,写入 `sector_signals` 表。 + +按5类维度划分: + +**A. 资金流信号** + +| 信号 | 逻辑 | 严重性 | +|------|------|--------| +| A1 资金异动 | 单次净流入/出 > 近10次均值 + 3σ | high(>5σ) / medium(3-5σ) | +| A2 持续资金流入 | 连续≥3次净流入且逐次递增 | low | +| A3 持续资金流出 | 连续≥3次净流出且逐次扩大 | low | +| A4 资金转向 | 净流入从正转负或负转正 | medium | + +**B. 涨跌结构信号** + +| 信号 | 逻辑 | 严重性 | +|------|------|--------| +| B1 涨跌比反转 | 上涨占比变化 > 30个百分点 | medium | +| B2 持续走强 | 连续≥3次涨幅排全市场前10 | low | +| B3 持续走弱 | 连续≥3次跌幅排全市场前10 | low | +| B4 普涨背离 | 涨 > 3% 但上涨家数 < 50% | medium | +| B5 极端分化 | 涨跌家数比 > 5:1 或 < 1:5 | medium | + +**C. 领涨/成分股信号** + +| 信号 | 逻辑 | 严重性 | +|------|------|--------| +| C1 领涨股更替 | 领涨股与前2次采集不同 | medium | +| C2 领涨股极端涨幅 | 领涨股单次涨跌幅 > 15% | medium | + +**D. 趋势拐点信号** + +| 信号 | 逻辑 | 严重性 | +|------|------|--------| +| D1 趋势反转(多→空) | 连续≥3次净流入后突然转流出 | high | +| D2 趋势反转(空→多) | 连续≥3次净流出后突然转入流 | high | +| D3 量价背离(涨) | 涨 > 2% 且资金净流出 > 均值2倍 | medium | +| D4 量价背离(跌) | 跌 > 2% 且资金净流入 > 均值2倍 | medium | + +**E. 关联信号** + +| 信号 | 逻辑 | 严重性 | +|------|------|--------| +| E1 板块轮动 | 前次TOP3全部跌出前10 | medium | +| E2 产业链联动 | 同产业链多板块同时触发A/B/D类 | low | +| E3 持仓关联 | 持仓股所在板块触发任何high信号 | high | + +写入 `sector_signals` 时附带: +- related_stocks — 该板块的领涨股 + 成分股(从 stock_sectors 查) +- holdings_in_sector — 该板块中的持仓股(查 holdings 表) +- watchlist_in_sector — 该板块中的自选股(查 watchlist_stocks 表) + +--- + +## 四、新闻采集(:48,no_agent) + +### mofin_news.py + +读取未处理 signal(每次1条),用 akshare 搜新闻: +- 搜索范围:领涨股 + 成分股 + 持仓股 + 自选股 +- 去重后取前5篇,含标题 + 正文全文 +- 写入 signal_news,标记「待知微判断」 + +**不做情感分析,不调LLM。** 新闻分析由知微在下一轮cron中完成。 + +| 字段 | 说明 | +|------|------| +| signal_id | 关联 sector_signals | +| overall_sentiment | 总体情感(利好/利空/中性) | +| summary | 汇总摘要 | +| key_articles | JSON [{title, sentiment, summary}] | +| searched_stocks | 本次搜了哪些股票 | + +**节流规则:** 同一板块同一signal类型24小时内已有 → 跳过。无未处理 signals → 本轮跳过。 + +--- + +## 五、知微判断与决策(:00/:15/:30/:45,LLM cron) + +盯盘 cron prompt 中包含信号处理逻辑。 + +### 5.1 处理流程 + +``` +进入盯盘 cron 后: +──────────────────────────────────────── +1. 读最近15分钟的 signal_news(高严重性优先) + │ +2. 逐条判断: + │ + ├── severity=high 且 sentiment=利空 + │ → 检查持仓中是否有该板块个股 + │ → 有 → 推老爸(风险预警) + │ → 无 → 记入待观察 + │ + ├── severity=high 且 sentiment=利好 且置信 + │ → 查腾讯API实时价 + │ → 判断入场条件是否成熟(现价在合理区间) + │ ├── 可操作 → 给星级+策略 → 插入candidates + │ │ → 同时加入 watchlist_stocks 表(自动入自选) + │ │ → 推老爸(今日推荐) + │ └── 需等待 → 标记待观察,记录入场条件 + │ + └── severity=medium/low + → 累积,收盘汇总 + │ +3. 照常做持仓/自选盯盘输出 + 如果本轮有紧急推荐,单独推一条消息;盯盘报告里不加额外篇幅 +``` + +### 5.2 推送给老爸的规则 + +只在以下情况才推: + +| 情况 | 推送内容 | 渠道 | +|------|---------|------| +| 持仓股板块出现利空 | 风险预警+建议操作 | 立即推 | +| 发现高置信潜力股,现价在买入区内 | 推荐+星级+入场策略 | 立即推 | +| 常规盯盘报告 | 三段式600字以内 | 定时走cron | + +### 5.3 自动加入自选 + +当确认一只新的潜力股(不在持仓且不在自选)时: +- 写入 candidates 表 +- 同时 INSERT INTO watchlist_stocks +- 这样 Dashboard 自选模块和策略引擎都能看到 + +--- + +## 六、收盘后处理(16:00,LLM cron) + +盘中每轮已经完成了判断和推送。16:00额外一轮主要是做**知识萃取**: +- 回顾当日所有 signals + 判断记录 +- 提炼可复用的判断经验 → 写入 analyst-knowledge-log.md +- 供后续分析参考 + +--- + +## 七、数据库表 + +### 市场信号相关表 + +| 表 | 用途 | 关键字段 | +|----|------|---------| +| market_snapshots | 每次采集元信息 | id, timestamp, up_ratio, mood | +| sector_snapshots | 板块快照 | snapshot_id, name, change_pct, net_inflow | +| sector_signals | 检测到的异常信号 | type, sector, severity, related_stocks, processed | +| signal_news | 小果情报分析 | signal_id, overall_sentiment, summary, key_articles | +| candidates | 候选池 | code, zhiwei_star, promoted, dropped | +| candidate_score_history | 评分变更历史 | code, score, source, created_at | + +### 自选自动写入 + +新确认的潜力股自动写入 `watchlist_stocks` 表,Dashboard 自选模块即时可见。 + +--- + +## 八、Dashboard 市场模块展示 + +mofin.db 中的所有数据直接在 Dashboard 上展示: + +| Dashboard 页面 | 数据源 | 刷新频率 | +|---------------|--------|---------| +| 行业热点 | market_snapshots + sector_snapshots 最新一次 | 每15分 | +| 知微洞察 | signal_news(当日汇总) | 每15分 | +| 潜力股挖掘 | candidates(zhiwei_star 非空) | 实时 | +| 自选股 | watchlist_stocks | 实时 | diff --git a/docs/morning-health-check.md b/docs/morning-health-check.md index a8c2378..304ff8b 100644 --- a/docs/morning-health-check.md +++ b/docs/morning-health-check.md @@ -1,119 +1,119 @@ ---- -name: morning-health-check -title: MoFin 系统常规体检机制 -description: 每日开盘前8:00全面扫荡式系统体检,含分层分类检查清单、自动发现新增组件、问题推送 -trigger: 交易日 8:00 AM 自动运行 ---- - -# MoFin 系统常规体检机制 - -## 设计目的 - -"人的常规体检,不是因为发现问题去针对性检查,而是定期的、全面的、扫荡式的检查。" - -核心机制: -1. **health_checklist.json** — 可动态维护的检查清单(新增功能自动加入) -2. **morning_health_check.py** — 每日8:00开盘前运行,逐项比对 -3. **self_discovery()** — 自动发现新增cron任务并追加到检查清单 -4. **历史追踪** — health_check_history.json 保留90天体检记录 - -## 架构 - -```python -morning_health_check.py (no_agent, 8:00 Cron) - │ - ├── 读 health_checklist.json (检查清单) - │ - ├── 分层检查 (8层) - │ ├── 基础设施 — XMPP/Gateway/Dashboard/API/磁盘 - │ ├── SENSE — price_monitor/xiaoguo/宏观/汇率/板块 - │ ├── RESPOND — 推送cron/价格事件/信号积压 - │ ├── ADAPT — 策略重评/策略树/时效性 - │ ├── IMPROVE — 知识萃取/硬编码/审计/剪枝/元成长 - │ ├── 数据文件 — 全部关键JSON/DB文件新鲜度 - │ ├── 管道完整性 — cron异常/误暂停/delivery目标/信号桥/cron全局审计 - │ └── 元自检 — 昨日体检完成/checklist覆盖/cron调度 - │ - ├── self_discovery() — 自动发现新组件 - │ └── 对比jobs.json vs checklist中的cron ID - │ └── 发现新cron → 自动追加到pipeline类 - │ - └── 输出 (no_agent规则) - ├── 有异常 → 打印详细报告 (推送给老爸) - └── 正常 → [SILENT] -``` - -## 检查清单 (health_checklist.json) - -位于 `/home/hmo/MoFin/data/health_checklist.json` - -累计8类48项检查。项目定期检查:盘中自检每15分钟,每日早检8:00,每周深度审计。 - -检查清单位于 `/home/hmo/MoFin/data/health_checklist.json` -- id/description: 唯一标识和描述 -- check: 检查指令 (如 `cron:job_id`, `systemctl:service`, `port:8643`, `db:table:field::today:1`) -- expected: 期望值 -- severity: critical/high/medium/low - -## 自维护机制 - -### 自动发现 (self_discovery) -每次运行体检时,脚本自动: -1. 读取 Hermes cron 的 jobs.json -2. 对比 checklist 中已登记的 cron ID -3. 发现新 cron 任务 → 自动追加到 pipeline 分类(标记 auto_discovered=true) - -### 手动维护 -- 新功能加入系统后,应在 checklist 中追加相应检查项 -- 修改现有组件后,审视是否需要调整已有检查项的阈值/预期值 - -## 检查器类型 - -| 类型 | 格式 | 说明 | -|------|------|------| -| systemctl | `systemctl:service_name` | 检查systemd服务 | -| port | `port:8888` | 端口监听检查 | -| proc | `proc:pattern` | pgrep进程匹配 | -| http | `http:url` | HTTP GET可达性 | -| disk | `disk:/` | 磁盘使用率 | -| fileexists | `fileexists:/path` | 文件是否存在 | -| filefresh | `filefresh:/path:24h` | 文件新鲜度 | -| db | `db:table:field::today:1` | 数据库记录数 | -| cron | `cron:job_id` | Cron任务状态 | -| cron_errors | `cron_errors:last24h` | 全局cron异常 | -| cron_paused | `cron_paused:check` | 误暂停检查 | -| delivery | `delivery:origin_targets` | 推送目标检查 | -| pipeline | `pipeline:xiaoguo_signal_flow` | 综合管道检查 | - -## 触发方式 - -- **自动**: cron `0 8 * * 1-5` (交易日8:00, no_agent模式) -- **手动**: `python3 /home/hmo/MoFin/scripts/morning_health_check.py --report` -- **更新清单**: `python3 /home/hmo/MoFin/scripts/morning_health_check.py --update-checklist` - -## 输出格式 - -``` -MoFin 系统体检 | 2026-06-25 周四 | 08:00 -──────────────────────────────────────── -【基础设施层】 -✅ 知微 XMPP Bot: active -❌ 小果 LLM API: timeout - -... (只输出有问题的分类;正常分类仅在 --report 时显示) - -【管道完整性】 -🔴 无异常cron状态(最近24h): 1 errors: 小果独立扫描(error) - -──────────────────────────────────────── -总计: 🔴1严重 | ❌2错误 | ⚠️0警告 | ✅40正常 (15s) - -需立即处理的问题: - [ERROR] SENSE: 小果扫描 cron 已调度: status=error -``` - -## 历史记录 - -保存在 `/home/hmo/MoFin/data/health_check_history.json` -- 每次运行记录时间戳、各等级计数、耗时 -- 保留最近90条(约3个月) +--- +name: morning-health-check +title: MoFin 系统常规体检机制 +description: 每日开盘前8:00全面扫荡式系统体检,含分层分类检查清单、自动发现新增组件、问题推送 +trigger: 交易日 8:00 AM 自动运行 +--- + +# MoFin 系统常规体检机制 + +## 设计目的 + +"人的常规体检,不是因为发现问题去针对性检查,而是定期的、全面的、扫荡式的检查。" + +核心机制: +1. **health_checklist.json** — 可动态维护的检查清单(新增功能自动加入) +2. **morning_health_check.py** — 每日8:00开盘前运行,逐项比对 +3. **self_discovery()** — 自动发现新增cron任务并追加到检查清单 +4. **历史追踪** — health_check_history.json 保留90天体检记录 + +## 架构 + +```python +morning_health_check.py (no_agent, 8:00 Cron) + │ + ├── 读 health_checklist.json (检查清单) + │ + ├── 分层检查 (8层) + │ ├── 基础设施 — XMPP/Gateway/Dashboard/API/磁盘 + │ ├── SENSE — price_monitor/xiaoguo/宏观/汇率/板块 + │ ├── RESPOND — 推送cron/价格事件/信号积压 + │ ├── ADAPT — 策略重评/策略树/时效性 + │ ├── IMPROVE — 知识萃取/硬编码/审计/剪枝/元成长 + │ ├── 数据文件 — 全部关键JSON/DB文件新鲜度 + │ ├── 管道完整性 — cron异常/误暂停/delivery目标/信号桥/cron全局审计 + │ └── 元自检 — 昨日体检完成/checklist覆盖/cron调度 + │ + ├── self_discovery() — 自动发现新组件 + │ └── 对比jobs.json vs checklist中的cron ID + │ └── 发现新cron → 自动追加到pipeline类 + │ + └── 输出 (no_agent规则) + ├── 有异常 → 打印详细报告 (推送给老爸) + └── 正常 → [SILENT] +``` + +## 检查清单 (health_checklist.json) + +位于 `/home/hmo/MoFin/data/health_checklist.json` + +累计8类48项检查。项目定期检查:盘中自检每15分钟,每日早检8:00,每周深度审计。 + +检查清单位于 `/home/hmo/MoFin/data/health_checklist.json` +- id/description: 唯一标识和描述 +- check: 检查指令 (如 `cron:job_id`, `systemctl:service`, `port:8643`, `db:table:field::today:1`) +- expected: 期望值 +- severity: critical/high/medium/low + +## 自维护机制 + +### 自动发现 (self_discovery) +每次运行体检时,脚本自动: +1. 读取 Hermes cron 的 jobs.json +2. 对比 checklist 中已登记的 cron ID +3. 发现新 cron 任务 → 自动追加到 pipeline 分类(标记 auto_discovered=true) + +### 手动维护 +- 新功能加入系统后,应在 checklist 中追加相应检查项 +- 修改现有组件后,审视是否需要调整已有检查项的阈值/预期值 + +## 检查器类型 + +| 类型 | 格式 | 说明 | +|------|------|------| +| systemctl | `systemctl:service_name` | 检查systemd服务 | +| port | `port:8888` | 端口监听检查 | +| proc | `proc:pattern` | pgrep进程匹配 | +| http | `http:url` | HTTP GET可达性 | +| disk | `disk:/` | 磁盘使用率 | +| fileexists | `fileexists:/path` | 文件是否存在 | +| filefresh | `filefresh:/path:24h` | 文件新鲜度 | +| db | `db:table:field::today:1` | 数据库记录数 | +| cron | `cron:job_id` | Cron任务状态 | +| cron_errors | `cron_errors:last24h` | 全局cron异常 | +| cron_paused | `cron_paused:check` | 误暂停检查 | +| delivery | `delivery:origin_targets` | 推送目标检查 | +| pipeline | `pipeline:xiaoguo_signal_flow` | 综合管道检查 | + +## 触发方式 + +- **自动**: cron `0 8 * * 1-5` (交易日8:00, no_agent模式) +- **手动**: `python3 /home/hmo/MoFin/scripts/morning_health_check.py --report` +- **更新清单**: `python3 /home/hmo/MoFin/scripts/morning_health_check.py --update-checklist` + +## 输出格式 + +``` +MoFin 系统体检 | 2026-06-25 周四 | 08:00 +──────────────────────────────────────── +【基础设施层】 +✅ 知微 XMPP Bot: active +❌ 小果 LLM API: timeout + +... (只输出有问题的分类;正常分类仅在 --report 时显示) + +【管道完整性】 +🔴 无异常cron状态(最近24h): 1 errors: 小果独立扫描(error) + +──────────────────────────────────────── +总计: 🔴1严重 | ❌2错误 | ⚠️0警告 | ✅40正常 (15s) + +需立即处理的问题: + [ERROR] SENSE: 小果扫描 cron 已调度: status=error +``` + +## 历史记录 + +保存在 `/home/hmo/MoFin/data/health_check_history.json` +- 每次运行记录时间戳、各等级计数、耗时 +- 保留最近90条(约3个月) diff --git a/docs/portfolio-data-model.md b/docs/portfolio-data-model.md index dcdc414..726bc62 100644 --- a/docs/portfolio-data-model.md +++ b/docs/portfolio-data-model.md @@ -1,114 +1,114 @@ -# MoFin 数据模型 - -> 数据已从 JSON 迁移到 SQLite。portfolio.json / decisions.json / watchlist.json 不再使用。 - -## 核心表 - -| 表 | 对应旧 JSON | 用途 | -|----|-----------|------| -| `holdings` + `portfolio_summary` | portfolio.json | 持仓 + 汇总 | -| `holding_strategies` | decisions.json | 策略/决策 | -| `watchlist_stocks` | watchlist.json | 自选股 | -| `live_prices` | live_prices.json | 实时价格快照 | -| `mtf_cache` | multi_tf_cache.json | 多周期缓存 | -| `market_snapshots` | market.json | 大盘数据 | -| `capital_flow_cache` | capital_flow_cache.json | 资金流缓存 | -| `cash_log` | 无 | 现金变更日志 | - -## 总资产公式 - -**总资产 = 持仓总市值(CNY) + 可用现金 + 冻结资金** - -`calc_total_assets()` (mo_models.py) 是唯一正确公式。 - -## 币种 - -### 个股层面 - -| 品种 | price | cost | currency | 说明 | -|------|-------|------|----------|------| -| 港股 | **HKD** | **HKD** | `HKD` | 跟股软显示一致,方便操作 | -| A股 | **CNY** | **CNY** | `CNY` | | - -技术位(stop_loss / take_profit / entry_low / entry_high)与 price 同币种。 - -### 汇总层面 - -`calc_total_mv()` / `calc_total_assets()` 汇总时自动将港股 HKD × `HK_RATE`(实时 API)转为 CNY。 - -```python -# 个股 P&L:港股用 HKD 算,A股用 CNY 算 -profit_pct = (price - cost) / cost * 100 # 同币种,无需转换 - -# 总资产:港股市值自动转 CNY -total_assets = calc_total_assets(pf) # 已处理 HKD→CNY -``` - -### 禁止 - -- ❌ 港股 price(HKD) 和 A 股 price(CNY) 直接比较/相加 -- ❌ 港股 cost(HKD) 和 CNY price 混算 P&L -- ❌ 硬编码汇率(`calc_total_mv` 内部调 `get_hk_rate()` 走实时 API) - -## 数据流 - -``` -price_monitor (cron: */2 9-16) - → 东财/腾讯拉价格 - → write_holdings_batch() → holdings 表 (price 更新) - → write_portfolio_summary() → portfolio_summary (total_mv/total_assets 重算) - -regenerate_all (cron: 手动/定时) - → batch_fetch_prices() → 从 DB 读价格 - → 技术分析 → 止损/止盈/买入区 - → write_holding_strategy() → holding_strategies 表 - -server.py API - → 写端点: _save_portfolio / _save_decision / _save_watchlist → DB - → 读端点: mo_data.read_*() → DB -``` - -## 现金 - -- `price_monitor` 只更新价格和汇总,不动现金 -- 现金变更通过截图导入 / holding.xls 导入 / 手动调整 -- `cash_log` 表记录每次变更(来源、before/after、备注) - -## 常见错误 - -### ❌ 港股价格转 CNY 再存 -```python -# WRONG — 港股个股存 CNY 后股软对不上 -if is_hk_stock(code): - price = price * HK_RATE - -# RIGHT — 存 HKD 原值,汇总时由 calc_total_assets 转 CNY -if is_hk_stock(code): - currency = 'HKD' -``` - -### ❌ 混币计算 -```python -# WRONG — price 是 HKD,cost 是 CNY,算出来没意义 -pnl = (price_hkd - cost_cny) / cost_cny - -# RIGHT — 同币种比较 -pnl = (price_hkd - cost_hkd) / cost_hkd -``` - -### ❌ 硬编码汇率 -```python -# WRONG -mv = shares * price * 0.87 - -# RIGHT — 用 calc_total_assets(内部调实时汇率) -mv = calc_total_mv(holdings) -``` - -## 版本 - -| 版本 | 日期 | 变更 | -|------|------|------| -| 3 | 2026-07-03 | JSON→DB 迁移完成。港股个股存 HKD,汇总时转 CNY。 | -| 2 | 2026-06-29 | 明确 cash/frozen_cash 字段含义 | -| 1 | - | 无规范 | +# MoFin 数据模型 + +> 数据已从 JSON 迁移到 SQLite。portfolio.json / decisions.json / watchlist.json 不再使用。 + +## 核心表 + +| 表 | 对应旧 JSON | 用途 | +|----|-----------|------| +| `holdings` + `portfolio_summary` | portfolio.json | 持仓 + 汇总 | +| `holding_strategies` | decisions.json | 策略/决策 | +| `watchlist_stocks` | watchlist.json | 自选股 | +| `live_prices` | live_prices.json | 实时价格快照 | +| `mtf_cache` | multi_tf_cache.json | 多周期缓存 | +| `market_snapshots` | market.json | 大盘数据 | +| `capital_flow_cache` | capital_flow_cache.json | 资金流缓存 | +| `cash_log` | 无 | 现金变更日志 | + +## 总资产公式 + +**总资产 = 持仓总市值(CNY) + 可用现金 + 冻结资金** + +`calc_total_assets()` (mo_models.py) 是唯一正确公式。 + +## 币种 + +### 个股层面 + +| 品种 | price | cost | currency | 说明 | +|------|-------|------|----------|------| +| 港股 | **HKD** | **HKD** | `HKD` | 跟股软显示一致,方便操作 | +| A股 | **CNY** | **CNY** | `CNY` | | + +技术位(stop_loss / take_profit / entry_low / entry_high)与 price 同币种。 + +### 汇总层面 + +`calc_total_mv()` / `calc_total_assets()` 汇总时自动将港股 HKD × `HK_RATE`(实时 API)转为 CNY。 + +```python +# 个股 P&L:港股用 HKD 算,A股用 CNY 算 +profit_pct = (price - cost) / cost * 100 # 同币种,无需转换 + +# 总资产:港股市值自动转 CNY +total_assets = calc_total_assets(pf) # 已处理 HKD→CNY +``` + +### 禁止 + +- ❌ 港股 price(HKD) 和 A 股 price(CNY) 直接比较/相加 +- ❌ 港股 cost(HKD) 和 CNY price 混算 P&L +- ❌ 硬编码汇率(`calc_total_mv` 内部调 `get_hk_rate()` 走实时 API) + +## 数据流 + +``` +price_monitor (cron: */2 9-16) + → 东财/腾讯拉价格 + → write_holdings_batch() → holdings 表 (price 更新) + → write_portfolio_summary() → portfolio_summary (total_mv/total_assets 重算) + +regenerate_all (cron: 手动/定时) + → batch_fetch_prices() → 从 DB 读价格 + → 技术分析 → 止损/止盈/买入区 + → write_holding_strategy() → holding_strategies 表 + +server.py API + → 写端点: _save_portfolio / _save_decision / _save_watchlist → DB + → 读端点: mo_data.read_*() → DB +``` + +## 现金 + +- `price_monitor` 只更新价格和汇总,不动现金 +- 现金变更通过截图导入 / holding.xls 导入 / 手动调整 +- `cash_log` 表记录每次变更(来源、before/after、备注) + +## 常见错误 + +### ❌ 港股价格转 CNY 再存 +```python +# WRONG — 港股个股存 CNY 后股软对不上 +if is_hk_stock(code): + price = price * HK_RATE + +# RIGHT — 存 HKD 原值,汇总时由 calc_total_assets 转 CNY +if is_hk_stock(code): + currency = 'HKD' +``` + +### ❌ 混币计算 +```python +# WRONG — price 是 HKD,cost 是 CNY,算出来没意义 +pnl = (price_hkd - cost_cny) / cost_cny + +# RIGHT — 同币种比较 +pnl = (price_hkd - cost_hkd) / cost_hkd +``` + +### ❌ 硬编码汇率 +```python +# WRONG +mv = shares * price * 0.87 + +# RIGHT — 用 calc_total_assets(内部调实时汇率) +mv = calc_total_mv(holdings) +``` + +## 版本 + +| 版本 | 日期 | 变更 | +|------|------|------| +| 3 | 2026-07-03 | JSON→DB 迁移完成。港股个股存 HKD,汇总时转 CNY。 | +| 2 | 2026-06-29 | 明确 cash/frozen_cash 字段含义 | +| 1 | - | 无规范 | diff --git a/docs/strategy-review-loop.md b/docs/strategy-review-loop.md index f840c8f..8d6400b 100644 --- a/docs/strategy-review-loop.md +++ b/docs/strategy-review-loop.md @@ -1,97 +1,97 @@ -# 策略复盘闭环系统设计 - -> 版本: v1 | 最后更新: 2026-06-24 -> 核心理念:每条策略建议都必须有回头检查,用实际结果驱动策略逻辑进化。 - -## 一、现状 - -| 环节 | 状态 | -|------|------| -| 策略生成 | ✅ `strategy_lifecycle.py` 按规则生成买入区/止损/止盈 | -| 策略评估 | ✅ 日评估六维分析每条策略的当前状况 | -| 策略重评 | ✅ 过期/偏离时自动触发重评 | -| **成功率追踪** | ❌ 有 `accuracy_stats` 空表,从未写入 | -| **复盘归因** | ❌ 没有"回头看"机制 | -| **策略逻辑修正** | ❌ 评估结果从不反馈到生成规则 | -| **验证测试** | ❌ 改完规则没有验证环节 | - -## 二、闭环设计 - -``` -生成策略 → 执行/等待 → 回头看(复盘) → 归因分析 → 修正策略逻辑 → 验证 → 部署 - ↑ | - └──── 迭代循环 ───────┘ -``` - -### 环节1:回头看(复盘) - -每条策略/建议在生成后 T+5、T+20、T+60 三个时间点回头检查: - -| 检查点 | 时机 | 判断标准 | -|--------|------|---------| -| T+5 | 5个交易日后 | 止损触发?止盈触发?价格走向是否正确? | -| T+20 | 一个月后 | 中期趋势验证。买入区是否有效? | -| T+60 | 三个月后 | 长期逻辑验证。大方向判断是否正确? | - -判断分类: -- ✅ **正确**:价格朝预期方向走了 > 止损/止盈间距的 50% -- ⚠️ **部分正确**:方向对了但幅度不够,或方向对但时机差 -- ❌ **错误**:方向错了,或止损被打后价格反转了 -- ⏳ **待定**:还在运行中,未到判断时点 - -### 环节2:归因分析 - -对 ❌ 错误 和 ⚠️ 部分正确 的做根因分类: - -| 失败模式 | 判断条件 | 修复方向 | -|----------|---------|---------| -| 止损过紧 | 价格跌破止损 < 3天后回到买入区 | 放宽止损到强支撑 × 0.95 | -| 入场过早 | 买入后继续跌 > 入场点 10% 才反弹 | 买入区下移,等缩量确认 | -| 止盈过近 | 价格突破止盈 < 5天后继续涨 > 15% | 止盈放到更高阻力位 | -| 方向看错 | 价格持续朝反方向走 | 检查多周期趋势判断逻辑 | -| 情景错配 | 策略假设的情景与实际不符 | 加入情景过滤条件 | -| 信号误判 | timing_signal 信号错误 | 修正信号合成逻辑 | -| 行业拖累 | 个股选对了但行业暴跌 | 加入行业动量过滤 | - -### 环节3:策略逻辑修正 - -归因结果反馈到策略生成规则的几个层面: - -1. **prompt_manager 规则更新** — 止损/止盈/买入区的生成规则 -2. **timing_signal 合成权重调整** — 各因子的权重 -3. **股票分类规则调整** — 什么情况归为弱势/深套/短炒 -4. **情景判定阈值调整** — detect_scenario 的参数 - -### 环节4:回测验证 - -修正后的规则用历史数据跑模拟,对比新旧规则的成功率: - -``` -模拟方式:取过去60天的数据 -1. 用旧规则生成每条策略 → 计算成功率 -2. 用新规则生成同样股票的策略 → 计算成功率 -3. 对比:新规则是否 > 旧规则 +5%? -4. 如果是 → 部署新规则 -5. 如果不是 → 继续调整 -``` - -## 三、参考来源 - -知识库中有多篇量化分析文章可以参考: -- 止损/止盈的统计学最优位置 -- 多因子信号合成的权重分配方法 -- 不同市场环境下的策略参数调优 -- 回测验证的方法论和陷阱(过拟合/幸存者偏差) - -## 四、实施路线 - -### Phase 1(本session) -- 策略复盘脚本:遍历 active 策略,检查实际结果,写入 accuracy_stats -- 归因分析:对失败策略分类失败模式 -- 初步报告:当前策略整体成功率 + 常见失败模式 - -### Phase 2(后续) -- 策略逻辑修正:根据归因调整 prompt_manager 规则 -- 回测验证:用历史数据验证新规则 -- 知识库文章萃取:从量化分析文章中提取可用因子 -- 持续迭代:每周跑一次复盘,持续优化 +# 策略复盘闭环系统设计 + +> 版本: v1 | 最后更新: 2026-06-24 +> 核心理念:每条策略建议都必须有回头检查,用实际结果驱动策略逻辑进化。 + +## 一、现状 + +| 环节 | 状态 | +|------|------| +| 策略生成 | ✅ `strategy_lifecycle.py` 按规则生成买入区/止损/止盈 | +| 策略评估 | ✅ 日评估六维分析每条策略的当前状况 | +| 策略重评 | ✅ 过期/偏离时自动触发重评 | +| **成功率追踪** | ❌ 有 `accuracy_stats` 空表,从未写入 | +| **复盘归因** | ❌ 没有"回头看"机制 | +| **策略逻辑修正** | ❌ 评估结果从不反馈到生成规则 | +| **验证测试** | ❌ 改完规则没有验证环节 | + +## 二、闭环设计 + +``` +生成策略 → 执行/等待 → 回头看(复盘) → 归因分析 → 修正策略逻辑 → 验证 → 部署 + ↑ | + └──── 迭代循环 ───────┘ +``` + +### 环节1:回头看(复盘) + +每条策略/建议在生成后 T+5、T+20、T+60 三个时间点回头检查: + +| 检查点 | 时机 | 判断标准 | +|--------|------|---------| +| T+5 | 5个交易日后 | 止损触发?止盈触发?价格走向是否正确? | +| T+20 | 一个月后 | 中期趋势验证。买入区是否有效? | +| T+60 | 三个月后 | 长期逻辑验证。大方向判断是否正确? | + +判断分类: +- ✅ **正确**:价格朝预期方向走了 > 止损/止盈间距的 50% +- ⚠️ **部分正确**:方向对了但幅度不够,或方向对但时机差 +- ❌ **错误**:方向错了,或止损被打后价格反转了 +- ⏳ **待定**:还在运行中,未到判断时点 + +### 环节2:归因分析 + +对 ❌ 错误 和 ⚠️ 部分正确 的做根因分类: + +| 失败模式 | 判断条件 | 修复方向 | +|----------|---------|---------| +| 止损过紧 | 价格跌破止损 < 3天后回到买入区 | 放宽止损到强支撑 × 0.95 | +| 入场过早 | 买入后继续跌 > 入场点 10% 才反弹 | 买入区下移,等缩量确认 | +| 止盈过近 | 价格突破止盈 < 5天后继续涨 > 15% | 止盈放到更高阻力位 | +| 方向看错 | 价格持续朝反方向走 | 检查多周期趋势判断逻辑 | +| 情景错配 | 策略假设的情景与实际不符 | 加入情景过滤条件 | +| 信号误判 | timing_signal 信号错误 | 修正信号合成逻辑 | +| 行业拖累 | 个股选对了但行业暴跌 | 加入行业动量过滤 | + +### 环节3:策略逻辑修正 + +归因结果反馈到策略生成规则的几个层面: + +1. **prompt_manager 规则更新** — 止损/止盈/买入区的生成规则 +2. **timing_signal 合成权重调整** — 各因子的权重 +3. **股票分类规则调整** — 什么情况归为弱势/深套/短炒 +4. **情景判定阈值调整** — detect_scenario 的参数 + +### 环节4:回测验证 + +修正后的规则用历史数据跑模拟,对比新旧规则的成功率: + +``` +模拟方式:取过去60天的数据 +1. 用旧规则生成每条策略 → 计算成功率 +2. 用新规则生成同样股票的策略 → 计算成功率 +3. 对比:新规则是否 > 旧规则 +5%? +4. 如果是 → 部署新规则 +5. 如果不是 → 继续调整 +``` + +## 三、参考来源 + +知识库中有多篇量化分析文章可以参考: +- 止损/止盈的统计学最优位置 +- 多因子信号合成的权重分配方法 +- 不同市场环境下的策略参数调优 +- 回测验证的方法论和陷阱(过拟合/幸存者偏差) + +## 四、实施路线 + +### Phase 1(本session) +- 策略复盘脚本:遍历 active 策略,检查实际结果,写入 accuracy_stats +- 归因分析:对失败策略分类失败模式 +- 初步报告:当前策略整体成功率 + 常见失败模式 + +### Phase 2(后续) +- 策略逻辑修正:根据归因调整 prompt_manager 规则 +- 回测验证:用历史数据验证新规则 +- 知识库文章萃取:从量化分析文章中提取可用因子 +- 持续迭代:每周跑一次复盘,持续优化 diff --git a/docs/xiaoguo-scanner-design.md b/docs/xiaoguo-scanner-design.md index 938b1fa..a42c822 100644 --- a/docs/xiaoguo-scanner-design.md +++ b/docs/xiaoguo-scanner-design.md @@ -1,78 +1,78 @@ -# 小果独立扫描线 — 全市场主动发现 - -## 概述 - -不依赖趋势信号触发,小果自己盯着各种排行榜,主动发现可能有料的股票,搜新闻判断后喂给知微。 - -## 时序 - -``` -每5分钟(独立cron,不碰现有管道) -小果扫描 → 榜单采样 → 搜索新闻 → LLM判断 → signal_news - ↓ -知微在下一轮15分钟cron中读到 → 一起分析 -``` - -## 数据源:三榜交集 - -每轮同时拉: - -| 榜单 | 来源 | 速度 | 内容 | -|------|------|------|------| -| 东方财富热榜 | `stock_hot_rank_em()` | <5秒 | 全市场关注度前30 | -| 同花顺轮流榜 | 以下5个轮流,一轮一个 | ~30秒 | 各前15只 | - -同花顺轮流拉的榜单(每轮换一个,5轮一个循环): - -| 榜名 | 函数 | 说明 | -|------|------|------| -| 创新高 | `stock_rank_cxg_ths()` | 股价突破N日内新高 | -| 量价齐升 | `stock_rank_ljqs_ths()` | 成交量+价格同步上涨 | -| 向上突破 | `stock_rank_xstp_ths()` | 技术形态突破关键位 | -| 连续上涨 | `stock_rank_cxd_ths()` | 连续N天上涨 | -| 连续放量 | `stock_rank_cxfl_ths()` | 连续N天放量 | - -**为什么这样组合:** 东方财富热榜代表"大家都在看",同花顺榜单代表"技术面有信号"。一只股票同时上两个榜,比只上一个榜更值得关注。 - -## 去重策略 - -每搜完一只股票,记录搜索时间到 `xiaoguo_scan_tracker` 表: -- 同一股票60分钟内不重复搜索 -- 如果该股票今日已有 signal_news(来源='xiaoguo'),也不再重复 - -## 有料判断 - -合并同一只股票的多篇新闻,一次LLM调用判断整个股票。 - -``` -输入:{name}({code}) 的3篇新闻标题 - 该股上了今日人气热榜/技术榜单 -输出:有关(利好/利空/中性)或 无关 -``` - -**时序控制:** -- 单只股票1次LLM调用(约15秒) -- 每轮最多15只 → 最长4分钟,5分钟窗口内跑完 -- 超时未跑的股票下一轮继续 - -## 去重 - -新增 source 字段: - -| source | 含义 | -|--------|------| -| trend | 现有管道,由 trend_detector 触发 | -| xiaoguo | 小果扫描,由榜单发现 | - -两类信号在 signal_news 里共存。知微判断时可以看到来源,后续可以用来评估哪个渠道更有效。 - -## 新增表:xiaoguo_scan_tracker - -```sql -CREATE TABLE IF NOT EXISTS xiaoguo_scan_tracker ( - code TEXT PRIMARY KEY, - name TEXT, - last_scanned_at TEXT, - found_count INTEGER DEFAULT 0 -); -``` +# 小果独立扫描线 — 全市场主动发现 + +## 概述 + +不依赖趋势信号触发,小果自己盯着各种排行榜,主动发现可能有料的股票,搜新闻判断后喂给知微。 + +## 时序 + +``` +每5分钟(独立cron,不碰现有管道) +小果扫描 → 榜单采样 → 搜索新闻 → LLM判断 → signal_news + ↓ +知微在下一轮15分钟cron中读到 → 一起分析 +``` + +## 数据源:三榜交集 + +每轮同时拉: + +| 榜单 | 来源 | 速度 | 内容 | +|------|------|------|------| +| 东方财富热榜 | `stock_hot_rank_em()` | <5秒 | 全市场关注度前30 | +| 同花顺轮流榜 | 以下5个轮流,一轮一个 | ~30秒 | 各前15只 | + +同花顺轮流拉的榜单(每轮换一个,5轮一个循环): + +| 榜名 | 函数 | 说明 | +|------|------|------| +| 创新高 | `stock_rank_cxg_ths()` | 股价突破N日内新高 | +| 量价齐升 | `stock_rank_ljqs_ths()` | 成交量+价格同步上涨 | +| 向上突破 | `stock_rank_xstp_ths()` | 技术形态突破关键位 | +| 连续上涨 | `stock_rank_cxd_ths()` | 连续N天上涨 | +| 连续放量 | `stock_rank_cxfl_ths()` | 连续N天放量 | + +**为什么这样组合:** 东方财富热榜代表"大家都在看",同花顺榜单代表"技术面有信号"。一只股票同时上两个榜,比只上一个榜更值得关注。 + +## 去重策略 + +每搜完一只股票,记录搜索时间到 `xiaoguo_scan_tracker` 表: +- 同一股票60分钟内不重复搜索 +- 如果该股票今日已有 signal_news(来源='xiaoguo'),也不再重复 + +## 有料判断 + +合并同一只股票的多篇新闻,一次LLM调用判断整个股票。 + +``` +输入:{name}({code}) 的3篇新闻标题 + 该股上了今日人气热榜/技术榜单 +输出:有关(利好/利空/中性)或 无关 +``` + +**时序控制:** +- 单只股票1次LLM调用(约15秒) +- 每轮最多15只 → 最长4分钟,5分钟窗口内跑完 +- 超时未跑的股票下一轮继续 + +## 去重 + +新增 source 字段: + +| source | 含义 | +|--------|------| +| trend | 现有管道,由 trend_detector 触发 | +| xiaoguo | 小果扫描,由榜单发现 | + +两类信号在 signal_news 里共存。知微判断时可以看到来源,后续可以用来评估哪个渠道更有效。 + +## 新增表:xiaoguo_scan_tracker + +```sql +CREATE TABLE IF NOT EXISTS xiaoguo_scan_tracker ( + code TEXT PRIMARY KEY, + name TEXT, + last_scanned_at TEXT, + found_count INTEGER DEFAULT 0 +); +``` diff --git a/docs/xiaoguo-signal-pipeline.md b/docs/xiaoguo-signal-pipeline.md index f00b5a2..c1fdb49 100644 --- a/docs/xiaoguo-signal-pipeline.md +++ b/docs/xiaoguo-signal-pipeline.md @@ -1,78 +1,78 @@ -# 小果信号管道 — xiaoguo → signal_news → 知微评估 → 自选/关注 - -## 一、整体流程 - -``` -xiaoguo_scanner.py(每5分钟跑一轮) - ├─ 同花顺看多榜(6个轮换):创新高、量价齐升、向上突破、连续上涨、持续放量、险资举牌 - └─ 同花顺看空榜(5个轮换):创新低、持续缩量、量价齐跌、连续下跌、向下突破 - ↓ 写入 signal_news - source=xiaoguo(看多) / source=xiaoguo_risk(看空) - ↓ -知微(盯盘cron每15-25分钟) - ├─ 读 signal_news 最新未处理信号 - ├─ 全面评估(五维分析) - │ 大盘 → 行业 → 个股 - │ 消息面 + 基本面 + 技术面 - ├─ 评估结论分三级: - │ ✅ 正式自选 → watchlist(默认status)+ decisions.json - │ 🔄 关注列表 → watchlist(status=watching),价格波动>3%触发升级 - │ ❌ 跳过 → 不跟踪 - └─ 在报告中体现 -``` - -## 二、数据源 - -### 榜单来源(三路并行) -1. **同花顺技术面榜单**(akshare,6看多+5看空轮换)— 技术指标类信号 -2. **行业领涨股**(从 market.json 读取,每轮都跑)— 涨幅>2.5%板块的领涨龙头 -3. **东方财富热榜**(akshare.stock_hot_rank_em)— 因502不可用,降级静默 - -### 三路数据合并规则 -优先级:行业领涨 > 同花顺技术榜 > 东方财富热榜 -同只股票不重复处理,最多15只/轮。 -行业领涨股保证能被扫描到,不会被技术榜单的股票挤掉。 - -### 新闻来源 -- 东方财富个股新闻API(akshare.stock_news_em) -- 新闻旧了不是排除条件,而是继续用其他维度评估 - -## 三、评估标准 - -### 五维全面分析 -1. **大盘维度** — 当前市场环境(普涨/分化/普跌) -2. **行业维度** — 板块联动性,行业趋势 -3. **消息面** — 新闻、公告、概念催化 -4. **基本面** — PE/PB、盈亏状态、市值 -5. **技术面** — 价量关系、支撑压力位、买入区 - -### 筛选条件 -- 亏损股(PE为负)且暴跌 → ❌ 跳过 -- PE为负还上涨 → 纯炒作 ❌ 跳过 -- PE>100 且大涨 → 题材炒作 ❌ 跳过 -- 单日暴跌>8% → ❌ 等企稳 -- 停牌 → ❌ 跳过 -- PE合理(0~60)+ 技术面信号 → ✅ 可考虑 -- PE极度低估(<15)+ 行业有催化 → ✅ 优先 - -### 结论分三级 -| 等级 | watchlist status | 含义 | 后续动作 | -|------|-----------------|------|---------| -| ✅ 正式自选 | 默认 | 有完整策略(买入区/止损/止盈) | 价格监控每2min+K线缓存+策略重评 | -| 🔄 关注 | watching | 有待验证,等价格波动>3%或出新闻 | 价钱跟踪,条件触发自动升级评估 | -| ❌ 跳过 | 不跟踪 | 明确不碰 | 无 | - -## 四、关注列表升级条件 - -watchlist 中 status=watching 的股票,每轮cron检查: -1. 已有正式策略(decisions.json中有entry_low/entry_high)→ 价格进入买入区则升级 -2. 无正式策略 → 价格波动>3%或搜到新新闻 → 触发完整五维评估 -3. 符合条件的移入正式自选(status改为默认),生成策略,在报告中体现 - -## 五、自选股自动获得的数据服务 - -- price_monitor.py(每2分钟刷新价钱) -- refresh_mtf_cache.py(每天9:00拉日/周/月K线) -- stale_detector.py(每天检查买入区偏离+过期) -- 盘前+午间策略重评(每天9:00+12:00) -- 盯盘报告覆盖分析(每15-25分钟) +# 小果信号管道 — xiaoguo → signal_news → 知微评估 → 自选/关注 + +## 一、整体流程 + +``` +xiaoguo_scanner.py(每5分钟跑一轮) + ├─ 同花顺看多榜(6个轮换):创新高、量价齐升、向上突破、连续上涨、持续放量、险资举牌 + └─ 同花顺看空榜(5个轮换):创新低、持续缩量、量价齐跌、连续下跌、向下突破 + ↓ 写入 signal_news + source=xiaoguo(看多) / source=xiaoguo_risk(看空) + ↓ +知微(盯盘cron每15-25分钟) + ├─ 读 signal_news 最新未处理信号 + ├─ 全面评估(五维分析) + │ 大盘 → 行业 → 个股 + │ 消息面 + 基本面 + 技术面 + ├─ 评估结论分三级: + │ ✅ 正式自选 → watchlist(默认status)+ decisions.json + │ 🔄 关注列表 → watchlist(status=watching),价格波动>3%触发升级 + │ ❌ 跳过 → 不跟踪 + └─ 在报告中体现 +``` + +## 二、数据源 + +### 榜单来源(三路并行) +1. **同花顺技术面榜单**(akshare,6看多+5看空轮换)— 技术指标类信号 +2. **行业领涨股**(从 market.json 读取,每轮都跑)— 涨幅>2.5%板块的领涨龙头 +3. **东方财富热榜**(akshare.stock_hot_rank_em)— 因502不可用,降级静默 + +### 三路数据合并规则 +优先级:行业领涨 > 同花顺技术榜 > 东方财富热榜 +同只股票不重复处理,最多15只/轮。 +行业领涨股保证能被扫描到,不会被技术榜单的股票挤掉。 + +### 新闻来源 +- 东方财富个股新闻API(akshare.stock_news_em) +- 新闻旧了不是排除条件,而是继续用其他维度评估 + +## 三、评估标准 + +### 五维全面分析 +1. **大盘维度** — 当前市场环境(普涨/分化/普跌) +2. **行业维度** — 板块联动性,行业趋势 +3. **消息面** — 新闻、公告、概念催化 +4. **基本面** — PE/PB、盈亏状态、市值 +5. **技术面** — 价量关系、支撑压力位、买入区 + +### 筛选条件 +- 亏损股(PE为负)且暴跌 → ❌ 跳过 +- PE为负还上涨 → 纯炒作 ❌ 跳过 +- PE>100 且大涨 → 题材炒作 ❌ 跳过 +- 单日暴跌>8% → ❌ 等企稳 +- 停牌 → ❌ 跳过 +- PE合理(0~60)+ 技术面信号 → ✅ 可考虑 +- PE极度低估(<15)+ 行业有催化 → ✅ 优先 + +### 结论分三级 +| 等级 | watchlist status | 含义 | 后续动作 | +|------|-----------------|------|---------| +| ✅ 正式自选 | 默认 | 有完整策略(买入区/止损/止盈) | 价格监控每2min+K线缓存+策略重评 | +| 🔄 关注 | watching | 有待验证,等价格波动>3%或出新闻 | 价钱跟踪,条件触发自动升级评估 | +| ❌ 跳过 | 不跟踪 | 明确不碰 | 无 | + +## 四、关注列表升级条件 + +watchlist 中 status=watching 的股票,每轮cron检查: +1. 已有正式策略(decisions.json中有entry_low/entry_high)→ 价格进入买入区则升级 +2. 无正式策略 → 价格波动>3%或搜到新新闻 → 触发完整五维评估 +3. 符合条件的移入正式自选(status改为默认),生成策略,在报告中体现 + +## 五、自选股自动获得的数据服务 + +- price_monitor.py(每2分钟刷新价钱) +- refresh_mtf_cache.py(每天9:00拉日/周/月K线) +- stale_detector.py(每天检查买入区偏离+过期) +- 盘前+午间策略重评(每天9:00+12:00) +- 盯盘报告覆盖分析(每15-25分钟)