Files
MoFin/docs/architecture-fix-20260819.md

3.1 KiB
Raw Permalink Blame History

MoFin 架构修复记录——holding_strategies 多写入方 + 快照污染(2026-08-19

背景

老莫发现系统有"幽灵重复实现"问题:holding_strategies 被 8 个写入方 + write_holding_strategy 高频打快照,导致:

  • 参数互相覆盖(一个模块写的参数被另一个覆盖)
  • 快照污染(strategy_history 频繁写入,但多数是无意义的"参数没变也快照")
  • 并发隐患(同一时刻多个模块写同一条记录)

发现(深挖证据)

写入方清单(8 个模块都在写同一张表)

per_stock_reassess      → 写策略参数(entry/stop/tp/rr/signal/full_analysis
promote_candidates     → 提拔时写新策略
holdings_reconciliation → 对账写
branch_scanner          → 分支扫描写
advice_reconciliation   → 建议对账写
clean_watchlist         → 清理写
prune_branches          → 剪枝写
import_holding_xls      → 导入写

快照污染量化(2026-08-19

  • 今天 strategy_history 2290 条
  • 66% 是同参数重复快照(无变化也照拍)
  • 同票被反复快照:00020 同参数快照 11 次

权威保护失效

  • AUTHORITY 日志 0 条(保护机制存在但从没触发过)
  • 权威保护只覆盖"信号降级",不覆盖"参数覆写"entry/stop/tp/rr
  • 导致 per_stock_reassess 重评成果被别的模块覆盖丢失

修复计划

A+D:快照瘦身

  • 快照前对比新旧内容:参数没变 → 不快照
  • 快照只留变化轨迹:记录 diff(变化的字段)而非全量参数

B+C:权威保护加固

  • 参数覆写保护per_stock_reassess 重评后 24h 内,其他 source_trigger 不得覆写参数
  • 权威判断:从"信号降级"扩展到"所有字段覆写"

最终修改结果

Commit 记录

Commit 内容
88885eae fix(P2-A+D): 快照瘦身——write_holding_strategy先对比新旧内容,无变化不快照(66%垃圾快照消除)
3cbd76f7 feat(P2-B+C): 权威保护加固——per_stock重评24h内其他源不得覆写参数(解决参数覆盖反复出bug)

关键改动

  1. mofin_db.py snapshot_strategy_history:加变化检测,有变化才快照
  2. mofin_db.py write_holding_strategy:权威保护扩展(参数覆写保护)

验证结果

  • 快照瘦身生效:连续无变化写不触发快照("参数无变化,跳过快照")
  • 权威保护生效per_stock 重评后 24h 内其他源无法覆写参数(AUTHORITY-24H 日志)

遗留问题(后续需处理)

  • 写入方收敛:8 个写入方未真正收敛(per_stock_reassess 是唯一权威写入方,但其他 7 个模块仍在写)——需要后续设计"统一写入入口"或"写入锁"
  • 并发隐患WAL 模式 + busy_timeout=30s 理论上安全,但 8 个模块各自开连接仍有风险——需观察

复盘要点

  • 快照瘦身消除了 66% 垃圾快照(今天 2290 → 预计 ~780 条)
  • 权威保护防止参数被其他源覆写(per_stock 重评成果得到保护)
  • 遗留:写入方收敛是下一步(需评估 8 个模块的功能必要性)