Files
MoFin/EXPERT_SYSTEM_DESIGN.md
T
2026-06-20 12:43:24 +08:00

419 lines
25 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# MoFin 专家系统 — 完整架构文档 v2.0
> 最后更新:2026-06-12
> 维护人:莫荷(Hermes Agent
> 铁律:任何系统改动必须先读本文档,改完必须同步更新
---
## 一、核心理念
```
每份分析都成为下一次分析的养料
每次建议都成为下一次建议的参考
从内到外(知识→分析),从外到内(分析→沉淀)的持续闭环
```
## 二、股票操作策略生命周期
```
┌─────────────────────────────┐
│ 大环境+行业趋势研判 │
│ (盘前热点扫描·每天8:30) │
│ 板块扫描→发现新标的 │
└──────────┬──────────────────┘
│ 写入 watchlist.json
┌─────────────────────────────┐
│ 自选股池 (watchlist.json) │
│ │
│ 🟢 可操作 — 价格在买入区内 │
│ 🟡 关注 — 距触发3~5% │
│ ⚪ 观察 — 距触发>5% │
│ │
│ 监控: │
│ • 快速盯盘(每15分钟) │
│ • 持仓情报-盘后(每天) │
│ • 自选股体检(每周六) │
└──────────┬──────────────────┘
进入买入区 │ 建仓
┌─────────────────────────────┐
│ 持仓股 (portfolio.json) │
│ │
│ 监控: │
│ • 价格监控(每分钟·纯脚本) │
│ • 快速盯盘(每15分钟·LLM) │
│ • 持仓情报-盘中(每小时·LLM) │
│ • 持仓情报-盘后(每天·LLM) │
│ • 分析师-持仓复查(每周·LLM) │
└──────────┬──────────────────┘
触发止损/止盈/清仓 │
┌─────────────────────────────┐
│ 回到自选股池 │
│ (保留策略,等待下次机会) │
└─────────────────────────────┘
```
## 三、系统架构总览
```
┌──────────────────────────────────────────────────────────────────┐
│ MoFin 专家系统 v2.0 │
├──────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────┐ ┌──────────────────────────────┐ │
│ │ 基础设施层(纯脚本) │ │ 分析层(LLM驱动) │ │
│ │ 0配额消耗 │ │ 每次运行消耗1次配额 │ │
│ │ │ │ │ │
│ │ • 价格监控(1分钟) │ │ • 盘前热点扫描(8:30) │ │
│ │ 腾讯批量API拉所有股票 │ │ → 持仓分析+板块扫描 │ │
│ │ 写入portfolio/watchlist│ │ → 新机会发现→写入watchlist│ │
│ │ 比对区间触发→输出 │ │ │ │
│ │ │ │ • 集合竞价观察(9:28) │ │
│ │ • 市场数据采集(30分钟) │ │ → A股竞价异常监控 │ │
│ │ 板块数据→market.json │ │ │ │
│ │ │ │ • 快速盯盘(每15分钟) │ │
│ │ • 数据同步(8:55) │ │ → 持仓操作窗口+自选接近提醒 │ │
│ │ update_data+server检查│ │ │ │
│ │ │ │ • 持仓情报-盘中(每小时40分) │ │
│ │ • XMPP中继(每分钟) │ │ → 详细盘中分析 │ │
│ │ 扫输出目录→推知微 │ │ │ │
│ │ │ │ • 持仓情报-盘后(20:00) │ │
│ │ • 港股低延迟行情中继 │ │ • 分析师-持仓复查(周四20:00) │ │
│ │ tdx-relay (Windows) │ │ → 基本面深度复查 │ │
│ │ opentdx→招商证券7727 │ │ │ │
│ │ POST → /api/update/ │ │ │ │
│ │ realtime │ │ │ │
│ └─────────┬───────────────┘ │ │ │
│ │ │ │ │
│ ▼ │ │ │
│ ┌─────────────────────────┐ │ │ │
│ │ 数据层 │ │ │ │
│ │ portfolio.json(持仓) │ │ │ │
│ │ watchlist.json(自选) │ │ → 每只自选评估:保留/移除 │ │
│ │ decisions.json(决策库) │ │ │ │
│ │ market.json(板块数据) │ │ • 知微周复盘(周日22:00) │ │
│ │ daily_reviews.json │ │ → 周度总结 │ │
│ │ stock_profiles.json │ └──────────┬───────────────────┘ │
│ └─────────┬───────────────┘ │ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 推送层 │ │
│ │ cron_to_xmpp.py(每分钟·纯脚本) │ │
│ │ 扫描 ~/.hermes/cron/output/*/ 目录 │ │
│ │ 发现新 .md 文件 → 提取正文 → XMPP推送【知微】 │ │
│ │ 已推送的记在 .relay_journal.json,不重复推 │ │
│ └──────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────┘
```
## 四、完整 Cron Job 清单(14个)
### 🟢 基础设施层(纯脚本,0配额消耗)
| # | 名称 | 频率 | 脚本 | 输出 | 说明 |
|---|------|------|------|------|------|
| 1 | **价格监控-1分钟** | 工作日 每分钟(9-11/12/13-16) | `price_monitor.py` | 有触发→推送;无→SILENT | 腾讯批量API拉所有股票实时价,写入portfolio/watchlist,比对区间触发条件 |
| 2 | **市场数据采集** | 工作日 每30分钟 | `market_watch.py` | 成功→SILENT;失败→报错 | 东方财富API采集板块数据→market.json |
| 3 | **数据同步-dashboard** | 每天 8:55 | `sync_dashboard.py` | 有数据→推送;无→SILENT | 跑update_data.py+检查server,挂了自动重启 |
| 4 | **cron-推XMPP中继** | 工作日 每分钟(9-16) | `cron_to_xmpp.py` | 有新报告→推送;无→静默 | 扫所有job输出目录,推新报告到XMPP |
| 5 | **中继-16点收盘** | 工作日 16:00-16:10 | `cron_to_xmpp.py` | 同上 | 收盘时段推港股报告 |
### 🔵 分析层(LLM驱动,每次1次配额)
| # | 名称 | 频率 | 关键职责 | 价格获取方式 |
|---|------|------|---------|------------|
| 6 | **盘前热点扫描** | 工作日 8:30 | 持仓分析+**板块扫描→新机会发现→写入watchlist** | 读文件(price_monitor刷新) |
| 7 | **集合竞价观察** | 工作日 9:28 | A股竞价异常监控,无异常SILENT | A股curl竞价价+港股读文件 |
| 8 | **快速盯盘-15分钟** | 工作日 每15分钟 | 持仓操作窗口+**自选股接近买入区提醒**,无则SILENT | 读文件 |
| 9 | **持仓情报-盘中** | 工作日 每小时40分 | 详细盘中分析+异动搜因 | 读文件 |
| 10 | **持仓情报-盘后** | 工作日 20:00 | 完整复盘+**自选股回顾**+数据沉淀daily_reviews | 读文件 |
| 11 | **分析师-持仓复查** | 周四 20:00 | 每周基本面深度复查 | 读文件 |
| 12 | **自选股体检-每周** | **周六 20:00 🆕** | 每只自选评估:已建仓→移除、>30天未接近→建议移除、行业变化→更新理由 | 读文件+web_search |
| 13 | **知微周复盘** | 周日 22:00 | 周度总结 | 读文件 |
| 14 | **策略评估-每日** | 工作日 21:00 | 双维度评估36条策略,生成反馈闭环 | 读文件+LLM | 无变化→SILENT |
| 15 | **建议对账-每周** | 周六 20:00 | 对比建议vs实际持仓变化,算准确率 | 纯脚本 | 有数据→推送 |
| 16 | **策略评估-每周** | 周六 21:00 | 完整评分+趋势分析+策略参数调整 | 纯脚本 | 有数据→推送 |
## 五、数据文件
| 文件 | 路径 | 作用 | 更新频率 | 更新者 |
|------|------|------|---------|--------|
| 持仓数据 | `data/portfolio.json` | 持仓快照+实时价 | 每分钟 | price_monitor |
| 自选数据 | `data/watchlist.json` | 自选股列表+买入区+实时价 | 每分钟 | price_monitor+盘前扫描+自选体检 |
| 决策库 | `data/decisions.json` | 策略+trigger+建议历史+评估数据 | 每次讨论后+每日评估 | LLM job+策略评估 |
| 每日复盘 | `data/daily_reviews.json` | 当日判断+修正沉淀 | 每日20:00 | 持仓情报-盘后 |
| 股票档案 | `data/stock_profiles.json` | 行业/业务/逻辑 | 发现新信息时 | LLM |
| 市场数据 | `data/market.json` | 板块涨跌+概念热度 | 每30分钟 | market_watch |
| 价格事件 | `data/price_events.json` | 价格触发记录(止盈/止损/买入区) | 每分钟 | price_monitor |
| 评估结果 | `data/evaluation.json` | 双维度评估+评分 | 每天21:00 | 策略评估 |
| 准确率统计 | `data/accuracy_stats.json` | 建议对账+准确率 | 每周六20:00 | 对账脚本 |
| 反馈闭环 | `data/strategy_feedback.json` | 反馈+调整建议+知识萃取 | 每天21:00 | 策略评估 |
| 区间偏离 | `~/.hermes/zone_breach.json` | 价格偏离标记 | 每分钟 | price_monitor |
| 触发状态 | `~/.hermes/price_trigger_state.json` | 每只股票各区间的进出状态 | 每分钟 | price_monitor |
| relay状态 | `data/relay_state.json` (新增) | tdx-relay在线/离线状态 | 每分钟 | server.py(update/realtime更新) |
## 六、数据流转
```
tdx-relay (Windows·xxm负责)
│ opentdx → 招商证券7727扩展行情服务
│ 拉取17只港股实时行情(1~3秒延迟)
│ POST → http://192.168.1.246:8899/api/update/realtime
├──→ server.py 接收 → 更新 portfolio.json / watchlist.json
│ 港股 data_source = "tdx_relay"
│ 更新 relay_state.json
└──→ price_monitor 检测 relay 状态
relay 在线 → 跳过港股腾讯API拉取(保留实时价)
relay 离线(>60秒) → 回退腾讯 API 兜底
price_monitor(每分钟)
│ 腾讯批量API 1次请求
├──→ portfolio.json (持仓实时价)
├──→ watchlist.json (自选实时价)
├──→ 比对decisions.json的trigger区间
├──→ 有触发 → 输出 → 中继 → 知微
└──→ 无触发 → [SILENT] → 丢弃
market_watch(每30分钟)
│ 东方财富API
└──→ market.json (板块数据)
盘前热点扫描(每天8:30)
│ 读 market.json → 分析强势板块
│ 发现新标的 → 写入 watchlist.json
└──→ 输出报告 → 中继 → 知微
快速盯盘(每15分钟)
│ 读 portfolio.json + watchlist.json
│ 持仓操作窗口 + 自选接近买入区
└──→ 有发现 → 输出 → 中继 → 知微
持仓情报-盘后(每天20:00)
│ 读 portfolio.json + watchlist.json
│ 持仓回顾 + 自选回顾
└──→ 写入 daily_reviews.json
└──→ 输出报告 → 中继 → 知微
自选股体检(每周六20:00)
│ 读 watchlist.json + portfolio.json
│ 每只评估:保留/移除/更新
└──→ 输出报告 → 中继 → 知微
```
## 七、报告推送策略
| 报告 | 推送 | 频率 | 静默规则 |
|------|------|------|---------|
| 价格监控 | ✅ 有触发才推 | 每分钟 | 无触发→[SILENT] |
| 盘前扫描 | ✅ | 每日1次 | 有发现才写 |
| 集合竞价 | ✅ 有异常才推 | 每日1次 | 无异常→SILENT |
| 快速盯盘 | ✅ 有发现才推 | 每15分钟 | 无操作窗口+无自选接近→SILENT |
| 持仓情报-盘中 | ✅ 有发现才推 | 每小时40分 | 无操作窗口→合并后停止 |
| 持仓情报-盘后 | ✅ | 每日20:00 | 有实质内容才写 |
| 分析师复查 | ✅ | 每周四 | 有发现才写 |
| 自选股体检 | ✅ | 每周六 | 有建议才写 |
| 知微周复盘 | ✅ | 每周日 | 有实质内容才写 |
| 市场数据采集 | ❌ 不推 | 每30分钟 | 只写文件 |
| 数据同步 | ✅ 有数据才推 | 每天8:55 | 无更新→SILENT |
## 八、关键设计决策
| 方面 | 决策 | 原因 |
|------|------|------|
| 价格获取 | 腾讯批量API `qt.gtimg.cn/q=sh600110,sz000001,...` | 1次请求拉所有股票,无频率限制 |
| 价格监控类型 | 纯脚本(`no_agent=True`) | 不需要LLM0配额消耗 |
| 中继类型 | 纯脚本(`no_agent=True`) | 文件扫描+XMPP推送,不需要LLM |
| 市场数据采集 | 纯脚本(`no_agent=True`) | 只写文件不输出,不需要LLM |
| 数据同步 | 纯脚本(`sync_dashboard.py`) | 包装脚本含server检查,不需要LLM |
| LLM job价格来源 | 读文件(price_monitor每1分钟刷新) | 不再逐个curl,节省配额 |
| 新机会发现 | 合并到盘前热点扫描(每天) | 每天分析板块数据,发现新标的写入watchlist |
| 自选股进出管理 | 自选股体检(每周六) | 系统评估+提请确认,不自动删除 |
| 午休 | 价格监控跳过12:05-12:55(保留12:00) | A股午休无行情 |
## 九、配额消耗估算(一个上午)
| 组件 | 运行次数 | 配额消耗 |
|------|---------|---------|
| 价格监控 | ~240次(每分钟) | **0** (纯脚本) |
| 市场数据采集 | ~10次 | **0** (纯脚本) |
| 数据同步 | 1次 | **0** (纯脚本) |
| XMPP中继 | ~240次 | **0** (纯脚本) |
| 盘前热点扫描 | 1次 | **1次** |
| 集合竞价 | 1次 | **1次** |
| 快速盯盘 | ~20次 | **~20次** (有操作窗口才跑,无则SILENT不消耗) |
| 持仓情报-盘中 | ~6次 | **~6次** |
| 策略评估-每日 | 1次 | **1次** |
| **总计** | | **~29次 LLM调用** |
---
## 十、策略评估反馈闭环架构
### 核心流程
```
price_monitor(每分钟·纯脚本)
│ 腾讯批量API拉所有股票实时价
│ 比对策略区间 → 触发 → 记录到 price_events.json
├──→ 价格触发事件持久化(price_events.json
│ event_type: entry_zone / stop_loss / take_profit
│ code, name, price, trigger_value, timestamp
strategy_evaluator(每天21:00·纯脚本)
│ 读 decisions.json + price_events.json + portfolio.json
│ 双维度评估每只股票:
│ 阶段一(策略制定→价格达标):
│ - 理论:价格是否达到过止盈/止损/买入区
│ - 实际:持仓盈亏、建议执行情况
│ 阶段二(价格回落→新止损验证):
│ - 新止损是否被后续走势验证
│ 写入 decisions.json 的 evaluation 字段
├──→ 写入 evaluation.json
strategy_feedback(每天21:00·纯脚本,评估后自动)
│ 读 evaluation.json
│ 自动决策:
│ - 价格达到止盈 → 标记阶段一成功,萃取经验
│ - 跌破止损 → 标记阶段一失败,生成新区间
│ - 14天无触发 → 标记 stale,建议重评
│ - 准确率持续下降 → 收紧区间宽度
│ 写入 strategy_feedback.json
├──→ 写入 strategy_feedback.json
每日评估 cron(每天21:00·LLM驱动)
│ 读 strategy_feedback.json
│ 处理反馈 → 更新策略 → 输出日报
│ 无变化 → [SILENT]
盘后知识萃取(每天16:30·LLM驱动)
│ 读 feedback 中的 knowledge 字段
│ 写入 analyst-knowledge-log.md
建议对账(每周六20:00·纯脚本)
│ 对比 advice_timeline vs portfolio.json
│ 算准确率 → 写入 accuracy_stats.json
策略评估-每周(每周六21:00·纯脚本)
│ 完整评分 → 趋势分析 → 策略参数调整
│ 写入 evaluation.json + strategy_feedback.json
```
### 双维度评估模型
| 维度 | 阶段一 | 阶段二 |
|------|--------|--------|
| 理论(策略规划) | 价格是否达到止盈/止损/买入区?何时?理论盈亏? | 新止损是否被后续走势验证? |
| 实际(用户执行) | 实际持仓盈亏?建议是否被采纳? | 用户是否按新止损操作?实际损失? |
### 反馈引擎自动决策规则
| 检测条件 | 自动动作 |
|----------|----------|
| 价格达到止盈位 | 标记阶段一成功,萃取经验到知识日志,创建新自选策略 |
| 跌破止损位 | 标记阶段一失败,分析原因,生成新止损/买入区间 |
| 策略14天未触发任何区间 | 标记为 stale,建议重新评估基本面和技术面 |
| 准确率持续下降(<50%) | 收紧策略区间宽度(10%→8%) |
| 准确率持续上升(>80%) | 放宽策略区间宽度(10%→12%) |
---
## 十、v2.0 更新说明(2026-06-09
本次更新基于知微与莫荷、老爸的深入讨论,对系统做了全面重构。以下记录讨论过程中的关键意图、决策和待办事项。
### 本次改动驱动因素
1. **火山引擎(volcengine) 429配额超限** → 触发对 provider 配置和 fallback 链的全面梳理
2. **发现价格监控逐个curl拉取价格** → 效率极低且浪费配额,触发了对价格获取方式的全面改造
3. **知微反馈"问了不在回答长篇报告"** → 触发了对 session 管理、system prompt、对话识别机制的修复
4. **老爸指出持仓和自选股之间的动态生命周期关系** → 触发了对股票操作策略完整生命周期的重新设计
### 已完成的改造
**基础设施层:**
- 价格监控从 LLM驱动(每5分钟) 改为 纯脚本(每1分钟),使用腾讯批量API一次拉所有股票
- XMPP中继从 LLM驱动 改为 纯脚本(每1分钟)
- 市场数据采集从 LLM驱动 改为 纯脚本
- 数据同步从 LLM驱动 改为 纯脚本(含server检查包装脚本)
- 所有LLM job的价格获取从"逐个curl拉取"改为"直接读文件(price_monitor每1分钟刷新)"
**股票生命周期完善:**
- 新机会发现:合并到盘前热点扫描(每天8:30),板块扫描→发现新标的→写入watchlist
- 自选接近提醒:快速盯盘(每15分钟)新增自选接近买入区(<5%)单独提醒
- 自选回顾:持仓情报-盘后(每天20:00)新增自选股回顾板块
- 自选体检:新增每周六20:00的自动评估+建议移除/保留
**provider配置统一:**
- 莫荷(默认profile):默认ocg-old(旧key) → fallback ocg-new(新key) → volcengine(火山)
- 知微(position-analyst):默认volcengine(火山) → fallback ocg-old(旧key) → ocg-new(新key)
- 火山已恢复可用
**对话机制修复:**
- 知微SOUL新增对话上下文识别规则(打招呼vs分析请求vs模糊提问)
- 知微SOUL新增系统自动追加消息(bg-review)说明
- position-analyst启用压缩(protect_last_n=200, hygiene_hard_message_limit=400)
**策略评估反馈闭环(v2.0 深夜追加):**
- 价格事件持久化:price_monitor每分钟记录价格触发事件到price_events.json
- 双维度评估:strategy_evaluator每天评估36条策略,分阶段一(策略制定→价格达标)和阶段二(价格回落→新止损验证),每个阶段同时记录理论盈亏和实际盈亏
- 反馈引擎:strategy_feedback自动检测止盈/止损/stale策略,生成调整建议,萃取知识到知识日志
- Dashboard评估tab:展示评分、理论vs实际盈亏对比、反馈闭环卡片
- 建议对账:advice_reconciliation.py每周对比建议vs实际持仓变化算准确率
- 36条策略全部填充建议记录,平均分4.8/10
### 设计原则/意图
1. **知微是分析师,不是决策者** — 她出建议,老爸决定是否执行,是否执行的唯一真相来源是截图/持仓更新
2. **莫荷是参谋,不是执行者** — 莫荷出报告和建议,不做交易操作
3. **建议≠事实** — 不能假设建议=被执行,需要等持仓更新来验证
4. **持仓/自选动态循环** — 持仓清仓→自动转自选保留策略,自选建仓→自动转为持仓管理
5. **自选股进出需人工确认** — 系统可以建议移除,但不能自动删除,需老爸确认
6. **轻对话,重分析** — 不是每条消息都需要全面分析报告,区分打招呼和干活
### 尚未完成/待定事项
1. **建议自动记录+对账闭环** — 莫荷发出的建议自动记入decisions.json的advice_timeline,每周对比实际持仓变化,统计准确率(✅ 已完成:/api/advice/record + advice_reconciliation.py + accuracy_stats.json
2. **MoFin Dashboard整合** — server.py应整合所有数据源,包括待确认决策、准确率统计等(✅ 已完成:决策库tab + 评估tab + 反馈闭环tab
3. **知微XMPP通信通道优化** — 当前xmpp_zhiwei_bot.py断线重连机制有缺陷(Event().wait阻塞),需修复(✅ 已完成:watchdog循环每10秒检查连接状态)
4. **session跨profile检索** — 知微无法搜到莫荷CLI session的内容,需手动转发(✅ 已完成:session_search profile参数可用)
5. **策略双维度评估体系** — 理论策略vs实际执行,分阶段跟踪,自动反馈闭环(✅ 已完成:strategy_evaluator.py + strategy_feedback.py + 每日/每周cron
6. **价格事件持久化** — price_monitor每分钟记录价格触发事件供回溯评估(✅ 已完成:price_events.json + record_event()
### tdx-relay 集成(小小莫Windows端 + 知微Linux端)
详见单独文档:`TDX_RELAY_COLLAB.md`
职责分工:
- **小小莫**Windows端 tdx-relay 开发维护(opentdx→招商证券7727→港股实时行情推送)
- **知微**Linux端 MoFin API 兼容(/api/update/realtime 已实现,/api/relay/status 待实现)+ price_monitor relay 检测+回退逻辑
当前状态:
-`/api/update/realtime` 端点已在 server.py 中实现
-`relay_state.json` 持久化(待实现)
-`/api/relay/status` GET 端点(待实现)
-`price_monitor.py` relay 活跃检测(待实现)
- ⏳ relay 离线时自动回退腾讯 API(待实现)
### 正在进行的优化(2026-06-12
1. **报告格式精简** — 老爸反复强调太长无重点。已改为:重点推荐(≤3只)+风险关注(≤3只)+其余持仓一行。全文≤500字。
2. **技术面分析取代百分比策略** — 支撑/压力位用枢轴点算法,止损=min(强支撑, 成本×0.85),买入区=弱撑~弱压之间,止盈在盈亏比≥1:2处。
3. **MoFin 决策库重构** — 清空旧记录(标记obsolete),从6月11日起重新记录。新增 active_manual / current_recommend 标签,支持按此筛选排序。新增搜索框。
4. **格式校验器** — cron_to_xmpp.py 新增 validate_format(),拦截无重点/超长/含模棱两可词语的报告。记录到 daily 汇总(不拦截推送,只记录违规)。