docs: reorganize — README index, archive old docs, add status headers
This commit is contained in:
@@ -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
|
||||||
@@ -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
@@ -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
@@ -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(全量加载) | ~22K(200条) |
|
| 每次请求token | 26M(全量加载) | ~22K(200条) |
|
||||||
| 上下文窗口用量 | 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(新session,LIMIT 200) |
|
| xmpp-mohe-v2 | ~200 | XMPP mohe(新session,LIMIT 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
@@ -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 的港股行情来源是腾讯 API(qt.gtimg.cn),
|
原本 MoFin 的港股行情来源是腾讯 API(qt.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.json(online=true, last_ping=now)
|
└─ 更新 relay_state.json(online=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.json(online=true)
|
├─ 更新 relay_state.json(online=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 恢复后自动切回 |
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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周六 → 建议对账-每周 cron(advice准确率)
|
- 每周20:00周六 → 建议对账-每周 cron(advice准确率)
|
||||||
|
|
||||||
### 反馈修正流
|
### 反馈修正流
|
||||||
```
|
```
|
||||||
评估结果
|
评估结果
|
||||||
↓
|
↓
|
||||||
发现策略偏差 → 记入 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 支持executed(6/22修复)
|
- [x] /api/advice/confirm 支持executed(6/22修复)
|
||||||
- [ ] 建议执行后自动回写result(需对接用户交易数据)
|
- [ ] 建议执行后自动回写result(需对接用户交易数据)
|
||||||
|
|
||||||
### 反馈层
|
### 反馈层
|
||||||
- [x] 知识萃取cron已运行(每日16:30)
|
- [x] 知识萃取cron已运行(每日16:30)
|
||||||
- [ ] 知识萃取结果自动触发系统修改(目前只记录不改)
|
- [ ] 知识萃取结果自动触发系统修改(目前只记录不改)
|
||||||
- [x] 建议对账每周跑(advice_reconciliation.py)
|
- [x] 建议对账每周跑(advice_reconciliation.py)
|
||||||
|
|||||||
+251
-251
@@ -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 → 搜新闻(原文入库)
|
||||||
④ 我(知微)→ 判断信号 → 更新候选池 → 推报告/紧急消息
|
④ 我(知微)→ 判断信号 → 更新候选池 → 推报告/紧急消息
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 二、数据采集(:43,no_agent)
|
## 二、数据采集(:43,no_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 | 领涨股涨跌幅 |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 三、趋势检测(:45,no_agent)
|
## 三、趋势检测(:45,no_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 表)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 四、新闻采集(:48,no_agent)
|
## 四、新闻采集(:48,no_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/:45,LLM cron)
|
## 五、知微判断与决策(:00/:15/:30/:45,LLM 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:00,LLM cron)
|
## 六、收盘后处理(16:00,LLM 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分 |
|
||||||
| 潜力股挖掘 | candidates(zhiwei_star 非空) | 实时 |
|
| 潜力股挖掘 | candidates(zhiwei_star 非空) | 实时 |
|
||||||
| 自选股 | watchlist_stocks | 实时 |
|
| 自选股 | watchlist_stocks | 实时 |
|
||||||
|
|||||||
+119
-119
@@ -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
@@ -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 是 HKD,cost 是 CNY,算出来没意义
|
# WRONG — price 是 HKD,cost 是 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 | - | 无规范 |
|
||||||
|
|||||||
@@ -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 规则
|
||||||
- 回测验证:用历史数据验证新规则
|
- 回测验证:用历史数据验证新规则
|
||||||
- 知识库文章萃取:从量化分析文章中提取可用因子
|
- 知识库文章萃取:从量化分析文章中提取可用因子
|
||||||
- 持续迭代:每周跑一次复盘,持续优化
|
- 持续迭代:每周跑一次复盘,持续优化
|
||||||
|
|||||||
@@ -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
|
||||||
);
|
);
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -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
|
||||||
│ 🔄 关注列表 → watchlist(status=watching),价格波动>3%触发升级
|
│ 🔄 关注列表 → watchlist(status=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只/轮。
|
||||||
行业领涨股保证能被扫描到,不会被技术榜单的股票挤掉。
|
行业领涨股保证能被扫描到,不会被技术榜单的股票挤掉。
|
||||||
|
|
||||||
### 新闻来源
|
### 新闻来源
|
||||||
- 东方财富个股新闻API(akshare.stock_news_em)
|
- 东方财富个股新闻API(akshare.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分钟)
|
||||||
|
|||||||
Reference in New Issue
Block a user