docs: reorganize — README index, archive old docs, add status headers

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