Files
MoFin/docs/refactor-for-xiaoxiao.md
T

88 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# MoFin 数据管道重构需求 — 给笑笑的接手说明
## 一句话
把 decisions.json + portfolio.json + watchlist.json 三个文件合并到 mofin.db,建成一个统一的数据核心。
## 为什么必须重构(现有 6 个问题)
### 1. 价格币种混存
- `decisions.json` 的港股价格字段(price/stop_loss/take_profit/entry)存的是 **HKD 原值**
- `portfolio.json` 的港股字段存的是 **CNY 折算值(×0.87**
- 所有分析脚本读完这个文件去比较另一个文件,币种不同 → 判断全错
- 建滔积层板(01888)被误报止损触发 6+ 次,每次都是币种错配
### 2. 价格有多个入口,互不通信
- `price_monitor.py` 每 2 分钟拉一次 Tencent API,写 `portfolio.json`
- `per_stock_reassess.py` 自拉 Tencent API(可能加 ×0.87 转换),写 `decisions.json`
- `stale_push_wlin.py` 自拉 Tencent API,自己做比较
- 三个脚本各自拉价,各自写不同文件,相互覆盖,没有排它锁
### 3. 现金无系统化更新
- 每次 Dad 买/卖后,现金数字靠他截图 → 人工解析 → 手动改 `portfolio.json`
- 截图里的「冻结资金(T+2 未交收)」从来没被正确计入
- 没有 changelog,改了不知道改之前是多少
### 4. 总资产计算不一致
- 每个报告自己算:持仓市值(来自 portfolio.json 的多日前的价格)× 手数 + 现金
- 结果:同一天出现 85 万 / 92 万 / 95 万 / 100 万 四个不同数字
- 只应该有一个总资产字段随 price_monitor 实时价刷新
### 5. 没有唯一数据源
- price_monitor 是最可信的价格源(每 2 分钟 Tencent API
- 但报告脚本(stale_detector / stale_push_wlin)经常自己直接拉 API 获取价格
- 价格判断没有强制经过同一个入口
### 6. 策略和持仓分离在两个文件
- `decisions.json`:策略(止损/止盈/买入区/RR/timing_signal),52 条
- `portfolio.json`:持仓(股数/成本/现价/市值),19 持仓 + 现金
- `watchlist.json`:自选股,19 条,但和 decisions 有重叠
- 加一个策略要改三个文件,总是不同步
## 重构后的数据模型(建议)
```
mofin.db 统一数据库
├── holdings — 当前持仓(股数/成本/市价CNY/HKD/成本CNY/HKD
├── strategies — 所有策略(止损/止盈/买入区/RR/信号)
│ 包含 currency: HKD/CNY 标记
├── watchlist — 自选股列表(关联 strategies.id
├── cash_log — 现金变更记录(含冻结资金)
├── price_cache — price_monitor 推入的最新价格
└── total_assets — 唯一的总资产字段(每 2 分钟更新)
```
## 现有文件清单(全部要合并或废除)
| 文件 | 大小 | 用途 | 去向 |
|------|------|------|------|
| data/decisions.json | 52条 | 策略+持仓分析 | → strategies 表 |
| data/portfolio.json | 19持仓 | 持仓+现金+总资产 | → holdings + cash_log + total_assets |
| data/watchlist.json | 19自选 | 自选列表 | → watchlist 表 |
| data/mofin.db | (已有) | 市场数据+新闻+信号 | 不动,只加新表 |
| data/multi_tf_cache.json | 1000+K线 | 多周期K线缓存 | 不动 |
| data/live_prices.json | (无) | 计划中的统一价格缓存 | 如果做 → price_cache 表 |
## 不重构的痛苦指数
当前每个报告生成前要走的手动校验链(Dad 每 2~3 次报告就会发现一次严重数据错误):
1. 检查 decisions.json vs portfolio.json 价格是否一致 ← 经常不一致
2. 检查港股价格是不是 HKD ← 可能被脚本误转 CNY
3. 确认现金数字更新了 ← 可能还用昨天的
4. 手动算总资产 ← 和报告不同就出问题
Dad 原话(2026-06-30):「我说怎么办?定一个靠谱的自检策略出来。」
但自检策略只能发现错误,不能消除错误。根因是数据管道。
## 零乱改修复(如果不重构)
如果不做 DB 化重构,至少必须改这 4 处代码才能让系统稳定运行:
1. `price_monitor` 写 decisions.json 时同步所有文件的价格
2. `per_stock_reassess` 写 decisions.json 时通知 price_monitor 刷新
3. 现金变更从截图解析后强制写 changelog
4. 所有 LLM cron prompt 加「价格以 XX 文件为准,币种看 currency 字段」
这些只是补丁,不是根治。数据结构不改,所有补丁最终都会引入新的一致性故障。