Files
MoFin/docs/SYSTEM_ARCHITECTURE.md
T

13 KiB
Raw Blame History

MoFin 系统架构(3+1 Cron 层次 · 3+1 环节)

版本:2026-08-12 维护:小小莫(Sisyphus) 定位:系统架构权威文档——3+1 cron 层次 + 3+1 环节 + cron 体系统一 + 开发原则。 区别于方法论(3+6+12 研究方法,见 docs/research/methodology.md):本文档管系统怎么跑,方法论管策略怎么研究


一、3+1 Cron 层次(系统架构主干)

┌─────────────────────────────────────────────────────┐
│  L1 数据采集层(原始数据,不重复不缺失,各司其职)      │
│     外部 API/行情/新闻/基本面 → 原始表                 │
├─────────────────────────────────────────────────────┤
│  L2 数据加工层(衍生数据,不采集不使用)                │
│     原始数据 → 技术指标/行业指数/分位/多周期 → 衍生表   │
├─────────────────────────────────────────────────────┤
│  L3 数据使用层(只读数据,不采集不现算)                │
│     衍生数据 → 扫描/重评/候选/推荐 → 业务结果           │
├─────────────────────────────────────────────────────┤
│  L4 监控运维层(健康/审计/备份/推送/自修复)            │
│     贯穿三层的健康监控与系统自愈                        │
└─────────────────────────────────────────────────────┘

核心规则

  • 能拉取的拉取(采集层),拉不了的才自己算(加工层)——同一数据不重复来源
  • 统一规范,不遗漏不重复——指标单一权威算法,数据按层存储
  • 使用层只使用数据,不采集数据——扫描器/重评只读加工层预算值

二、3+1 环节(业务产出)

环节 本质 核心 cron(使用层)
选股(入自选) 扫描器选候选→过滤→提拔→入自选 predictive_oversold_scanner(p_oversold) / mr_scanner(v_weak) / accumulation_scanner → candidate_filter → promote_candidates
买入(盘中重评→买入推荐) 盘中根据策略区间触发重评,维持买入建议→发买入推荐 stale_push_wlin*/30 盘中,自选买入区提醒+触发重评,2026-08-12 恢复注册)
卖出(盘中重评→卖出推荐) 盘中根据策略区间触发重评,维持卖出建议→发卖出推荐 price_monitor(*/2 盘中,止盈区间/止损区间/移动止损/v_combo 波段出场 swing_out/swing_re/破止损操作信号)
每日重评(盘后移除) 盘后移除"不再具有近期投资价值"的票 watchlist_auto_exit50 8 盘前自选退出,2026-08-12 迁移到 hermes / clean_watchlist5 9 开盘前清理) / premarket_full_review10 8 盘前全量,已修) / per_stock_reassess0 12,15 自选12维重评,已恢复) / stale_detector(周末批量)

关键区分(老莫纠正 2026-08-12):买入和卖出本质一样——都是盘中重评(根据策略区间触发,维持操作建议→发买入或卖出推荐,stale_push_wlin 买入 + price_monitor 卖出/止损止盈一体)。每日重评是盘后(移除不再有价值的票,watchlist_auto_exit/clean_watchlist/premarket/per_stock/stale_detector)——盘后移除 ≠ 盘中卖出推荐。

三、环节 × 层次 Cron 映射(当前实际)

L1 数据采集层

cron 调度 数据
market_watch.py */10 9-11,13-15 * * 1-5 板块快照 market_snapshots + 大盘 regime
price_monitor.py */2 9-16 * * 1-5 实时价 live_pricesDB 唯一价格源)
capital_flow_collector.py 1,31 9-15 * * 1-5 资金流 stock_capital_flow⚠️ ERROR 待修)
macro_context_collector.py */30 8-16 * * * 宏观新闻 macro_raw_news
refresh_macro_context.py */30 9-15 * * 1-5 宏观上下文 macro_context_log
collect_evaluation_data.py 30 20 * * 1-5 策略评估数据
refresh_mtf_cache.py 50 7,11,14 * * 1-5 多周期 mtf_cache(兼加工)
fundamentals_refresh.py 52 7 * * 1-5 基本面 stock_fundamentals(早间,持仓/自选)
sector_enrich_cninfo.py 50 7 * * 1-5 行业富集 sector_snapshots(早间)
daily_kline_sh/sz.py 10/25 16 * * 1-5 全市场日K stock_daily2026-08-12 新增)
news_collector_full_b0-3.py 30-0 7-8 * * 1-5 全市场新闻 stock_news(新增)
fundamentals_full_refresh.py 35 16 * * 1-5 全市场基本面 stock_fundamentals(新增)

L2 数据加工层

cron 调度 产物
factor_engine.py 5 17 * * 1-5 技术指标 stock_indicators(26项) + 大盘 market_indicators + mcap_q/pe_q 分位(新增)
sector_index_builder.py 0 17 * * 1-5 行业指数 sector_index_dailystock_sectors_em 聚合 307 行业)(新增)
refresh_mtf_cache.py 50 7,11,14 * * 1-5 多周期均线 mtf_cache

L3 数据使用层

环节 cron 调度
选股 predictive_oversold_scanner.py 35 9 * * 1-5
选股 mr_scanner.py (v_weak) 35 9 * * 1-5
选股 accumulation_scanner.py */10 9-15 * * 1-5
选股 candidate_filter.py */30 9-15 * * 1-5
选股 promote_candidates.py */30 9-15 * * 1-5
买入(盘中重评→买入推荐) stale_push_wlin.py */30 9-15 * * 1-5(自选买入区提醒+触发重评)
卖出(盘中重评→卖出推荐) price_monitor.py */2 9-16 * * 1-5(止盈/止损/移动止损/波段出场/破止损信号)
每日重评 watchlist_auto_exit.py 50 8 * * 1-5(盘前自选退出)
每日重评 clean_watchlist.py 5 9 * * 1-5(开盘前自选清理)
每日重评 premarket_full_review.py 10 8 * * 1-5(盘前全量重评-自选退出,已修)
每日重评 per_stock_reassess.py 0 12,15 * * 1-5(自选 12 维重评+买入区提醒,已恢复)
每日重评 strategy-staleness-check.py 0 9 * * 1-5
每日重评 stale_detector.py 30 10 * * 0,6(周末批量)

L4 监控运维层

morning_health_check(0 8) / preflight_verify(30 8) / intraday_health_check(/15) / mofin_health(/15) / functional_health_check(/15) / system_audit(30 17) / system_hygiene_audit(20 8) / hardcode_scanner(25 17) / verify_reassess_pipeline(/30) / data_governance(0 10 周六) / memory_guardian(0 7) / meta_watchdog(5 * * * ) / self_repair(/30) / agent_spiral_watchdog(/10) / deploy_guard(/15) / self_todo_executor_v2(/10) / db_daily_backup(50 7) / vacuum_state_db(0 3 周六) / fix_gateway_port(10m) / cron_to_xmpp(/5) / opening_brief(35 9) / closing_brief(10 16) / market_insight(35 15) / macro_signal_consumer / divergence_detector(*/30) / strategy_evaluator(0 21 周六) / advice_reconciliation(0 20 周六) / prepare_report_data(0 20 周四)

四、数据流(采集 → 加工 → 使用)

腾讯/东财/THS/akshare API
  ↓【L1 采集】
stock_daily(K线) / stock_news(新闻) / stock_fundamentals(基本面)
stock_capital_flow(资金流) / market_snapshots(板块) / sector_index_daily(行业)
  ↓【L2 加工】
stock_indicators(技术指标26项) / market_indicators(大盘) / sector_index_daily(行业指数)
mtf_cache(多周期) / mcap_q/pe_q(分位)
  ↓【L3 使用】
扫描器(p_oversold/v_weak/accumulation) → candidates
  → candidate_filter → promote_candidates → watchlist_stocks(自选)
重评(premarket/per_stock) → 更新策略 / 移除自选
  ↓【L4 监控】
mofin_health(健康采集) → F健康 Dashboard(三层架构健康 + cron来源标记)

五、Cron 体系统一(强制开发原则)

🚫 自动任务必须部署在 hermesposition-analyst),严禁使用系统 crontab。

  • 唯一体系hermes cron/home/hmo/.hermes/profiles/position-analyst/cron/jobs.json
  • 禁止:系统 crontab 部署 MoFin 自动任务(避免新旧一起跑、状态不可见、无单例守卫)
  • 历史迁移watchlist_auto_exit / kanban_xmpp_bridge / parallel_batch / live_data_collector 已于 2026-08-12 从系统 crontab 迁移到 hermesnews_collector(旧版) / agents_health_check(MoFin) 已停用(与 hermes 重复)
  • 监控F 健康 cron 列表带来源标记 hermes 合规 / ⚠️ 系统cron 违规红色警告),顶部横幅提示本原则
  • 备份:系统 crontab 备份在 .backups/crontab_backup_*.txt

五.5 温区自适应系统(2026-08-13 落地)

核心:策略组合按当前市场温区(trend_up/choppy/trend_down)自动激活/休眠,选股/买入/卖出/每日重评四环节按温区感知执行。

温区三态判定

  • market_regime.py:三态判定(trend_up=above_ma20+adx≥20 / choppy=adx<20 / trend_down=below_ma20+adx≥20),回填 10 年(2016-20262319 条)
  • regime_tracker.py:滞回平滑(K=5 连续确认,数据选参:112周期/20.7天/无1天噪音),输出平滑温区 + regime_cycles 表
  • temp_band.py:温度分档(panic/fear/neutral/greed/euphoriarsi 连续量),仓位乘数(恐慌重仓/亢奋减仓)

策略-温区表现记录

  • regime_perf.pystrategy_regime_perf 表(策略×温区×胜率/均盈/样本),全策略动态纳入(含历史策略)
  • 发现v_mr_sel trend_down 93%、v7.3 trend_up 94%、v6.2 82% 等被埋没的温区强者

策略动态路由

  • strategy_router.py v5:动态策略库,当前温区实测胜率高者激活(>=50% 门槛剔除全负策略)
  • 输出 strategy_weights.json(当前温区/温度/各策略权重/激活状态)

策略执行调度

  • strategy_executor.py:温区策略调度器(*/30 盘中),按当前温区激活策略调度对应选股 scanner:
    • v_weak/v_mr/v_mr_sel → mr_scanner.py
    • v_oversold → predictive_oversold_scanner.py
    • s2_panic → s2_scanner.py
    • v_next4/v8.1/v_combo → leader_scanner.pytrend_up 适用)
  • 停用独立 scanner cronmr_scanner/predictive_oversold 已由调度器统一调度)

四环节温区感知

环节 温区接入
选股 strategy_executor 按温区激活策略调度 scanner;scanner 内部用平滑温区门控
买入 stale_push_wlin 温区过滤(非激活策略不推买入)+ 信号溯源([策略][温区]+共振标记)
卖出 price_monitor 温区感知(非激活策略买入机会抑制,风控卖出/止盈仍推)+ 信号溯源
每日重评 strategy_lifecycle 平滑温区(regime_gate)→ timing_signal 合成含市场阶段

信号溯源系统

  • signal_ledger.py:记录每次推送(策略/版本/温区/原因),多策略同推检测共振标记(🔥加关注)
  • signal_ledgercode/strategy/regime/pushed_at/resonance_count 等)

Cron 调度链(温区自适应)

时间 任务 作用
16:50 market_thermometer.py 市场测温(三态判定)
16:52 regime_tracker.py 滞回平滑(K=5+ regime_cycles 周期记录
16:55 strategy_router.py 策略路由(strategy_weights.json
*/30 盘中 strategy_executor.py 按激活策略调度选股 scanner
周五 17:00 strategy_alert.py 三振出局失效预警(滚动胜率/盈亏比)

六、开发原则(自动任务强约束)

  1. 单例守卫:每个定时脚本必须 _singleton_guardfcntl flock /tmp/mofin_locks/),防重复实例并发写(2026-08-05 进程堆积事故后统一加装)
  2. 600s 护栏hermes child_timeout 内完成;超时任务分批(如 daily_kline 分 sh/sz、news_collector_full 分 4 批)
  3. 幂等:数据写入用 INSERT OR REPLACE(同 key 覆盖,重跑安全);候选扫描当日幂等(同股30日去重+当天已扫跳过)
  4. 限速防封:外部 API 请求间隔(腾讯/东财 0.05-0.5s),批量上限(腾讯 100 只/批)
  5. git 版本管理:改动必须 commit 入库(deploy_guard 回滚机制);脚本文件不删除(保留作参考,停 cron 即可),crontab/cron 变更留备份
  6. 统一 hermes:自动任务只部署 hermes(见第五节)
  7. 口径一致:指标用 backtest_framework 权威算法(回测实盘同口径),使用层读加工层预算值,不现算

关联文档:方法论 docs/research/methodology.md3+6+12 研究方法)| 数据模型 portfolio-data-model.md 系统梳理 system-architecture-review-20260812.md(三层架构补缺过程)