docs: cron架构深度审查与重构设计——发现4大问题(策略扫描器嵌入/多入口调度/代码分叉/健康检查过度层级)
This commit is contained in:
@@ -0,0 +1,224 @@
|
||||
# MoFin Cron 架构深度审查与重构设计
|
||||
|
||||
> 创建:2026-08-11 | 审查人:小小莫 | 状态:📋 审查完成,重构方案待老莫批准
|
||||
> 背景:新策略(预测超跌反弹 p_oversold)引入前,必须清理 cron 架构的
|
||||
> 重复调度、代码分叉、职责混乱问题,让架构清晰可维护。
|
||||
|
||||
---
|
||||
|
||||
## 一、现状全景
|
||||
|
||||
### 1.1 调度系统
|
||||
|
||||
| 调度系统 | 任务数 | 说明 |
|
||||
|---------|--------|------|
|
||||
| hermes 顶层 jobs.json | 16 | ⚠️ 7/23 起调度器停摆(残留)|
|
||||
| hermes position-analyst | 63 | ✅ 主调度(活跃)|
|
||||
| hermes mohe | 2 | ✅ 少量 |
|
||||
| 系统 crontab | ~33 | ⚠️ 部分与 hermes 重复 |
|
||||
|
||||
### 1.2 脚本总数
|
||||
|
||||
- deploy/profile-scripts/:~100 个 py
|
||||
- hermes scripts/:硬链接(sync_profile_scripts.sh 维护)
|
||||
- MoFin 根目录:库文件 + 残留
|
||||
|
||||
---
|
||||
|
||||
## 二、核心架构问题
|
||||
|
||||
### 问题 1:策略扫描器嵌入数据采集器(违反单一职责)
|
||||
|
||||
**现状**:
|
||||
```
|
||||
market_watch.py(行业板块采集,*/10)
|
||||
├─ 1. 板块数据采集(EM→THS)→ market_snapshots
|
||||
├─ 2. market_regime 计算 → market_regime 表
|
||||
├─ 3. subprocess 调 mr_scanner.py(v_weak,timeout=1500s)
|
||||
└─ 4. subprocess 调 s2_scanner.py(S2 恐慌买,timeout=1500s)
|
||||
```
|
||||
|
||||
**问题**:
|
||||
- market_watch 职责 = 数据采集 + 市场阶段 + 2 个策略扫描,四合一
|
||||
- mr_scanner/s2_scanner **无独立调度**,只能被 market_watch 触发
|
||||
- timeout=1500s(25分钟)嵌入采集器,若超时影响采集
|
||||
- 新策略 p_oversold 替换时无处安放(要改 market_watch 还是新建?)
|
||||
|
||||
**重构方案**:策略扫描器独立调度
|
||||
```
|
||||
market_watch.py(纯板块采集,*/10)
|
||||
mr_scanner.py(v_weak,独立 cron 0 9 * * 1-5 或并入扫描调度)
|
||||
s2_scanner.py(S2 恐慌买,独立 cron)
|
||||
predictive_oversold_scanner.py(新策略,独立 cron)
|
||||
```
|
||||
- 每个扫描器独立 job、独立日志、独立幂等
|
||||
- market_watch 只做采集(单一职责)
|
||||
|
||||
### 问题 2:同一脚本多个调度入口
|
||||
|
||||
| 脚本 | 入口 | 建议 |
|
||||
|------|------|------|
|
||||
| market_watch.py | 顶层(0,30 9-16) + position(*/10) | 停顶层(调度器已死)|
|
||||
| stale_detector.py | 策略评估-每日(21:00) + 周末重评(30 10 0,6) | 保留(两用途不同)|
|
||||
| memory_guardian.py | 顶层 + position | 停顶层 |
|
||||
| cron_to_xmpp.py | 顶层(* 9-16) + position(*/5) | 停顶层(已停 crontab)|
|
||||
| divergence_detector.py | 工作日(*/30 8-15) + 周末(30 8-16/2) | 保留(两用途合理)|
|
||||
|
||||
### 问题 3:一份代码多版本(分叉)
|
||||
|
||||
| 文件 | 副本 | 状态 |
|
||||
|------|------|------|
|
||||
| market_watch.py | MoFin根(旧) vs deploy(新) | ❌ 分叉,根目录残留 |
|
||||
| promote_candidates.py | docs/backup 残留 | ❌ 备份未清理 |
|
||||
| self_todo_executor.py | deploy vs hermes vs AgentsMeeting | ⚠️ 新旧版并存 |
|
||||
| agents_health_check.py | MoFin/AgentsMeeting/self-growing | ⚠️ 三项目各自维护 |
|
||||
|
||||
**原则(红线)**:
|
||||
- 一份代码只存在于一个 canonical 位置(MoFin git 仓库)
|
||||
- deploy/profile-scripts ↔ hermes scripts 用硬链接(已规范)
|
||||
- 其他位置(根目录/backup/其他项目)不得有副本
|
||||
|
||||
### 问题 4:健康检查体系过度层级化
|
||||
|
||||
**现状 8 个健康类脚本**:
|
||||
```
|
||||
L0: agents_health_check(Tier1,5min)
|
||||
L1: morning_health_check(8:00 体检)+ intraday_health_check(15min)
|
||||
L1: functional_health_check(L1 功能检查,15min)
|
||||
L1: mofin_health(dashboard 数据,15min)
|
||||
L2: system_hygiene_audit(卫生审计)
|
||||
L3: self_repair(LLM 修复)
|
||||
L4: meta_watchdog(检查检查的检查)
|
||||
+ system_audit(全局审计 17:30)
|
||||
```
|
||||
|
||||
**问题**:8 个脚本职责重叠,互相引用,排查复杂
|
||||
**建议**:保留核心 4 层(Tier1/morning+intraday/functional/self_repair),合并冗余
|
||||
|
||||
---
|
||||
|
||||
## 三、逐任务设计文档(分类)
|
||||
|
||||
### 3.1 候选管道(核心链路)
|
||||
|
||||
```
|
||||
accumulation_scanner(*/10)→ candidates(sector=accumulation)
|
||||
→ candidate_filter(*/30,6阶段评分)
|
||||
→ promote_candidates(*/30,RR>=2 + 容量60)
|
||||
→ per_stock_reassess(12维重评)→ holding_strategies
|
||||
盘前: premarket_full_review(8:10)→ regenerate_all
|
||||
```
|
||||
|
||||
| 脚本 | 职责 | 调度 | 数据流 | 问题 |
|
||||
|------|------|------|--------|------|
|
||||
| accumulation_scanner | 主力建仓扫描 | */10 | 行情→candidates | 与新策略无关,保留 |
|
||||
| candidate_filter | 6阶段过滤 | */30 | candidates→评分 | 耦合 accumulation 设计 |
|
||||
| promote_candidates | 候选提拔 | */30 | candidates→自选 | RR>=2 门槛需适配 |
|
||||
| premarket_full_review | 盘前重评 | 8:10 | 全量重评 | 依赖缓存预热 |
|
||||
|
||||
### 3.2 策略扫描器(问题 1 核心)
|
||||
|
||||
| 脚本 | 职责 | 当前入口 | 重构后 |
|
||||
|------|------|---------|--------|
|
||||
| mr_scanner.py | v_weak 弱市扫描 | 嵌入 market_watch | 独立 cron |
|
||||
| s2_scanner.py | S2 恐慌买 | 嵌入 market_watch | 独立 cron |
|
||||
| **predictive_oversold_scanner** | **新策略(待建)** | 无 | 独立 cron |
|
||||
|
||||
### 3.3 数据采集
|
||||
|
||||
| 脚本 | 职责 | 调度 | 问题 |
|
||||
|------|------|------|------|
|
||||
| price_monitor | 价格(A+港股)| hermes */2 9-16 | ✅ 已统一 |
|
||||
| market_watch | 板块 | hermes */10 | ⚠️ 待拆策略扫描 |
|
||||
| capital_flow_collector | 资金流 | 1,31 9-15 | ✅ 已修锁 |
|
||||
| refresh_mtf_cache | 多周期缓存 | 50 7,11,14 | ✅ 已修 flush |
|
||||
| fundamentals_refresh | 基本面 | 早/午两次 | ⚠️ 午间可停?|
|
||||
| sector_enrich_cninfo | 行业富集 | 早/午两次 | ⚠️ 午间可停?|
|
||||
| macro_context_collector | 宏观新闻 | */30 | ✅ |
|
||||
| refresh_macro_context | 宏观上下文 | */30 | ✅ |
|
||||
| news_collector | 新闻 | crontab 30 9,13,17 | ✅ |
|
||||
| divergence_detector | 跨市场背离 | */30+周末 | ✅ |
|
||||
|
||||
### 3.4 健康自检(问题 4)
|
||||
|
||||
| 脚本 | 职责 | 调度 | 保留 |
|
||||
|------|------|------|------|
|
||||
| agents_health_check | Tier1 4服务 | */5 | ✅ |
|
||||
| morning_health_check | 每日体检 8类40项 | 8:00 | ✅ |
|
||||
| intraday_health_check | 盘中自检 | */15 | ✅ |
|
||||
| functional_health_check | L1 功能 | */15 | ✅ |
|
||||
| mofin_health | dashboard 数据 | */15 | ✅ |
|
||||
| self_repair | L3 LLM 修复 | */30 | ✅ |
|
||||
| meta_watchdog | L4 元监控 | 5min | ✅ |
|
||||
| system_hygiene_audit | 卫生审计 | 8:20 | ⚠️ 与 system_audit 重叠 |
|
||||
| system_audit | 全局审计 | 17:30 | ⚠️ 与 hygiene 重叠 |
|
||||
| system_health_check | 传统检查 | 已停 | ❌ 可归档 |
|
||||
|
||||
### 3.5 报告简报
|
||||
|
||||
| 脚本 | 职责 | 调度 | 备注 |
|
||||
|------|------|------|------|
|
||||
| opening_brief/closing_brief | 开/收盘简报 | 9:35/16:10 | ✅ |
|
||||
| market_insight | 知微洞察 | 15:35 | ✅ |
|
||||
| strategy_review | 策略复盘 | 20:00 | ✅ |
|
||||
| strategy_evaluator | 策略评估 | 每周/每日 | ⚠️ 每日版可停 |
|
||||
| collect_evaluation_data | 评估数据 | 20:30 | ✅ |
|
||||
| prepare_report_data | 报告数据 | 周四 | ✅ |
|
||||
|
||||
### 3.6 自成长
|
||||
|
||||
| 脚本 | 职责 | 调度 | 备注 |
|
||||
|------|------|------|------|
|
||||
| branch_scanner | 分支自成长 | 15min | ✅ |
|
||||
| prune_branches | 分支剪枝 | 21:00 | ✅ |
|
||||
| meta_growth | 元自成长 | 0:45/12:45 | ✅ |
|
||||
| hardcode_scanner | 硬编码扫描 | 17:25 | ✅ |
|
||||
|
||||
### 3.7 系统维护
|
||||
|
||||
| 脚本 | 职责 | 调度 | 备注 |
|
||||
|------|------|------|------|
|
||||
| deploy_guard | 部署守卫 | */15 | ✅ 核心 |
|
||||
| fix_gateway_port | gateway 看门狗 | 10min | ✅ 核心 |
|
||||
| agent_spiral_watchdog | 螺旋监控 | */10 | ✅ |
|
||||
| db_daily_backup | DB 备份 | 7:50 | ✅ |
|
||||
| vacuum_state_db | state.db 整理 | 周六 | ✅ |
|
||||
| system_audit | 全局审计 | 17:30 | ✅ |
|
||||
|
||||
---
|
||||
|
||||
## 四、重构方案(待老莫批准)
|
||||
|
||||
### 4.1 立即执行(低风险)
|
||||
1. **停顶层 jobs.json 残留**(16个 job 调度器已死)——enabled=False 或确认清理
|
||||
2. **清理 market_watch.py 根目录分叉**(旧版移 archive)
|
||||
3. **清理 promote_candidates.py backup 残留**
|
||||
4. **统一 agents_health_check**(确认三项目各自维护是否必要)
|
||||
|
||||
### 4.2 重构(中等风险,需测试)
|
||||
5. **拆 market_watch 策略扫描**:mr_scanner/s2_scanner 独立调度
|
||||
6. **fundamentals/sector_enrich 午间版停用**(早间足够)
|
||||
7. **评估每日版停用**(每周版足够)
|
||||
|
||||
### 4.3 为 p_oversold 准备
|
||||
8. **新建 predictive_oversold_scanner.py**(独立 cron,对齐 accumulation_scanner 模式)
|
||||
9. **候选管道适配**(p_oversold 走专属评估,绕过 RR>=2)
|
||||
|
||||
### 4.4 红线(杜绝多版本)
|
||||
- 一份代码一个 canonical 位置(MoFin git)
|
||||
- deploy↔hermes 硬链接(已规范)
|
||||
- 根目录不留脚本副本(库文件除外,且必须与 deploy 硬链)
|
||||
- 备份不进仓库
|
||||
|
||||
---
|
||||
|
||||
## 五、执行优先级
|
||||
|
||||
| 优先级 | 动作 | 风险 |
|
||||
|--------|------|------|
|
||||
| P0 | 停顶层 jobs 残留 + 清 market_watch 分叉 | 低 |
|
||||
| P1 | 拆策略扫描器独立调度 | 中 |
|
||||
| P2 | 停午间重复采集 | 低 |
|
||||
| P3 | 建 p_oversold 扫描器 | 中 |
|
||||
|
||||
> 待老莫确认后分批执行。
|
||||
Reference in New Issue
Block a user