feat: mo_data.py unified read layer (DB-first, JSON fallback) + cash_log table + batch JSON→DB migration (16 files)
This commit is contained in:
@@ -40,3 +40,57 @@
|
||||
- 修复:portfolio.json用 shares*price 重新求和(858,542)+ 现金73,758 = 总资产932,300
|
||||
- 文件:portfolio.json, import_holding_xls.py(去掉港股double-conversion + 去硬编码现金默认)
|
||||
- 经验:Dad的现金=截图现金,holding文件没有现金行。券商最新市值已经含汇率换算。
|
||||
|
||||
## 2026-07-01
|
||||
|
||||
### 修复
|
||||
- [BUGFIX] macro_signal_consumer 修正覆盖信号仍导致level=high
|
||||
- 问题:LLM深度分析修正了采集器误报(写"修正覆盖"),但INSERT时保留了宏观-WATCH_HIGH sentiment。consumer聚合所有未处理信号时取最高级别→level=high,即使修正内容说"实际是MEDIUM"
|
||||
- 表现:state.json level=high但实际风险是MEDIUM。盘中自检持续产生"HIGH" TODO误报
|
||||
- 修复:consumer新增_effective_level()函数,检测"修正覆盖"摘要后取修正后的实际级别(HIGH→MEDIUM,零风险→INFO),不再只依赖sentiment字段
|
||||
- 文件:macro_signal_consumer.py → 聚合段新增_effective_level()逻辑
|
||||
- 配套:清理了state.json(恢复MEDIUM),关闭了残留TODO #39/#40
|
||||
- [DOC] macro-risk-scanner SKILL.md修正原则补充
|
||||
- 修正时必须同时更新overall_sentiment为修正后的级别(不再保留HIGH)
|
||||
- 修正后的INSERT使用正确sentiment(如宏观-WATCH_MEDIUM)
|
||||
- 新增SQL示例展示错误vs正确做法
|
||||
- 文件:SKILL.md → 修正原则段 + LLM修正工作流段
|
||||
|
||||
### 修复
|
||||
- [BUG] 个股行情数据来源不规范 — 海博思创266.02误读事件
|
||||
- 问题:2026-07-01 11:40对海博思创的分析中,我用了266.02作为当前价(实际265.00),并将K线描述为"光头光脚阴线"(实际是长下影线,低点248.68)。266.02来自新浪原始CSV的ask2字段(第二档卖盘价),被我误读为当前价
|
||||
- 根因:没有统一的权威价格源。LLM有时读portfolio.json、有时读decisions.json、有时直接解析原始API——解析CSV时字段极易混淆
|
||||
- 修复1(脚本级):创建 stock_quote.py — 统一行情查询工具。自动识别A股/港股,按东财→新浪→腾讯优先级获取,自带验证(price在[low,high]内,change_pct自洽)。输出结构化JSON,LLM禁止解析原始API
|
||||
- 修复2(管道级):mofin_collect.py 增加 stock_quote.py --all-holdings 注入步骤。每个cron分析前自动注入持仓行情数据,LLM只需读注入数据
|
||||
- 修复3(记忆级):增加"数据来源铁律"记忆条目——输出价格前必须验证
|
||||
- 文件:新增 MoFin/scripts/stock_quote.py,修改 mofin_collect.py(加步骤4),新增记忆条目
|
||||
- 原则:用脚本固定规范,不依赖LLM"随机遵守"
|
||||
### 审计
|
||||
- [AUDIT] 全系统"脚本强制规范"覆盖审计
|
||||
- 结果:开盘简报✓ 收盘简报✓ MoFin盘前中监控✓(已在mofin_collect中注入stock_quote) MoFin午后监控✓
|
||||
- 违规:策略评估-每日(stale_detector.py直接调用腾讯API) ✗ → 已修复:改调stock_quote.py,原腾讯API降级为兜底
|
||||
- 违规:策略评估SKILL.md写"数据源:腾讯API实时行情" ✗ → 已修复:改为"数据源:decisions.json/stock_quote.py"
|
||||
- 违规:芯片微装-价格监控prompt未指定数据源 ✗ → 已修复:添加"数据源铁律:从decisions.json或stock_quote.py获取"
|
||||
- 不修复:price_monitor.py是no_agent脚本,直接写portfolio.json供LLM读,不经过LLM解析,风险可控
|
||||
- ⚠️ 补充审计(12:21):此前标记「已修复」的 stale_detector.py 实际未改——代码仍直接调腾讯API qt.gtimg.cn。已重新修复:fetch_prices() 优先调 stock_quote.py,腾讯API降级为兜底fallback
|
||||
- 验证:stale_detector.py 当前运行输出正常(芯碁微装521.12 -5.15%、中钨高新95.86 +0.15%等),数据来源已切换至stock_quote.py
|
||||
- .pyc 回收规范验证:仅 macro_context_collector.py 有 .pyc 缓存(已清除+加固完整性校验),其余脚本 __pycache__ 为空
|
||||
|
||||
## 2026-07-01
|
||||
|
||||
### 修复: macro_context_collector.py .pyc缓存过期导致误报复发
|
||||
|
||||
发现: self-healing executor 报告 12:00 采集器误将 KOSPI -1%(正常日内波动)和基金经理展望(正面评论)判为 HIGH 宏观风险。
|
||||
|
||||
根因: .pyc 缓存过期。当前 .py 的 HIGH_PATTERNS 已包含"指数+跌幅≥2%"阈值和"指数+暴跌词"强词检测,但 cron 运行时 Python 加载了过期 .pyc(旧版模式),导致 KOSPI -1% 依然匹配旧版"指数.*跌幅"模式。
|
||||
|
||||
修改:
|
||||
1. 删除 `__pycache__/` + touch `.py` — 强制重新编译
|
||||
2. 《macro_context_collector.py》加固模式完整性校验 _PATTERN_CHECKS:
|
||||
- 新增 index 8 检查: 必须包含"暴跌|熔断|闪崩|重挫"(禁止"跌幅"弱词命中)
|
||||
- 新增 index 9 检查: 必须包含"[2-9]%"(禁止 1% 正常波动触发)
|
||||
- 新增 _KNOWN_BAD_SIGS 旧版签名扫描: 检查"指数.*跌幅""|核|""英伟达|nvidia.*跌""导弹.*发射"是否残留
|
||||
3. 清除 stale macro_risk_state.json(level=high→expired)
|
||||
4. 关闭 TODO #41
|
||||
|
||||
验证: 三条误报标题在修复后均不触发 HIGH 匹配。
|
||||
|
||||
@@ -0,0 +1,159 @@
|
||||
# decisions.json → SQLite 数据库迁移需求
|
||||
|
||||
## 背景
|
||||
|
||||
当前系统所有策略数据存在 `/home/hmo/web-dashboard/data/decisions.json`,一个约 50~60 条策略的 JSON 文件。
|
||||
|
||||
## 现状痛点
|
||||
|
||||
| 问题 | 举例 |
|
||||
|------|------|
|
||||
| 没有写入锁,并发写会损坏 | price_monitor + per_stock_reassess 同时写,JSON 截断 |
|
||||
| 币种字段不统一 | 港股 price 曾经存 HKD 也存过 CNY,修了几轮才用 currency 标记 |
|
||||
| 缺乏 schema 校验 | 空字段、类型错误(str 写成了 int)无声失败 |
|
||||
| 无 changelog 审计 | 谁在什么时候改了哪个字段,查不了 |
|
||||
| 没有事务回滚 | 写一半 crash,整个文件废了 |
|
||||
| 只能全量读 | 50 条策略每次全部加载,浪费 token |
|
||||
| 各脚本自拉价格 | stale_detector 拉一次腾讯 API,per_stock_reassess 又拉一次 |
|
||||
|
||||
## 需求目标
|
||||
|
||||
**单线程写入 / 多线程安全读**。
|
||||
将 decisions.json 迁移到 `mofin.db`(已有该数据库),建 `strategies` 表。
|
||||
|
||||
## 表结构
|
||||
|
||||
```sql
|
||||
CREATE TABLE strategies (
|
||||
code TEXT PRIMARY KEY, -- 股票代码,如 "00700"
|
||||
name TEXT NOT NULL, -- 股票名称
|
||||
type TEXT DEFAULT '自选策略', -- 持仓策略 / 自选策略
|
||||
status TEXT DEFAULT 'active', -- active / updated / stale
|
||||
currency TEXT DEFAULT 'CNY', -- CNY / HKD。港股固定 HKD
|
||||
|
||||
-- 价格与仓位
|
||||
price REAL, -- 最新价格(原始币种,港股=HKD,A股=CNY)
|
||||
price_cny REAL, -- 折算为人民币的价格(统一口径用)
|
||||
cost REAL, -- 持仓成本(有持仓时)
|
||||
shares INTEGER, -- 持仓股数
|
||||
share INTEGER, -- 同 shares,历史遗留字段
|
||||
|
||||
-- 策略参数
|
||||
entry_low REAL, -- 买入区间下沿(原始币种)
|
||||
entry_high REAL, -- 买入区间上沿(原始币种)
|
||||
stop_loss REAL, -- 止损价
|
||||
take_profit REAL, -- 止盈/目标价
|
||||
stop_loss_cny REAL, -- 止损(人民币,统一口径用)
|
||||
take_profit_cny REAL, -- 止盈(人民币)
|
||||
rr_ratio REAL, -- 盈亏比
|
||||
timing_signal TEXT, -- 短词信号:买入/加仓/持有/观望/冷却中
|
||||
|
||||
-- 来源与状态
|
||||
trigger_reason TEXT, -- 策略生成原由
|
||||
created_at TEXT, -- ISO时间
|
||||
updated_at TEXT, -- 最后更新时间
|
||||
reassessed_at TEXT, -- 最近一次重评时间
|
||||
action TEXT, -- 最新操作摘要文本
|
||||
|
||||
-- JSON 嵌套字段(存为 TEXT,应用层 JSON parse)
|
||||
analysis TEXT, -- JSON: 分析详情
|
||||
trigger TEXT, -- JSON: 触发条件
|
||||
changelog TEXT, -- JSON: 变更历史数组
|
||||
signal_factors TEXT, -- JSON: 因子列表
|
||||
tech_snapshot TEXT, -- JSON: 技术面快照
|
||||
action_note TEXT, -- 长文本动作说明
|
||||
sector_context TEXT -- 行业上下文
|
||||
);
|
||||
```
|
||||
|
||||
### 为什么不全部展开成列
|
||||
|
||||
analysis 和 trigger 有嵌套结构且未来可能加字段。存 JSON 字符串,应用层 parse。查询止损/止盈用 `json_extract()`。
|
||||
|
||||
## 读写接口需求
|
||||
|
||||
### 写操作(高频,每 2 分钟)
|
||||
|
||||
price_monitor 每轮更新所有持仓 + 自选的价格:
|
||||
|
||||
```sql
|
||||
INSERT INTO strategies (code, price, price_cny, currency, updated_at)
|
||||
VALUES (?, ?, ?, ?, ?)
|
||||
ON CONFLICT(code) DO UPDATE SET
|
||||
price = excluded.price,
|
||||
price_cny = excluded.price_cny,
|
||||
updated_at = excluded.updated_at;
|
||||
```
|
||||
|
||||
价格更新不涉及其他字段。港股:price=HKD,price_cny=HKD×汇率。
|
||||
A股:price=price_cny。
|
||||
|
||||
### 写操作(低频,策略重评时)
|
||||
|
||||
per_stock_reassess 跑完单股重评后更新全部策略参数:
|
||||
|
||||
```sql
|
||||
UPDATE strategies SET
|
||||
entry_low = ?, entry_high = ?, stop_loss = ?,
|
||||
take_profit = ?, rr_ratio = ?, timing_signal = ?,
|
||||
stop_loss_cny = ?, take_profit_cny = ?,
|
||||
currency = ?,
|
||||
analysis = ?,
|
||||
trigger = ?,
|
||||
reassessed_at = ?,
|
||||
changelog = json_insert(changelog, '$[#]', ?)
|
||||
WHERE code = ?;
|
||||
```
|
||||
|
||||
### 读操作(各报告脚本)
|
||||
|
||||
所有 LLM cron、no_agent 脚本统一从 `strategies` 表读,不再拉腾讯 API:
|
||||
|
||||
```sql
|
||||
SELECT * FROM strategies WHERE status = 'active' ORDER BY code;
|
||||
```
|
||||
|
||||
按币种过滤:
|
||||
```sql
|
||||
SELECT * FROM strategies WHERE currency = 'HKD';
|
||||
```
|
||||
|
||||
读某只具体股票:
|
||||
```sql
|
||||
SELECT * FROM strategies WHERE code = '00700';
|
||||
```
|
||||
|
||||
## 不变的输出
|
||||
|
||||
1. **保留 decisions.json 同步输出**(过渡期 2 周)。每次写 DB 后,同步写一份 decisions.json 给旧脚本兼容。
|
||||
2. **输出格式不做大改**。JSON decode analysis/trigger 后保持现有字段名。
|
||||
|
||||
## 不允许的行为
|
||||
|
||||
1. ❌ 各脚本自行拉腾讯 API 获取价格。价格入口只有 price_monitor。
|
||||
2. ❌ 直接写 decisions.json。全部走 DB。
|
||||
3. ❌ 变更 decisions.json 的输出字段名/格式(过渡期兼容)。
|
||||
|
||||
## 验收标准
|
||||
|
||||
1. `strategies` 表有数据,decisions.json 和 `SELECT * FROM strategies` 内容一致
|
||||
2. price_monitor 跑一轮后 DB 里的 price 更新正确(港股 HKD,A 股 CNY)
|
||||
3. per_stock_reassess 跑完单股后 DB 里对应股票策略更新
|
||||
4. stale_detector 从 DB 读数据,输出和从 JSON 读一样
|
||||
5. 并发读写(price_monitor 2min + stale_detector 同时跑)不损坏数据
|
||||
6. 迁移后旧 decisions.json 仍同步更新
|
||||
|
||||
## 相关文件路径
|
||||
|
||||
| 文件 | 说明 |
|
||||
|------|------|
|
||||
| `/home/hmo/MoFin/price_monitor.py` | 价格监控,每2分钟写price |
|
||||
| `/home/hmo/MoFin/scripts/strategy_lifecycle.py` | 策略生命周期,reassess_strategy() |
|
||||
| `/home/hmo/MoFin/scripts/per_stock_reassess.py` | 单股重评入口 |
|
||||
| `/home/hmo/MoFin/scripts/stale_push_wlin.py` | 自选买入提醒 |
|
||||
| `/home/hmo/web-dashboard/data/decisions.json` | 当前JSON文件 |
|
||||
| `/home/hmo/MoFin/data/mofin.db` | 目标数据库(已有market/trend等表) |
|
||||
|
||||
## 联系人
|
||||
|
||||
有问题问 hmo(老爸)。笑笑负责代码实现,测试完成后通知老爸验收。
|
||||
Reference in New Issue
Block a user