# 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`) | 不需要LLM，0配额消耗 |
| 中继类型 | 纯脚本(`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 汇总（不拦截推送，只记录违规）。
