feat: 策略复盘闭环 Phase1

- 新增 scripts/strategy_review.py: 遍历所有active策略
  - 腾讯API实时价对比止损/止盈/入场点
  - 分类: correct/wrong/partial/pending
  - 失败模式归因: 止损过紧/入场过早/止盈过远等
  - 写入 accuracy_stats 表(首条真实数据)
- 新增 docs/strategy-review-loop.md: 完整闭环设计文档
- 含失败模式→修复方向映射表

Phase1 结果: 38条策略, 94.7%准确率(19条待定), 1条止损过紧
This commit is contained in:
知微
2026-06-25 19:58:00 +08:00
parent 147d6d0fa2
commit b053103377
35 changed files with 56075 additions and 51863 deletions
Binary file not shown.
Binary file not shown.
+75
View File
@@ -20,3 +20,78 @@
- 自选股18只全部处于买入区(价格距离买入区<3%),属正常范围
- 其中2只策略为空(楚江新材、中谷物流)— 需补充
- 整体仓位93.02%,弱势+深套占比41.9%>40%
## 2026-06-25 11:50 价格监控updated_at修复
**发现了什么:** 健康检查误报"价格数据649秒未更新(portfolio.json"
**根因链:**
1. `price_monitor.py` 写 portfolio.json 时仅在价格变化时写入,且不更新 `updated_at` 字段
2. 盘中价格稳定(如午盘横盘)→ portfolio.json 长时间不更新 → `updated_at` 停留在上次变动时间
3. `intraday_health_check.py` 检查 `updated_at` 是否超过10分钟无更新 → 触发误报
**修改了什么:**
- 文件:`/home/hmo/MoFin/price_monitor.py`(同步到 profile scripts 副本)
- 逻辑变更:
- 价格变化写入时:同时更新 `pf['updated_at']` 为当前时间
- 价格无变化时:每10分钟强制刷新一次 `updated_at`,避免横盘期误报
**效果预期:** 价格稳定横盘时 portfolio.json 的 updated_at 仍每10分钟刷新一次,健康检查不再误报。
## 2026-06-25 13:20 stale_push_wlin 流程修复:先重评后推送
**发现了什么:** 自选买入提醒中推送的策略数据可能滞后。例如13:11报告中德明利止盈810.78但现价882已超过。
**根因链:**
1. stale_push_wlin 只在 `[STRATEGY_STALE]` 标记的票触发重评,非stale的票直接推旧策略
2. 策略的止盈/止损/信号在推送前未刷新,可能出现推了止盈位但价格已超过的情况
3. Dad 指出正确流程应该是:推荐前先重评 → 重评确认有效再推
**修改了什么:**
- 文件:`/home/hmo/.hermes/profiles/position-analyst/scripts/stale_push_wlin.py`
- 逻辑变更:
- 收集所有在买入区的自选(stale + 非stale),统一先调 trigger_regen_sync() 重评
- 重评完成后重新读取 decisions.json 获取最新策略数据
- 用重评后的 timing_signal 重新判断是否可推(不再用旧 is_stale 标记)
- 同一次推送中可能有多只票,全部用新数据出报告
**效果预期:** 每次推送自选提醒前,所有预推票都经过最新一次策略重评,止盈/止损/信号不滞后。
## 2026-06-25 14:00 三点联动修复
**发现了什么:** Dad反馈三个问题:(1) price_monitor的区进区出/重评告警太吵 (2) 现金只有total字段,没有区分可用/冻结,买力算错 (3) 德明利卖出后未及时更新止盈
**修改了什么:**
**① price_monitor XMPP推送降噪**
- 文件:`/home/hmo/MoFin/price_monitor.py`
- 原:所有outputs(⚡进入买入区 🔄重评 📊新策略 ✅全量重评)全部推XMPP
- 改:只推 ⚠️止损跌破 和 🌀情景切换,其余只local print不推
**② 现金三级结构**
- 文件:`/home/hmo/MoFin/data/portfolio.json`
- 新增 `cash_available`(可用买力)和 `cash_frozen`(冻结在途)字段
- stale_push_wlin.pyload_cash() 和 calc_position() 优先读 cash_availablefallback到 cash
- 推荐中的买力计算现在用可用现金而非总现金
**③ 德明利自选策略重评**
- 文件中:`/home/hmo/MoFin/data/decisions.json`
- 原止盈810.78(已被涨停突破)
- 新止损810.0 新止盈1153.26 新买入区873.18~908.82 | RR=3.24
- 已保证自选策略和其他自选一样走自动重评流程
**效果预期:** 系统不再推送区进出/重评噪音,推荐用可用现金算买力,德明利自选随时可重新入场。
## 2026-06-25 14:50 price_monitor 自选止损止盈告警屏蔽
**发现了什么:** 德明利(001309)已清仓转自选,但 price_monitor 仍对其推送止盈警报("⚡ 德明利进入止盈区间"),数据无误但信号无意义,在Dad卖飞后伤口撒盐。
**根因:** get_trigger_zones() 对自选和持仓一视同仁返回止损/止盈区间,price_monitor检查所有active decision。
**修改了什么:**
- 文件:`/home/hmo/MoFin/price_monitor.py`
- 函数 `get_trigger_zones(d)`
- 买入区间:自选和持仓都监控(自选需要zone to trigger重评)
- 止损+止盈:仅持仓(share>0)才监控,自选不生成止损/止盈zone
**效果预期:** 已清仓的德明利/药明康德等自选不再推送止损止盈告警。买入区进出仍触发重评(内部不推送),保证策略持续更新。
+17816 -875
View File
File diff suppressed because it is too large Load Diff
+133 -133
View File
@@ -1,154 +1,154 @@
{
"updated_at": "2026-06-24 12:00:22",
"data_timestamp": "2026-06-24 12:00:00",
"updated_at": "2026-06-25 12:00:51",
"data_timestamp": "2026-06-25 12:00:00",
"session": "midday",
"has_valid_data": true,
"indices": {
"上证指数": {
"price": 4096.14,
"change_pct": -0.25,
"high": 4113.19,
"low": 4075.49
"price": 4125.76,
"change_pct": 0.36,
"high": 4133.1,
"low": 4093.01
},
"深证成指": {
"price": 15906.57,
"change_pct": 0.33,
"high": 15943.66,
"low": 15730.16
"price": 16285.83,
"change_pct": 1.46,
"high": 16303.39,
"low": 16058.85
},
"创业板指": {
"price": 4209.9,
"change_pct": 0.42,
"high": 4233.7,
"low": 4161.58
"price": 4336.74,
"change_pct": 2.01,
"high": 4338.71,
"low": 4242.86
},
"科创50": {
"price": 1963.82,
"change_pct": 2.48,
"high": 1975.25,
"low": 1886.74
"price": 2072.5,
"change_pct": 4.18,
"high": 2076.88,
"low": 2000.8
},
"恒生指数": {
"price": 23353.31,
"change_pct": 0.07,
"high": 23521.52,
"low": 23248.87
"price": 23038.52,
"change_pct": -1.6,
"high": 23388.5,
"low": 23004.75
},
"国企指数": {
"price": 7756.13,
"change_pct": -0.04,
"high": 7817.92,
"low": 7718.92
"price": 7601.15,
"change_pct": -2.11,
"high": 7757.49,
"low": 7583.03
}
},
"structure": {
"overall": "bullish",
"overall": "strong_bullish",
"description": "科技成长领涨"
},
"key_sectors": [
{
"name": "国证芯片",
"change_pct": 3.2
"change_pct": 5.17
},
{
"name": "上证信息",
"change_pct": 2.99
},
{
"name": "通用航空",
"change_pct": -1.27
},
{
"name": "上证周期",
"change_pct": -1.12
},
{
"name": "新能电池",
"change_pct": 1.0
},
{
"name": "上证资源",
"change_pct": -0.64
},
{
"name": "治理指数",
"change_pct": -0.58
"change_pct": 4.32
},
{
"name": "机器人产业",
"change_pct": -0.5
"change_pct": -1.11
},
{
"name": "通用航空",
"change_pct": -1.05
},
{
"name": "上证资源",
"change_pct": -0.88
},
{
"name": "新能电池",
"change_pct": -0.38
},
{
"name": "上证周期",
"change_pct": -0.22
},
{
"name": "治理指数",
"change_pct": -0.13
}
],
"top_gainers": [
{
"name": "化学制药",
"name": "机场航运",
"code": "",
"price": 0,
"change": 3.68,
"volume": 2844.37,
"turnover": 477.43,
"net_inflow": -1.16,
"up_count": 144,
"down_count": 13,
"avg_price": 16.79,
"lead_stock": "新赣江",
"lead_stock_change": 27.9
"change": 4.26,
"volume": 1319.21,
"turnover": 65.18,
"net_inflow": 13.1,
"up_count": 13,
"down_count": 0,
"avg_price": 4.94,
"lead_stock": "华夏航空",
"lead_stock_change": 10.03
},
{
"name": "生物制品",
"name": "保险",
"code": "",
"price": 0,
"change": 2.96,
"volume": 808.83,
"turnover": 136.16,
"net_inflow": -0.75,
"up_count": 47,
"down_count": 7,
"avg_price": 16.83,
"lead_stock": "赛升药业",
"lead_stock_change": 18.44
"change": 3.56,
"volume": 348.27,
"turnover": 106.54,
"net_inflow": 6.75,
"up_count": 5,
"down_count": 0,
"avg_price": 30.59,
"lead_stock": "中国人保",
"lead_stock_change": 5.63
},
{
"name": "医疗服务",
"name": "证券",
"code": "",
"price": 0,
"change": 2.39,
"volume": 1079.74,
"turnover": 225.78,
"net_inflow": -0.93,
"up_count": 44,
"down_count": 11,
"avg_price": 20.91,
"lead_stock": "睿智医药",
"lead_stock_change": 19.95
},
{
"name": "医药商业",
"code": "",
"price": 0,
"change": 2.35,
"volume": 502.07,
"turnover": 44.73,
"net_inflow": -0.09,
"up_count": 29,
"down_count": 3,
"avg_price": 8.91,
"lead_stock": "合富中国",
"change": 3.31,
"volume": 5369.91,
"turnover": 678.34,
"net_inflow": 62.2,
"up_count": 50,
"down_count": 0,
"avg_price": 12.63,
"lead_stock": "中信建投",
"lead_stock_change": 9.99
},
{
"name": "中药",
"name": "元件",
"code": "",
"price": 0,
"change": 2.18,
"volume": 1208.33,
"turnover": 107.45,
"net_inflow": 2.87,
"up_count": 57,
"down_count": 10,
"avg_price": 8.89,
"lead_stock": "特一药业",
"lead_stock_change": 9.97
"change": 2.55,
"volume": 1951.11,
"turnover": 1357.67,
"net_inflow": 87.09,
"up_count": 42,
"down_count": 20,
"avg_price": 69.58,
"lead_stock": "中京电子",
"lead_stock_change": 10.02
},
{
"name": "白酒",
"code": "",
"price": 0,
"change": 2.25,
"volume": 210.31,
"turnover": 122.56,
"net_inflow": 8.5,
"up_count": 18,
"down_count": 1,
"avg_price": 58.28,
"lead_stock": "酒鬼酒",
"lead_stock_change": 7.88
}
],
"top_losers": [
@@ -156,45 +156,45 @@
"name": "贵金属",
"code": "",
"price": 0,
"change": -8.6,
"volume": 1529.11,
"turnover": 390.56,
"net_inflow": -61.53,
"up_count": 1,
"down_count": 13,
"avg_price": 25.54,
"change": -3.86,
"volume": 933.0,
"turnover": 231.38,
"net_inflow": -19.5,
"up_count": 0,
"down_count": 14,
"avg_price": 24.8,
"lead_stock": "株冶集团",
"lead_stock_change": 4.42
"lead_stock_change": -1.23
},
{
"name": "小金属",
"name": "教育",
"code": "",
"price": 0,
"change": -5.58,
"volume": 2154.58,
"turnover": 1125.15,
"net_inflow": -68.28,
"up_count": 4,
"down_count": 25,
"avg_price": 52.22,
"lead_stock": "长裕集团",
"lead_stock_change": 9.99
"change": -2.98,
"volume": 223.13,
"turnover": 10.17,
"net_inflow": -1.14,
"up_count": 2,
"down_count": 13,
"avg_price": 4.56,
"lead_stock": "*ST高科",
"lead_stock_change": 2.02
},
{
"name": "工业金属",
"name": "农化制品",
"code": "",
"price": 0,
"change": -5.53,
"volume": 6361.35,
"turnover": 809.03,
"net_inflow": -125.48,
"up_count": 5,
"down_count": 50,
"avg_price": 12.72,
"lead_stock": "锌业股份",
"lead_stock_change": 6.35
"change": -2.69,
"volume": 1142.32,
"turnover": 172.6,
"net_inflow": -15.41,
"up_count": 3,
"down_count": 58,
"avg_price": 15.11,
"lead_stock": "兴发集团",
"lead_stock_change": 3.13
}
],
"sector_up_ratio": 48.9,
"sector_mood": "neutral"
"sector_up_ratio": 11.1,
"sector_mood": "bearish"
}
+35278 -49790
View File
File diff suppressed because it is too large Load Diff
+576 -558
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+234 -8
View File
@@ -53,6 +53,12 @@
"high": 116.94,
"low": 105.76,
"close": 115.4
},
{
"date": "2026-06-25",
"high": 118.5,
"low": 106.9,
"close": 117.36
}
],
"002594": [
@@ -109,6 +115,12 @@
"high": 88.32,
"low": 82.78,
"close": 83.3
},
{
"date": "2026-06-25",
"high": 84.7,
"low": 81.34,
"close": 82.2
}
],
"00700": [
@@ -165,6 +177,12 @@
"high": 439.8,
"low": 412.6,
"close": 428.8
},
{
"date": "2026-06-25",
"high": 439.8,
"low": 412.6,
"close": 418.6
}
],
"000700": [
@@ -221,6 +239,12 @@
"high": 15.6,
"low": 14.3,
"close": 14.52
},
{
"date": "2026-06-25",
"high": 15.22,
"low": 13.81,
"close": 13.89
}
],
"001309": [
@@ -277,6 +301,12 @@
"high": 816.88,
"low": 706.0,
"close": 810.0
},
{
"date": "2026-06-25",
"high": 891.0,
"low": 743.51,
"close": 891.0
}
],
"00968": [
@@ -333,6 +363,12 @@
"high": 2.26,
"low": 1.93,
"close": 2.0
},
{
"date": "2026-06-25",
"high": 2.08,
"low": 1.93,
"close": 2.06
}
],
"00981": [
@@ -389,6 +425,12 @@
"high": 86.45,
"low": 76.5,
"close": 84.8
},
{
"date": "2026-06-25",
"high": 88.7,
"low": 77.6,
"close": 86.0
}
],
"01070": [
@@ -445,6 +487,12 @@
"high": 13.47,
"low": 12.55,
"close": 13.1
},
{
"date": "2026-06-25",
"high": 13.29,
"low": 12.55,
"close": 12.55
}
],
"01088": [
@@ -501,6 +549,12 @@
"high": 43.14,
"low": 41.26,
"close": 41.9
},
{
"date": "2026-06-25",
"high": 42.18,
"low": 40.44,
"close": 40.4
}
],
"01211": [
@@ -557,6 +611,12 @@
"high": 78.3,
"low": 74.2,
"close": 75.95
},
{
"date": "2026-06-25",
"high": 77.45,
"low": 74.2,
"close": 76.2
}
],
"01478": [
@@ -613,6 +673,12 @@
"high": 8.54,
"low": 7.51,
"close": 7.69
},
{
"date": "2026-06-25",
"high": 7.88,
"low": 7.11,
"close": 7.16
}
],
"01888": [
@@ -669,6 +735,12 @@
"high": 97.4,
"low": 83.7,
"close": 93.55
},
{
"date": "2026-06-25",
"high": 107.2,
"low": 87.6,
"close": 104.2
}
],
"02202": [
@@ -725,6 +797,12 @@
"high": 2.53,
"low": 2.31,
"close": 2.31
},
{
"date": "2026-06-25",
"high": 2.45,
"low": 2.21,
"close": 2.24
}
],
"02318": [
@@ -781,6 +859,12 @@
"high": 55.5,
"low": 52.3,
"close": 52.85
},
{
"date": "2026-06-25",
"high": 53.9,
"low": 51.2,
"close": 51.45
}
],
"02359": [
@@ -837,6 +921,12 @@
"high": 145.0,
"low": 130.0,
"close": 141.7
},
{
"date": "2026-06-25",
"high": 148.9,
"low": 131.3,
"close": 145.2
}
],
"02388": [
@@ -893,6 +983,12 @@
"high": 47.86,
"low": 45.9,
"close": 46.52
},
{
"date": "2026-06-25",
"high": 47.58,
"low": 45.9,
"close": 46.32
}
],
"02628": [
@@ -949,6 +1045,12 @@
"high": 30.56,
"low": 28.06,
"close": 28.32
},
{
"date": "2026-06-25",
"high": 29.48,
"low": 27.62,
"close": 28.3
}
],
"06160": [
@@ -1005,6 +1107,12 @@
"high": 168.6,
"low": 160.0,
"close": 165.2
},
{
"date": "2026-06-25",
"high": 168.9,
"low": 162.8,
"close": 166.2
}
],
"06869": [
@@ -1061,6 +1169,12 @@
"high": 305.0,
"low": 251.2,
"close": 261.2
},
{
"date": "2026-06-25",
"high": 288.0,
"low": 251.2,
"close": 287.0
}
],
"09868": [
@@ -1117,6 +1231,12 @@
"high": 52.3,
"low": 48.82,
"close": 49.14
},
{
"date": "2026-06-25",
"high": 50.8,
"low": 46.56,
"close": 47.42
}
],
"09988": [
@@ -1173,6 +1293,12 @@
"high": 103.4,
"low": 97.65,
"close": 99.4
},
{
"date": "2026-06-25",
"high": 101.5,
"low": 94.0,
"close": 94.6
}
],
"300035": [
@@ -1229,6 +1355,12 @@
"high": 17.1,
"low": 15.96,
"close": 16.08
},
{
"date": "2026-06-25",
"high": 16.41,
"low": 14.96,
"close": 15.13
}
],
"300124": [
@@ -1285,17 +1417,15 @@
"high": 68.8,
"low": 65.74,
"close": 66.31
},
{
"date": "2026-06-25",
"high": 70.32,
"low": 65.74,
"close": 66.84
}
],
"300548": [
{
"date": "2026-03-27",
"open": 145.73,
"close": 150.7,
"high": 154.82,
"low": 142.25,
"volume": 192929.0
},
{
"date": "2026-03-30",
"open": 146.71,
@@ -1757,6 +1887,12 @@
"high": 309.6,
"low": 275.86,
"close": 282.23
},
{
"date": "2026-06-25",
"high": 299.97,
"low": 274.59,
"close": 281.9
}
],
"300750": [
@@ -1813,6 +1949,12 @@
"high": 414.04,
"low": 386.66,
"close": 395.36
},
{
"date": "2026-06-25",
"high": 402.55,
"low": 386.66,
"close": 401.9
}
],
"518880": [
@@ -1869,6 +2011,12 @@
"high": 8.674,
"low": 8.426,
"close": 8.515
},
{
"date": "2026-06-25",
"high": 8.53,
"low": 8.267,
"close": 8.287
}
],
"600036": [
@@ -2031,6 +2179,12 @@
"high": 178.76,
"low": 160.6,
"close": 178.76
},
{
"date": "2026-06-25",
"high": 191.55,
"low": 161.95,
"close": 190.04
}
],
"600739": [
@@ -2149,6 +2303,12 @@
"high": 30.0,
"low": 27.33,
"close": 27.65
},
{
"date": "2026-06-25",
"high": 27.97,
"low": 25.73,
"close": 25.92
}
],
"688411": [
@@ -2205,6 +2365,12 @@
"high": 285.98,
"low": 261.8,
"close": 266.19
},
{
"date": "2026-06-25",
"high": 283.6,
"low": 261.66,
"close": 275.89
}
],
"688639": [
@@ -2261,6 +2427,12 @@
"high": 22.47,
"low": 20.99,
"close": 21.4
},
{
"date": "2026-06-25",
"high": 22.03,
"low": 17.12,
"close": 17.12
}
],
"688795": [
@@ -2317,6 +2489,12 @@
"high": 745.2,
"low": 660.01,
"close": 704.8
},
{
"date": "2026-06-25",
"high": 717.58,
"low": 669.0,
"close": 700.0
}
],
"688802": [
@@ -2373,6 +2551,12 @@
"high": 808.0,
"low": 726.1,
"close": 770.19
},
{
"date": "2026-06-25",
"high": 786.8,
"low": 726.1,
"close": 770.52
}
],
"688981": [
@@ -2429,6 +2613,12 @@
"high": 156.35,
"low": 139.6,
"close": 151.53
},
{
"date": "2026-06-25",
"high": 158.66,
"low": 141.32,
"close": 156.86
}
],
"000711": [
@@ -2467,6 +2657,12 @@
"high": 5.38,
"low": 4.86,
"close": 5.04
},
{
"date": "2026-06-25",
"high": 5.25,
"low": 4.79,
"close": 4.79
}
],
"688630": [
@@ -2499,6 +2695,12 @@
"high": 515.85,
"low": 455.55,
"close": 513.88
},
{
"date": "2026-06-25",
"high": 563.89,
"low": 455.55,
"close": 555.5
}
],
"300690": [
@@ -2551,6 +2753,12 @@
"high": 113.99,
"low": 94.79,
"close": 100.08
},
{
"date": "2026-06-25",
"high": 107.58,
"low": 94.79,
"close": 105.68
}
],
"300308": [
@@ -2571,6 +2779,12 @@
"high": 1395.0,
"low": 1282.15,
"close": 1312.18
},
{
"date": "2026-06-25",
"high": 1345.09,
"low": 1280.02,
"close": 1323.4
}
],
"600519": [
@@ -2591,6 +2805,12 @@
"high": 1264.0,
"low": 1207.51,
"close": 1207.68
},
{
"date": "2026-06-25",
"high": 1241.87,
"low": 1200.0,
"close": 1212.1
}
],
"601318": [
@@ -2611,6 +2831,12 @@
"high": 52.43,
"low": 49.03,
"close": 49.12
},
{
"date": "2026-06-25",
"high": 50.88,
"low": 48.56,
"close": 49.3
}
],
"002171": [
+4 -67
View File
@@ -1,70 +1,7 @@
{
"code": "001309",
"history": [
{
"time": "2026-06-12T08:55:32.432962",
"content": "**德明利(001309)** 现价617.7 | 仓位0% | 买入区585~647,知微6/9收紧区间。存储芯片回调充分,止损523安全。",
"report_id": "cron_99c06255590a_2026-06-12_08-32-15"
},
{
"time": "2026-06-12T08:55:34.669098",
"content": "德明利(001309) 617.70(-1.63%) → 买入区585.01~646.59,现价617.70在区间内,观望等待回调至600以下",
"report_id": "cron_bb35a0b1b5e3_2026-06-11_12-55-16"
},
{
"time": "2026-06-12T08:55:34.667003",
"content": "• 德明利(001309) 626.0(-0.31%) → 买入区585~646.6,在区间内,止损523.4,可现价建仓5%",
"report_id": "cron_bb35a0b1b5e3_2026-06-11_13-43-42"
},
{
"time": "2026-06-12T08:55:34.664644",
"content": "• 德明利(001309) 631.49(+0.56%) | 买入区585~647,距上沿-2.3%可关注",
"report_id": "cron_bb35a0b1b5e3_2026-06-11_14-43-18"
},
{
"time": "2026-06-12T08:55:34.502308",
"content": "• 德明利(001309) ¥632.35(+0.70%) — 买入区585~647,在区内可关注",
"report_id": "cron_bb35a0b1b5e3_2026-06-11_15-43-25"
},
{
"time": "2026-06-01T15:56:03.416800",
"content": "👀观望 德明利(001309) | 现价597.41 | -6.65% | 存储芯片回调,买入区560-580未触及",
"report_id": "cron_d3797d924ddc_2026-06-01_15-47-55"
},
{
"time": "2026-06-12T08:55:35.655385",
"content": "• 德明利(001309) 631.01(+0.49%) 买入区585.01~646.59→在区内上沿附近,挂单615等回调",
"report_id": "cron_d3797d924ddc_2026-06-11_14-48-58"
},
{
"time": "2026-06-12T08:55:35.405159",
"content": "德明利(001309) ¥632.35(+0.37%) 买入区585.01~646.59 现价买2%|止损523.43目标708",
"report_id": "cron_d3797d924ddc_2026-06-11_15-42-35"
},
{
"time": "2026-06-12T08:55:35.356400",
"content": "**德明利(001309)** 现价632.35(+0.70%) | 买入区585~647 | 现价在区间高位,等回调至610~620再入。",
"report_id": "cron_d3797d924ddc_2026-06-11_16-03-09"
},
{
"time": "2026-06-12T08:55:34.679968",
"content": "• **德明利(001309)** 现价632.35(+0.70%) 买入区585~647(近上沿) | 等回调至610~620区间再入场3%",
"report_id": "cron_d3797d924ddc_2026-06-11_16-45-41"
},
{
"time": "2026-06-15T08:55:17.014788",
"content": "- 德明利(001309) ¥617.43,买入区605.08~629.78 ✅ 在区间内,RR:3.51(高价股>300元/股,注意仓位)",
"report_id": "cron_e02b8bde74f8_2026-06-14_22-04-57"
},
{
"time": "2026-06-15T08:55:17.014788",
"content": "{\"type\":\"周复盘\",\"time\":\"周日\",\"summary\":\"A股先跌后弹分化格局,全市场普跌后暴力反弹\",\"key_holdings\":[{\"code\":\"600110\",\"name\":",
"report_id": "cron_e02b8bde74f8_2026-06-14_22-04-57"
},
{
"time": "2026-06-14T08:55:34.460610",
"content": "**🟢 德明利(001309) ¥617.43 | 买入区605.08~629.78 ✅ | RR:3.51**",
"report_id": "cron_watchlist_health_weekly_2026-06-13_20-07-41"
}
]
"name": "德明利",
"status": "watchlist",
"converted_at": "2026-06-25 13:21",
"note": "清仓转自选,价格参考: 药明康德@0 德明利@885.85"
}
+5
View File
@@ -111,6 +111,11 @@
"content": "- **腾讯(00700)** ¥466.2 | 昨日+4.79%强势,弱支撑457.2/弱压468,持有不操作",
"report_id": "cron_99c06255590a_2026-06-18_08-38-18"
},
{
"time": "2026-06-25T08:55:46.556482",
"content": "**腾讯控股(00700)** — 昨收428.8(低412.6高439.8),成本443.9仍浮亏。互联网服务板块暂稳,持有等解套。",
"report_id": "cron_99c06255590a_2026-06-25_08-33-37"
},
{
"time": "2026-06-02T11:55:44.093905",
"content": "❌ 反例:腾讯00700,底仓100股(3.59%),浮盈+4.79%。看到\"距止盈470仅0.77%\"就建议触及减仓清仓 —— 机械执行,未考虑底仓属性+浮盈幅度。",
+5
View File
@@ -51,6 +51,11 @@
"content": "**中芯国际-H(00981)** 71.30 +0.09% — 与A股共振,策略买入区70~75已进入,持有",
"report_id": "cron_99c06255590a_2026-06-16_08-38-28"
},
{
"time": "2026-06-25T08:55:46.556482",
"content": "**中芯国际(688981/00981)** — 科创/半导体板块资金巨量流入,A股+6.94%收151.53,港股放量218M。持有信号,科技主线延续。",
"report_id": "cron_99c06255590a_2026-06-25_08-33-37"
},
{
"time": "2026-06-02T12:55:54.836964",
"content": "• 中芯国际H(00981) ¥82.20 +3.46% — 高于买入区72-75",
+5
View File
@@ -581,6 +581,11 @@
"content": "**比亚迪股份(01211) 距止损仅3.1%**",
"report_id": "cron_d42f2ce3b479_2026-06-17_20-20-48"
},
{
"time": "2026-06-25T08:55:46.625230",
"content": "**比亚迪股份(01211)** 距止损-12.5%!现价65.85(+0.13%),弱支撑74.48早已跌破,强支撑61.87。成本105.05(-37.3%)深度套牢。操作:不补不抄,观察61.8",
"report_id": "cron_d42f2ce3b479_2026-06-24_20-04-19"
},
{
"time": "2026-06-22T08:55:38.754230",
"content": "| **比亚迪(01211)** | 成本$105.49,现价≈$84.25,浮亏-20.1%,止损$81.72距仅3% | 严格执行止损,破$82不犹豫 |",
+10
View File
@@ -46,6 +46,11 @@
"content": "长芯博创(300548) @281.99 +21.83% 放量走强持有,止损261.71;辽宁成大(600739) @10.09 -17.88% 弱撑10.0待企稳;海博思创(688411) @281",
"report_id": "cron_99c06255590a_2026-06-19_08-32-54"
},
{
"time": "2026-06-25T08:55:46.556482",
"content": "**丘钛科技(01478) 7.69 | 仓位10.48%** — 深套44%,消费电子持续疲弱,昨日继续-2.41%。10.48%仓位已是超配,若破7.5建议减至7%以内。",
"report_id": "cron_99c06255590a_2026-06-25_08-33-37"
},
{
"time": "2026-06-02T12:55:54.834592",
"content": "| 丘钛科技(01478) | 10.12 | -1.17% | 9.19% | 深套持有,止损9.0 |",
@@ -411,6 +416,11 @@
"content": "**2. 丘钛科技(01478) 8.75HKD(-1.83%)** — 深套-36.90%,仓位8.13%为最重仓。评级⭐⭐⭐⭐⭐基本面强但短期无起色。仓位过重不宜补,持有等待,反弹至9.5可考虑减",
"report_id": "cron_d42f2ce3b479_2026-06-18_20-14-45"
},
{
"time": "2026-06-25T08:55:46.625230",
"content": "**丘钛科技(01478)** 距止损-16.2%!现价6.67(-2.41%),弱支撑7.51已破。仓位10.48%为最大单仓。成本13.81(-51.7%)。操作:如跌破6.0需强制减半仓,下行缺",
"report_id": "cron_d42f2ce3b479_2026-06-24_20-04-19"
},
{
"time": "2026-06-01T10:25:54.503460",
"content": "丘钛科技(01478) 仓位8.58% +4.10%→ 持有,走势健康",
+5
View File
@@ -56,6 +56,11 @@
"content": "长芯博创(300548) @281.99 +21.83% 放量走强持有,止损261.71;辽宁成大(600739) @10.09 -17.88% 弱撑10.0待企稳;海博思创(688411) @281",
"report_id": "cron_99c06255590a_2026-06-19_08-32-54"
},
{
"time": "2026-06-25T08:55:46.556482",
"content": "**建滔积层板(01888)** — 昨振幅近10元(87.6→97.4→93.55收盘),电子元件强势但波动极大,仓位5.8%持有,注意追踪止盈。",
"report_id": "cron_99c06255590a_2026-06-25_08-33-37"
},
{
"time": "2026-06-02T14:55:53.464779",
"content": "| 建滔积层板(01888) | 49.48 | +4.30% | 42-44 | 🔴 远超买入区 |",
+5
View File
@@ -591,6 +591,11 @@
"content": "| 万科企业 | 02202 | 2.69(-3.24%) | 补仓区2.5~2.6 | 高于补仓区 |",
"report_id": "cron_d39e265198ad_2026-06-03_10-58-48"
},
{
"time": "2026-06-25T08:55:46.625230",
"content": "**万科企业(02202)** 距止损-12.5%!现价2.0(-3.75%),弱支撑2.26已破,逼近止损1.75。成本4.68(-57.3%)深套。操作:已无加仓意义,跌破1.75必须斩仓,本周重",
"report_id": "cron_d42f2ce3b479_2026-06-24_20-04-19"
},
{
"time": "2026-06-04T09:55:40.300986",
"content": "- 万科(02202): 补仓区间2.5~2.6,昨收2.70,距+3.8%,未进入。",
+5
View File
@@ -1,6 +1,11 @@
{
"code": "02318",
"history": [
{
"time": "2026-06-25T08:55:46.556482",
"content": "**中银香港(02388)** — 浮盈+6.2%银行股平稳,持有。中国平安(02318)近弱撑52.13,持有观察。",
"report_id": "cron_99c06255590a_2026-06-25_08-33-37"
},
{
"time": "2026-06-01T15:56:03.416800",
"content": "🟢关注 中国平安(02318) | 现价60.40 | +0.58% | 买入区58-60,可建仓3%",
+5
View File
@@ -56,6 +56,11 @@
"content": "长芯博创(300548) @281.99 +21.83% 放量走强持有,止损261.71;辽宁成大(600739) @10.09 -17.88% 弱撑10.0待企稳;海博思创(688411) @281",
"report_id": "cron_99c06255590a_2026-06-19_08-32-54"
},
{
"time": "2026-06-25T08:55:46.556482",
"content": "**中银香港(02388)** — 浮盈+6.2%银行股平稳,持有。中国平安(02318)近弱撑52.13,持有观察。",
"report_id": "cron_99c06255590a_2026-06-25_08-33-37"
},
{
"time": "2026-06-02T12:55:54.834592",
"content": "| 中银香港(02388) | 47.80 | -0.95% | 3.95% | 持有,止损46止盈52 |",
+5
View File
@@ -46,6 +46,11 @@
"content": "长芯博创(300548) @281.99 +21.83% 放量走强持有,止损261.71;辽宁成大(600739) @10.09 -17.88% 弱撑10.0待企稳;海博思创(688411) @281",
"report_id": "cron_99c06255590a_2026-06-19_08-32-54"
},
{
"time": "2026-06-25T08:55:46.556482",
"content": "**中科电气(300035) / 德明利(001309)** — 前者能源金属+4.27%但-28%深套持有;后者半导体板块受益,+9.9%持有。",
"report_id": "cron_99c06255590a_2026-06-25_08-33-37"
},
{
"time": "2026-06-02T12:55:54.834592",
"content": "| 中科电气(300035) | 16.44 | -2.66% | 1.77% | 深套持有,止损15.0 |",
+10
View File
@@ -51,6 +51,11 @@
"content": "• 黄金ETF(518880) 8.91 — 金价高位但ETF深套-26.9%,暂持有",
"report_id": "cron_99c06255590a_2026-06-22_08-37-35"
},
{
"time": "2026-06-25T08:55:46.556482",
"content": "**黄金ETF(518880)** — 贵金属板块暴跌预警,深套30%但仓位仅2.5%,暂持有不动。",
"report_id": "cron_99c06255590a_2026-06-25_08-33-37"
},
{
"time": "2026-06-02T12:55:54.834592",
"content": "| 黄金ETF(518880) | 9.323 | -0.22% | 2.14% | 深套持有,止损9.0 |",
@@ -481,6 +486,11 @@
"content": "**3. 黄金ETF(518880) 8.908(-0.55%)** — 浮亏-26.93%,此前已破止损9.54未收复。黄金近期承压下行,不加仓不补",
"report_id": "cron_d42f2ce3b479_2026-06-18_20-14-45"
},
{
"time": "2026-06-25T08:55:46.625230",
"content": "**A股**:大盘弱势(仅13.3%板块上涨)。黄金ETF 518880(8.52,-0.26%)深套持有;紫金矿业(27.65,-0.36%)深套持有;华恒生物(21.4,-1.97%)微套;中科电",
"report_id": "cron_d42f2ce3b479_2026-06-24_20-04-19"
},
{
"time": "2026-06-01T10:25:54.503460",
"content": "黄金ETF华安(518880) 仓位2.16% +2.73%→ 持有,金价支撑",
+5
View File
@@ -51,6 +51,11 @@
"content": "• **紫金矿业(601899) ¥29.09 (-28.90%)** — 深套持有,止损24.73,目标30.06",
"report_id": "cron_99c06255590a_2026-06-15_08-41-00"
},
{
"time": "2026-06-25T08:55:46.556482",
"content": "**紫金矿业(601899) 27.65 | 仓位8.19%** — 贵金属板块暴跌-8.6%、工业金属-5.53%,双杀!深套31%为第一大仓位,若本周破前低24.98需考虑减仓至5%控制风险。",
"report_id": "cron_99c06255590a_2026-06-25_08-33-37"
},
{
"time": "2026-06-01T10:25:54.419132",
"content": "2. **紫金矿业(601899)** 进入加仓区间29-30,可考虑分批加仓",
+4 -97
View File
@@ -1,100 +1,7 @@
{
"code": "603259",
"history": [
{
"time": "2026-06-11T08:55:22.591626",
"content": "• 药明康德(603259) 97.04 → 持有,略高于买入区93.5~97.0上沿。止损90/止盈105。200股浮盈+0%。",
"report_id": "cron_99c06255590a_2026-06-11_08-45-23"
},
{
"time": "2026-06-11T08:55:22.591626",
"content": "{\"type\":\"盘前\",\"time\":\"08:43\",\"holdings\":[{\"code\":\"600110\",\"name\":\"诺德股份\",\"action\":\"持有\",\"trigger\":\"买入区1",
"report_id": "cron_99c06255590a_2026-06-11_08-45-23"
},
{
"time": "2026-06-15T08:55:17.001525",
"content": "• **药明康德(603259) ¥99.71** — 买入区96.57~98.23,现价略高",
"report_id": "cron_99c06255590a_2026-06-15_08-41-00"
},
{
"time": "2026-06-16T08:55:43.793441",
"content": "**药明康德(603259)** 96.95 持平 — 新仓成本95.26,止损90/止盈105,持有观察",
"report_id": "cron_99c06255590a_2026-06-16_08-38-28"
},
{
"time": "2026-06-17T08:55:49.338608",
"content": "药明康德(603259) ¥99.71 +0.41% | 买入区96.6~98.2,带下影阳线偏多",
"report_id": "cron_99c06255590a_2026-06-17_08-35-59"
},
{
"time": "2026-06-11T08:55:23.397094",
"content": "**药明康德(603259)** 97.04(+3.95%) → 新仓200股,策略买入区93.50~97.00,现价触及上沿。止损90/止盈105。持有观察,若回踩95可加仓。",
"report_id": "cron_d3797d924ddc_2026-06-10_15-56-34"
},
{
"time": "2026-06-11T08:55:23.397094",
"content": "{\"code\":\"603259\",\"name\":\"药明康德\",\"action\":\"持有\",\"price\":97.04},",
"report_id": "cron_d3797d924ddc_2026-06-10_15-56-34"
},
{
"time": "2026-06-11T08:55:23.385966",
"content": "• 药明康德(603259) 97.04(+3.81%) → 触及买入区上沿97.00,持有。止损90/止盈105,仓位1.89%",
"report_id": "cron_d3797d924ddc_2026-06-10_16-06-20"
},
{
"time": "2026-06-11T08:55:23.385966",
"content": "{\"type\":\"盯盘\",\"time\":\"16:01\",\"holdings\":[{\"code\":\"603259\",\"name\":\"药明康德\",\"action\":\"持有\",\"price\":97.04},",
"report_id": "cron_d3797d924ddc_2026-06-10_16-06-20"
},
{
"time": "2026-06-11T08:55:23.373283",
"content": "**药明康德(603259) 97.04(+3.81%)** → 新入持仓200股,现价在买入区93.50~97.00上沿。止损90.00/止盈105.00。浮盈+0.00%,仓位1.89%。建议持有",
"report_id": "cron_d3797d924ddc_2026-06-10_16-27-18"
},
{
"time": "2026-06-11T08:55:23.373283",
"content": "{\"type\":\"盯盘\",\"time\":\"16:16\",\"holdings\":[{\"code\":\"603259\",\"name\":\"药明康德\",\"action\":\"持有\",\"price\":97.04},",
"report_id": "cron_d3797d924ddc_2026-06-10_16-27-18"
},
{
"time": "2026-06-11T08:55:23.371021",
"content": "**药明康德(603259) 97.04(+3.81%) → 触及买入区上沿,可持有**",
"report_id": "cron_d3797d924ddc_2026-06-10_16-42-16"
},
{
"time": "2026-06-11T08:55:23.371021",
"content": "{\"type\":\"盯盘\",\"time\":\"16:30\",\"holdings\":[{\"code\":\"603259\",\"name\":\"药明康德\",\"action\":\"持有\",\"price\":97.04},",
"report_id": "cron_d3797d924ddc_2026-06-10_16-42-16"
},
{
"time": "2026-06-11T08:55:23.369272",
"content": "**药明康德(603259) 97.04(+3.81%)** → 新持仓首日,买入区93.50~97.00,现价97.04略超上沿(+0.04%),止损90.00/止盈105.00。持有观察",
"report_id": "cron_d3797d924ddc_2026-06-10_16-54-00"
},
{
"time": "2026-06-11T08:55:23.369272",
"content": "{\"type\":\"盯盘\",\"time\":\"16:45\",\"holdings\":[{\"code\":\"600110\",\"name\":\"诺德股份\",\"action\":\"持有\",\"price\":12.20},",
"report_id": "cron_d3797d924ddc_2026-06-10_16-54-00"
},
{
"time": "2026-06-16T08:55:43.812327",
"content": "**自选距买入区±3%内**:中芯国际A(688981) 现价130.52(买入区124.88~128.80,距上沿+1.3%);宁德时代(300750) 现价398.1(买入区391.71~399.",
"report_id": "cron_d42f2ce3b479_2026-06-15_20-06-33"
},
{
"time": "2026-06-20T08:55:13.499309",
"content": "**药明康德(603259) 102.72(+4.60%)** | 仓位4.02%→持有",
"report_id": "cron_d42f2ce3b479_2026-06-19_20-05-49"
},
{
"time": "2026-06-12T08:55:35.665176",
"content": "• **药明康德(603259)** ¥96.31 (-0.75%) — 买入区93.50~97.00内,距上沿-0.7%200股底仓浮盈+1.1%。止损90/止盈105,持有观察",
"report_id": "cron_e3bf7b13af8d_2026-06-11_09-32-24"
},
{
"time": "2026-06-12T08:55:35.665176",
"content": "{\"code\":\"603259\",\"name\":\"药明康德\",\"action\":\"持有\",\"price\":96.31,\"reason\":\"买入区内运行,距上沿-0.7%\"},",
"report_id": "cron_e3bf7b13af8d_2026-06-11_09-32-24"
}
]
"name": "药明康德",
"status": "watchlist",
"converted_at": "2026-06-25 13:21",
"note": "清仓转自选,价格参考: 药明康德@117.52 德明利@0"
}
+5
View File
@@ -21,6 +21,11 @@
"content": "自选靠近买入区:华恒生物(688639) @21.2 量价齐升信号,买入区20.78~21.4 RR 2.28;信义光能(00968) @2.41 接近支撑位关注,买入区2.36~2.46 RR 3.",
"report_id": "cron_99c06255590a_2026-06-19_08-32-54"
},
{
"time": "2026-06-25T08:55:46.556482",
"content": "**华恒生物(688639) 21.4 | 仓位7.42%** — 光头光脚阴线形态偏空,在买入区21.06~21.54下沿,若破21.0减仓1/3。",
"report_id": "cron_99c06255590a_2026-06-25_08-33-37"
},
{
"time": "2026-06-01T14:55:20.378304",
"content": "• 华恒生物(688639) 23.58 | +0.47% → 🤝持有,接近止损23.18",
+5
View File
@@ -31,6 +31,11 @@
"content": "- **中芯国际A(688981)** ¥125.58 | 半导体板块+3.97%净流入269亿是当前最强主线,继续持有,加仓等回调至122~124",
"report_id": "cron_99c06255590a_2026-06-18_08-38-18"
},
{
"time": "2026-06-25T08:55:46.556482",
"content": "**中芯国际(688981/00981)** — 科创/半导体板块资金巨量流入,A股+6.94%收151.53,港股放量218M。持有信号,科技主线延续。",
"report_id": "cron_99c06255590a_2026-06-25_08-33-37"
},
{
"time": "2026-06-01T11:55:35.956320",
"content": "• **688981|中芯国际|134.87|-3.60%|建议观望等企稳【短线】|前几日大涨后获利回吐,关注134支撑**",
+114 -162
View File
@@ -1,293 +1,245 @@
{
"checked_at": "2026-06-24T09:00:31",
"total_active": 51,
"flagged_count": 18,
"checked_at": "2026-06-25T11:35:00",
"total_active": 52,
"flagged_count": 15,
"flagged": [
{
"code": "000657",
"name": "中钨高新",
"price": 106.0,
"name": "\u4e2d\u94a8\u9ad8\u65b0",
"price": 100.08,
"flags": [
"现价106.00在买入区104~108(是否可买需结合timing_signal判断)"
"\u73b0\u4ef7100.08\u5728\u4e70\u5165\u533a98~102\uff08\u662f\u5426\u53ef\u4e70\u9700\u7ed3\u5408timing_signal\u5224\u65ad\uff09"
],
"age_days": 0,
"last_update": "2026-06-23 12:00",
"entry_zone": "104~108",
"current": "盈利持有 | 目标119.16 | 止损102.39 | 买入区103.88~108.12",
"last_update": "2026-06-24 16:44",
"entry_zone": "98~102",
"current": "\u76c8\u5229\u6301\u6709 | \u76ee\u6807112.75 | \u6b62\u635f95.93 | \u4e70\u5165\u533a98.08~102.08",
"updated_by": "auto",
"updated_reason": "自动生成",
"updated_reason": "\u81ea\u52a8\u751f\u6210",
"is_watchlist": true
},
{
"code": "000711",
"name": "ST京蓝",
"price": 5.22,
"name": "ST\u4eac\u84dd",
"price": 5.04,
"flags": [
"[STRATEGY_STALE] 信号不良(timing_signal含['等企稳'])",
"现价5.22在买入区5~5(是否可买需结合timing_signal判断)"
"\u73b0\u4ef75.04\u5728\u4e70\u5165\u533a5~5\uff08\u662f\u5426\u53ef\u4e70\u9700\u7ed3\u5408timing_signal\u5224\u65ad\uff09"
],
"age_days": 0,
"last_update": "2026-06-23 12:01",
"last_update": "2026-06-24 16:44",
"entry_zone": "5~5",
"current": "盈利持有 | 目标5.66 | 止损5.06 | 买入区5.12~5.3 | 信号:放量下跌,等企稳再入",
"current": "\u76c8\u5229\u6301\u6709 | \u26a0\ufe0f\u76c8\u4e8f\u6bd4\u504f\u4f4e(1:1.8)\uff0c\u8c28\u614e\u4e70\u5165 | \u76ee\u68075.38 | \u6b62\u635f4.33 | \u4e70\u5165\u533a4.94~5.06 | \u4fe1\u53f7:\u89c2\u671b",
"updated_by": "auto",
"updated_reason": "自动生成",
"updated_reason": "\u81ea\u52a8\u751f\u6210",
"is_watchlist": true
},
{
"code": "002594",
"name": "比亚迪",
"price": 85.94,
"name": "\u6bd4\u4e9a\u8fea",
"price": 83.3,
"flags": [
"[STRATEGY_STALE] 信号不良(timing_signal含['等企稳'])",
"现价85.94在买入区84~88(是否可买需结合timing_signal判断)"
"\u73b0\u4ef783.30\u5728\u4e70\u5165\u533a82~85\uff08\u662f\u5426\u53ef\u4e70\u9700\u7ed3\u5408timing_signal\u5224\u65ad\uff09"
],
"age_days": 0,
"last_update": "2026-06-23 12:01",
"entry_zone": "84~88",
"current": "盈利持有 | 目标94.0 | 止损83.36 | 买入区84.22~87.62 | 信号:放量下跌,等企稳再入",
"last_update": "2026-06-24 16:44",
"entry_zone": "82~85",
"current": "\u76c8\u5229\u6301\u6709 | \u76ee\u680792.71 | \u6b62\u635f75.24 | \u4e70\u5165\u533a81.63~84.97 | \u4fe1\u53f7:\u89c2\u671b",
"updated_by": "auto",
"updated_reason": "自动生成",
"updated_reason": "\u81ea\u52a8\u751f\u6210",
"is_watchlist": true
},
{
"code": "00968",
"name": "信义光能",
"price": 2.11,
"name": "\u4fe1\u4e49\u5149\u80fd",
"price": 2.0,
"flags": [
"现价2.11在买入区2~2(是否可买需结合timing_signal判断)"
"\u73b0\u4ef72.00\u5728\u4e70\u5165\u533a2~2\uff08\u662f\u5426\u53ef\u4e70\u9700\u7ed3\u5408timing_signal\u5224\u65ad\uff09"
],
"age_days": 0,
"last_update": "2026-06-23 12:01",
"last_update": "2026-06-24 16:44",
"entry_zone": "2~2",
"current": "盈利持有 | 目标2.57 | 止损2.05 | 买入区2.07~2.15",
"current": "\u76c8\u5229\u6301\u6709 | \u76ee\u68072.58 | \u6b62\u635f1.8 | \u4e70\u5165\u533a1.96~2.04",
"updated_by": "auto",
"updated_reason": "自动生成",
"updated_reason": "\u81ea\u52a8\u751f\u6210",
"is_watchlist": true
},
{
"code": "01070",
"name": "TCL电子",
"name": "TCL\u7535\u5b50",
"price": 13.1,
"flags": [
"现价13.10在买入区13~13(是否可买需结合timing_signal判断)"
"[STRATEGY_STALE] \u4fe1\u53f7\u4e0d\u826f(timing_signal\u542b['\u5f31\u52bf\u6301\u6709'])",
"\u73b0\u4ef713.10\u5728\u4e70\u5165\u533a13~13\uff08\u662f\u5426\u53ef\u4e70\u9700\u7ed3\u5408timing_signal\u5224\u65ad\uff09"
],
"age_days": 0,
"last_update": "2026-06-23 12:01",
"last_update": "2026-06-24 16:44",
"entry_zone": "13~13",
"current": "盈利持有 | 目标15.29 | 止损12.71 | 买入区12.84~13.36 | 信号:接近支撑位,关注",
"current": "\u76c8\u5229\u6301\u6709 | \u76ee\u680715.51 | \u6b62\u635f12.29 | \u4e70\u5165\u533a12.84~13.36 | \u4fe1\u53f7:\u5f31\u52bf\u6301\u6709",
"updated_by": "auto",
"updated_reason": "自动生成",
"updated_reason": "\u81ea\u52a8\u751f\u6210",
"is_watchlist": true
},
{
"code": "02359",
"name": "药明康德",
"price": 131.8,
"name": "\u836f\u660e\u5eb7\u5fb7",
"price": 141.7,
"flags": [
"现价131.80在买入区129~134(是否可买需结合timing_signal判断)"
"\u73b0\u4ef7141.70\u5728\u4e70\u5165\u533a139~144\uff08\u662f\u5426\u53ef\u4e70\u9700\u7ed3\u5408timing_signal\u5224\u65ad\uff09"
],
"age_days": 0,
"last_update": "2026-06-23 12:01",
"entry_zone": "129~134",
"current": "盈利持有 | 目标147.67 | 止损127.85 | 买入区129.16~134.44 | 信号:接近支撑位,关注",
"last_update": "2026-06-24 16:45",
"entry_zone": "139~144",
"current": "\u76c8\u5229\u6301\u6709 | \u26a0\ufe0f\u76c8\u4e8f\u6bd4\u504f\u4f4e(1:2.0)\uff0c\u8c28\u614e\u4e70\u5165 | \u76ee\u6807163.23 | \u6b62\u635f126.88 | \u4e70\u5165\u533a138.87~143.77 | \u4fe1\u53f7:\u4e70\u5165",
"updated_by": "auto",
"updated_reason": "自动生成",
"updated_reason": "\u81ea\u52a8\u751f\u6210",
"is_watchlist": true
},
{
"code": "02628",
"name": "中国人寿",
"price": 29.5,
"name": "\u4e2d\u56fd\u4eba\u5bff",
"price": 28.32,
"flags": [
"现价29.50在买入区29~30(是否可买需结合timing_signal判断)"
"\u73b0\u4ef728.32\u5728\u4e70\u5165\u533a28~29\uff08\u662f\u5426\u53ef\u4e70\u9700\u7ed3\u5408timing_signal\u5224\u65ad\uff09"
],
"age_days": 0,
"last_update": "2026-06-23 12:01",
"entry_zone": "29~30",
"current": "盈利持有 | 目标33.9 | 止损28.61 | 买入区28.91~30.09 | 信号:接近支撑位,关注",
"last_update": "2026-06-24 16:45",
"entry_zone": "28~29",
"current": "\u76c8\u5229\u6301\u6709 | \u76ee\u680732.72 | \u6b62\u635f25.58 | \u4e70\u5165\u533a27.75~28.89",
"updated_by": "auto",
"updated_reason": "自动生成",
"updated_reason": "\u81ea\u52a8\u751f\u6210",
"is_watchlist": true
},
{
"code": "06160",
"name": "百济神州",
"price": 163.5,
"name": "\u767e\u6d4e\u795e\u5dde",
"price": 165.2,
"flags": [
"现价163.50在买入区160~167(是否可买需结合timing_signal判断)"
"\u73b0\u4ef7165.20\u5728\u4e70\u5165\u533a162~168\uff08\u662f\u5426\u53ef\u4e70\u9700\u7ed3\u5408timing_signal\u5224\u65ad\uff09"
],
"age_days": 0,
"last_update": "2026-06-23 12:01",
"entry_zone": "160~167",
"current": "盈利持有 | 目标178.73 | 止损158.59 | 买入区160.23~166.65 | 信号:接近支撑位,关注",
"last_update": "2026-06-24 16:45",
"entry_zone": "162~168",
"current": "\u76c8\u5229\u6301\u6709 | \u76ee\u6807180.64 | \u6b62\u635f149.22 | \u4e70\u5165\u533a161.9~168.4",
"updated_by": "auto",
"updated_reason": "自动生成",
"updated_reason": "\u81ea\u52a8\u751f\u6210",
"is_watchlist": true
},
{
"code": "06869",
"name": "长飞光纤",
"price": 267.6,
"code": "09988",
"name": "\u963f\u91cc\u5df4\u5df4-W",
"price": 99.4,
"flags": [
"现价267.60在买入区262~273(是否可买需结合timing_signal判断)"
"\u73b0\u4ef799.40\u5728\u4e70\u5165\u533a97~101\uff08\u662f\u5426\u53ef\u4e70\u9700\u7ed3\u5408timing_signal\u5224\u65ad\uff09"
],
"age_days": 0,
"last_update": "2026-06-23 12:01",
"entry_zone": "262~273",
"current": "盈利持有 | 目标367.2 | 止损251.8 | 买入区262.25~272.95",
"last_update": "2026-06-24 16:45",
"entry_zone": "97~101",
"current": "\u76c8\u5229\u6301\u6709 | \u76ee\u6807115.07 | \u6b62\u635f89.79 | \u4e70\u5165\u533a97.41~101.39 | \u4fe1\u53f7:\u5173\u6ce8",
"updated_by": "auto",
"updated_reason": "自动生成",
"updated_reason": "\u81ea\u52a8\u751f\u6210",
"is_watchlist": true
},
{
"code": "300124",
"name": "汇川技术",
"price": 67.81,
"name": "\u6c47\u5ddd\u6280\u672f",
"price": 66.31,
"flags": [
"[STRATEGY_STALE] 信号不良(timing_signal含['等企稳'])",
"现价67.81在买入区66~69(是否可买需结合timing_signal判断)"
"\u73b0\u4ef766.31\u5728\u4e70\u5165\u533a65~68\uff08\u662f\u5426\u53ef\u4e70\u9700\u7ed3\u5408timing_signal\u5224\u65ad\uff09"
],
"age_days": 0,
"last_update": "2026-06-23 12:01",
"entry_zone": "66~69",
"current": "盈利持有 | 目标73.65 | 止损65.78 | 买入区66.45~68.93 | 信号:放量下跌,等企稳再入",
"last_update": "2026-06-24 16:45",
"entry_zone": "65~68",
"current": "\u76c8\u5229\u6301\u6709 | \u76ee\u680773.13 | \u6b62\u635f62.39 | \u4e70\u5165\u533a64.98~67.64 | \u4fe1\u53f7:\u89c2\u671b",
"updated_by": "auto",
"updated_reason": "自动生成",
"updated_reason": "\u81ea\u52a8\u751f\u6210",
"is_watchlist": true
},
{
"code": "300308",
"name": "中际旭创",
"price": 1327.13,
"name": "\u4e2d\u9645\u65ed\u521b",
"price": 1312.18,
"flags": [
"现价1327.13在买入区1301~1354(是否可买需结合timing_signal判断)"
"\u73b0\u4ef71312.18\u5728\u4e70\u5165\u533a1286~1338\uff08\u662f\u5426\u53ef\u4e70\u9700\u7ed3\u5408timing_signal\u5224\u65ad\uff09"
],
"age_days": 0,
"last_update": "2026-06-23 12:01",
"entry_zone": "1301~1354",
"current": "盈利持有 | 目标1453.2 | 止损1287.32 | 买入区1300.59~1353.67",
"last_update": "2026-06-24 16:45",
"entry_zone": "1286~1338",
"current": "\u76c8\u5229\u6301\u6709 | \u76ee\u68071447.8 | \u6b62\u635f1272.81 | \u4e70\u5165\u533a1285.94~1338.42",
"updated_by": "auto",
"updated_reason": "自动生成",
"updated_reason": "\u81ea\u52a8\u751f\u6210",
"is_watchlist": true
},
{
"code": "600519",
"name": "贵州茅台",
"price": 1228.61,
"name": "\u8d35\u5dde\u8305\u53f0",
"price": 1207.68,
"flags": [
"现价1228.61在买入区1204~1235(是否可买需结合timing_signal判断)"
"\u73b0\u4ef71207.68\u5728\u4e70\u5165\u533a1184~1231\uff08\u662f\u5426\u53ef\u4e70\u9700\u7ed3\u5408timing_signal\u5224\u65ad\uff09"
],
"age_days": 0,
"last_update": "2026-06-23 12:01",
"entry_zone": "1204~1235",
"current": "盈利持有 | ⚠️盈亏比偏低(1:2.0),谨慎买入 | 目标1300.67 | 止损1191.75 | 买入区1204.04~1235.32 | 信号:接近支撑位,关注",
"last_update": "2026-06-24 16:45",
"entry_zone": "1184~1231",
"current": "\u76c8\u5229\u6301\u6709 | \u76ee\u68071320.83 | \u6b62\u635f1171.45 | \u4e70\u5165\u533a1183.53~1231.2 | \u4fe1\u53f7:\u5173\u6ce8",
"updated_by": "auto",
"updated_reason": "自动生成",
"updated_reason": "\u81ea\u52a8\u751f\u6210",
"is_watchlist": true
},
{
"code": "601318",
"name": "中国平安",
"price": 51.02,
"name": "\u4e2d\u56fd\u5e73\u5b89",
"price": 49.12,
"flags": [
"[STRATEGY_STALE] 信号不良(timing_signal含['等企稳'])",
"现价51.02在买入区50~52(是否可买需结合timing_signal判断)"
"\u73b0\u4ef749.12\u5728\u4e70\u5165\u533a48~50\uff08\u662f\u5426\u53ef\u4e70\u9700\u7ed3\u5408timing_signal\u5224\u65ad\uff09"
],
"age_days": 0,
"last_update": "2026-06-23 12:01",
"entry_zone": "50~52",
"current": "盈利持有 | 止损参考49.42 | 买入区49.93~51.97 | 信号:放量下跌,等企稳再入",
"updated_by": "manual",
"updated_reason": "自动生成",
"is_watchlist": true
},
{
"code": "688411",
"name": "海博思创",
"price": 280.11,
"flags": [
"现价280.11在买入区275~286(是否可买需结合timing_signal判断)"
],
"age_days": 0,
"last_update": "2026-06-23 12:01",
"entry_zone": "275~286",
"current": "盈利良好 | 目标323.7 | 止损271.71 | 买入区274.51~285.71 | 信号:缩量回踩支撑,可买入",
"updated_by": "manual",
"updated_reason": "自动生成",
"is_watchlist": true
},
{
"code": "688630",
"name": "芯碁微装",
"price": 471.27,
"flags": [
"现价471.27在买入区462~481(是否可买需结合timing_signal判断)"
],
"age_days": 0,
"last_update": "2026-06-23 12:01",
"entry_zone": "462~481",
"current": "盈利持有 | 目标526.57 | 止损457.52 | 买入区461.84~480.7",
"last_update": "2026-06-24 16:45",
"entry_zone": "48~50",
"current": "\u76c8\u5229\u6301\u6709 | \u76ee\u680753.61 | \u6b62\u635f47.65 | \u4e70\u5165\u533a48.14~50.03 | \u4fe1\u53f7:\u89c2\u671b",
"updated_by": "auto",
"updated_reason": "自动生成",
"is_watchlist": true
},
{
"code": "688639",
"name": "华恒生物",
"price": 21.93,
"flags": [
"现价21.93在买入区21~22(是否可买需结合timing_signal判断)"
],
"age_days": 0,
"last_update": "2026-06-23 12:01",
"entry_zone": "21~22",
"current": "盈利持有 | 目标24.5 | 止损21.27 | 买入区21.49~22.37",
"updated_by": "auto",
"updated_reason": "自动生成",
"updated_reason": "\u81ea\u52a8\u751f\u6210",
"is_watchlist": true
},
{
"code": "688795",
"name": "摩尔线程-U",
"price": 718.68,
"name": "\u6469\u5c14\u7ebf\u7a0b-U",
"price": 704.8,
"flags": [
"[STRATEGY_STALE] 信号不良(timing_signal含['等企稳'])",
"现价718.68在买入区704~724(是否可买需结合timing_signal判断)"
"\u73b0\u4ef7704.80\u5728\u4e70\u5165\u533a691~719\uff08\u662f\u5426\u53ef\u4e70\u9700\u7ed3\u5408timing_signal\u5224\u65ad\uff09"
],
"age_days": 0,
"last_update": "2026-06-23 12:01",
"entry_zone": "704~724",
"current": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标804.6 | 止损683.91 | 买入区704.31~724.14 | 信号:放量下跌,等企稳再入",
"last_update": "2026-06-24 16:45",
"entry_zone": "691~719",
"current": "\u76c8\u5229\u6301\u6709 | \u76ee\u6807831.78 | \u6b62\u635f683.66 | \u4e70\u5165\u533a690.7~718.9 | \u4fe1\u53f7:\u89c2\u671b",
"updated_by": "auto",
"updated_reason": "自动生成",
"updated_reason": "\u81ea\u52a8\u751f\u6210",
"is_watchlist": true
},
{
"code": "688802",
"name": "沐曦股份-U",
"price": 786.0,
"name": "\u6c90\u66e6\u80a1\u4efd-U",
"price": 770.19,
"flags": [
"现价786.00在买入区770~802(是否可买需结合timing_signal判断)"
"\u73b0\u4ef7770.19\u5728\u4e70\u5165\u533a755~786\uff08\u662f\u5426\u53ef\u4e70\u9700\u7ed3\u5408timing_signal\u5224\u65ad\uff09"
],
"age_days": 0,
"last_update": "2026-06-23 12:01",
"entry_zone": "770~802",
"current": "盈利持有 | 目标899.0 | 止损756.85 | 买入区770.28~801.72",
"last_update": "2026-06-24 16:45",
"entry_zone": "755~786",
"current": "\u76c8\u5229\u6301\u6709 | \u76ee\u6807882.43 | \u6b62\u635f747.08 | \u4e70\u5165\u533a754.79~785.59",
"updated_by": "auto",
"updated_reason": "自动生成",
"updated_reason": "\u81ea\u52a8\u751f\u6210",
"is_watchlist": true
}
],
"portfolio": {
"position_pct": 91.95,
"cash": 80476,
"weak_position_pct": 36.4,
"all_weak_pct": 39.2,
"total_assets": 1212445.58,
"cash": 150624.58,
"position_pct": 87.6,
"weak_position_pct": 47.8,
"all_weak_pct": 47.8,
"signals": [
"[PORTFOLIO_WEAK_MILD] 组合弱势占比36.4%,需关注",
"[PORTFOLIO_FULL] 总仓位91.95%(现金80476元),买入建议受限"
"[PORTFOLIO_WEAK] \u7ec4\u5408\u5f31\u52bf\u5360\u6bd448%>40%\uff0c\u5efa\u8bae\u7cfb\u7edf\u6027\u51cf\u4ed3",
"[PORTFOLIO_FULL] \u603b\u4ed3\u4f4d87.6%\uff08\u73b0\u91d1150625\u5143\uff09\uff0c\u4e70\u5165\u5efa\u8bae\u53d7\u9650"
]
},
"summary": "扫描51个策略,18个需关注"
"summary": "\u626b\u63cf52\u4e2a\u7b56\u7565\uff0c15\u4e2a\u9700\u5173\u6ce8"
}
+56 -116
View File
@@ -1,145 +1,85 @@
{
"timestamp": "2026-06-24 16:00",
"source": "小果新闻情感分析(降级:API不可达,自行分析)",
"market_context": "大盘48.9%板块上涨,市场情绪中性。化学制药(+3.68%)、生物制品(+2.96%)领涨;贵金属(-8.6%)、小金属(-5.58%)、工业金属(-5.53%)领跌。持仓多只个股大涨(法拉电子+10%、药明康德+8.6%、中芯国际H+9.6%),但部分深套股继续承压。",
"timestamp": "2026-06-25 16:00",
"analyses": [
{
"name": "德明利",
"code": "001309",
"name": "法拉电子",
"code": "600563",
"sentiment": "positive",
"confidence": 0.90,
"brief": "股价首度突破800元创历史新高,年内涨幅超250%,走势强劲但距止盈仅0.1%需警惕回调风险",
"keywords": ["突破800元", "历史新高", "年内涨超250%", "存储芯片"],
"news_headlines": [
"德明利股价首度突破800元 年内累计最大涨幅超250%2026-06-24",
"德明利盘中创历史新高(2026-06-23",
"德明利深圳福田拿地!打造研发总部基地(2026-06-23"
]
"confidence": 0.82,
"brief": "元器件板块大涨3.14%,法拉电子领涨6.31%",
"keywords": ["元器件", "板块领涨", "电容器"]
},
{
"name": "中国神华",
"code": "01088",
"name": "中芯国际",
"code": "688981",
"sentiment": "positive",
"confidence": 0.80,
"brief": "5月煤炭销量5050万吨同比+11.7%,销量增长向好但产量同比下降4.1%,煤价承压行业偏弱",
"keywords": ["煤炭销量", "同比增长", "外购煤放量", "产量下降"],
"news_headlines": [
"中国神华:5月煤炭销售量5050万吨 同比增长11.7%2026-06-17",
"中国神华:5月商品煤产量同比下降4.1%2026-06-17"
]
"confidence": 0.75,
"brief": "半导体板块涨2.21%,中芯国际涨3.52%跟随",
"keywords": ["半导体", "中芯国际", "科创板"]
},
{
"name": "宁德时代",
"code": "300750",
"sentiment": "neutral",
"confidence": 0.60,
"brief": "宁德时代微涨1.65%,接近止盈位420.51",
"keywords": ["宁德时代", "新能源", "止盈"]
},
{
"name": "黄金ETF华安",
"code": "518880",
"sentiment": "negative",
"confidence": 0.78,
"brief": "贵金属板块大跌4.2%拖累黄金ETF跌2.68%",
"keywords": ["贵金属", "黄金", "ETF"]
},
{
"name": "建滔积层板",
"code": "01888",
"sentiment": "positive",
"confidence": 0.85,
"brief": "获南向资金连续11天净买入,年内第五次涨价累计超40%,量价齐升趋势明确",
"keywords": ["南向资金", "连续净买入", "第五次涨价", "累计涨价超40%"],
"news_headlines": [
"建滔积层板获南向资金连续11天净买入(2026-06-23",
"建滔积层板完成第五次涨价,年内累计涨价超40%(2026-06-22"
]
"confidence": 0.88,
"brief": "元件板块强势,建滔积层板大涨11.38%",
"keywords": ["覆铜板", "元件", "大涨"]
},
{
"name": "法拉电子",
"code": "600563",
"name": "长飞光纤光缆",
"code": "06869",
"sentiment": "positive",
"confidence": 0.85,
"brief": "今日涨停+10%,新能源+高铁双轮驱动需求旺盛,满产状态订单充足",
"keywords": ["涨停", "新能源", "满产", "订单充足"],
"news_headlines": [
"法拉电子今日涨停10%2026-06-24",
"法拉电子:三季度订单充足 生产处于满产状态(2026-06-04",
"法拉电子:产品已广泛应用于高铁、动车领域(2026-05-27"
]
"brief": "光纤光缆需求旺盛,长飞大涨10.11%",
"keywords": ["光纤光缆", "通信", "大涨"]
},
{
"name": "药明康德",
"code": "603259",
"sentiment": "positive",
"name": "丘钛科技",
"code": "01478",
"sentiment": "negative",
"confidence": 0.80,
"brief": "光学光电子板块弱势,丘钛科技大跌6.37%",
"keywords": ["手机产业链", "光学", "大跌"]
},
{
"name": "紫金矿业",
"code": "601899",
"sentiment": "negative",
"confidence": 0.85,
"brief": "CRO概念逆势走强,药明康德涨停,医药板块整体回暖情绪积极",
"keywords": ["CRO概念", "涨停", "医药板块", "逆势走强"],
"news_headlines": [
"CRO概念股活跃 药明康德涨停(2026-06-24",
"CRO概念逆势走强 药明康德封涨停(2026-06-24"
]
"brief": "贵金属板块领跌4.2%,紫金矿业大跌6.26%",
"keywords": ["黄金", "紫金矿业", "贵金属"]
},
{
"name": "华恒生物",
"code": "688639",
"sentiment": "positive",
"name": "中科电气",
"code": "300035",
"sentiment": "negative",
"confidence": 0.75,
"brief": "通过港交所聆讯即将港股上市,国际化战略推进,但距止盈仅3.5%接近目标",
"keywords": ["港股IPO", "通过聆讯", "国际化", "生物制造"],
"news_headlines": [
"华恒生物通过港交所聆讯 华泰国际为独家保荐人(2026-06-23",
"华恒生物:第五届董事会第五次会议决议公告(2026-06-22"
]
"brief": "小金属板块微跌,中科电气大跌5.91%",
"keywords": ["石墨电极", "小金属", "大跌"]
},
{
"name": "模塑科技",
"code": "000700",
"sentiment": "neutral",
"confidence": 0.65,
"brief": "机器人概念热度退潮致股价回调-3%,公司澄清相关业务占比不足0.1%,基本面无实质变化",
"keywords": ["机器人概念", "股价回调", "澄清公告", "业务占比低"],
"news_headlines": [
"机器人概念'扰动'股价 模塑科技称相关业务占比不足0.1%2026-06-13",
"模塑科技:基于商业保密要求不便透露客户合作信息(2026-06-17"
]
},
{
"name": "腾讯控股",
"code": "00700",
"sentiment": "positive",
"confidence": 0.80,
"brief": "午后快速拉升涨超4.5%,科网板块整体回暖,富瑞重申首选股目标价795港元提供支撑",
"keywords": ["午后拉升", "涨超4%", "科网股回暖", "富瑞首推"],
"news_headlines": [
"腾讯控股午后涨超4%2026-06-24",
"港股科网股午后走强 腾讯控股涨3%2026-06-24",
"腾讯控股快速拉升涨超4.5%2026-06-24"
]
},
{
"name": "中芯国际",
"code": "00981",
"sentiment": "positive",
"confidence": 0.90,
"brief": "成交额超200亿元涨近10%,南向资金连续8天净买入,半导体板块资金追捧热度高",
"keywords": ["成交额超200亿", "大涨", "南向资金", "半导体"],
"news_headlines": [
"中芯国际成交额超200亿元(2026-06-24",
"中芯国际成交额超100亿元(2026-06-24",
"中芯国际获南向资金连续8天净买入(2026-06-23"
]
},
{
"name": "万科企业",
"code": "02202",
"sentiment": "negative",
"confidence": 0.85,
"brief": "今日再跌3.33%,房地产板块持续承压,2025年净亏损885.56亿元基本面疲弱",
"keywords": ["房地产", "下跌", "净亏损", "基本面承压"],
"news_headlines": [
"万科企业:2025年净亏损885.56亿元(2026-04-15",
"港股内房股集体上涨 万科企业涨超12%2026-05-04"
]
"confidence": 0.78,
"brief": "跌破止损位13.91,汽车零部件板块走弱",
"keywords": ["止损", "汽车零部件", "下跌"]
}
],
"risk_alerts": {
"德明利": "距止盈仅0.1%(现价810.00 vs TP 810.78),今日首度突破800元但高位放量需警惕回调。建议严格执行止盈。",
"建滔积层板": "距止损仅2.6%(现价93.85 vs SL 91.48),连续11天获南向资金净买入形成支撑,但累计涨幅已大需警惕获利回吐。",
"中国神华": "距止盈0.8%(现价41.86 vs TP 42.12),5月销量数据向好但行业整体偏弱,煤价承压。",
"法拉电子": "距止损3.4%(现价178.76 vs SL 172.96),今日涨停但需注意止损位上移保护利润。",
"华恒生物": "距止盈3.5%(现价21.40 vs TP 22.15),港股IPO利好但接近目标价。"
},
"sentiment_summary": {
"positive_count": 8,
"negative_count": 1,
"neutral_count": 1,
"overall": "偏多",
"note": "10只分析标的中8只偏多,1只中性(模塑科技回撤),1只偏空(万科基本面疲弱)。今日持仓多只大涨,但德明利和中国神华已接近止盈位,需注意执行。"
}
]
}
+97
View File
@@ -0,0 +1,97 @@
# 策略复盘闭环系统设计
> 版本: v1 | 最后更新: 2026-06-24
> 核心理念:每条策略建议都必须有回头检查,用实际结果驱动策略逻辑进化。
## 一、现状
| 环节 | 状态 |
|------|------|
| 策略生成 | ✅ `strategy_lifecycle.py` 按规则生成买入区/止损/止盈 |
| 策略评估 | ✅ 日评估六维分析每条策略的当前状况 |
| 策略重评 | ✅ 过期/偏离时自动触发重评 |
| **成功率追踪** | ❌ 有 `accuracy_stats` 空表,从未写入 |
| **复盘归因** | ❌ 没有"回头看"机制 |
| **策略逻辑修正** | ❌ 评估结果从不反馈到生成规则 |
| **验证测试** | ❌ 改完规则没有验证环节 |
## 二、闭环设计
```
生成策略 → 执行/等待 → 回头看(复盘) → 归因分析 → 修正策略逻辑 → 验证 → 部署
↑ |
└──── 迭代循环 ───────┘
```
### 环节1:回头看(复盘)
每条策略/建议在生成后 T+5、T+20、T+60 三个时间点回头检查:
| 检查点 | 时机 | 判断标准 |
|--------|------|---------|
| T+5 | 5个交易日后 | 止损触发?止盈触发?价格走向是否正确? |
| T+20 | 一个月后 | 中期趋势验证。买入区是否有效? |
| T+60 | 三个月后 | 长期逻辑验证。大方向判断是否正确? |
判断分类:
-**正确**:价格朝预期方向走了 > 止损/止盈间距的 50%
- ⚠️ **部分正确**:方向对了但幅度不够,或方向对但时机差
-**错误**:方向错了,或止损被打后价格反转了
-**待定**:还在运行中,未到判断时点
### 环节2:归因分析
对 ❌ 错误 和 ⚠️ 部分正确 的做根因分类:
| 失败模式 | 判断条件 | 修复方向 |
|----------|---------|---------|
| 止损过紧 | 价格跌破止损 < 3天后回到买入区 | 放宽止损到强支撑 × 0.95 |
| 入场过早 | 买入后继续跌 > 入场点 10% 才反弹 | 买入区下移,等缩量确认 |
| 止盈过近 | 价格突破止盈 < 5天后继续涨 > 15% | 止盈放到更高阻力位 |
| 方向看错 | 价格持续朝反方向走 | 检查多周期趋势判断逻辑 |
| 情景错配 | 策略假设的情景与实际不符 | 加入情景过滤条件 |
| 信号误判 | timing_signal 信号错误 | 修正信号合成逻辑 |
| 行业拖累 | 个股选对了但行业暴跌 | 加入行业动量过滤 |
### 环节3:策略逻辑修正
归因结果反馈到策略生成规则的几个层面:
1. **prompt_manager 规则更新** — 止损/止盈/买入区的生成规则
2. **timing_signal 合成权重调整** — 各因子的权重
3. **股票分类规则调整** — 什么情况归为弱势/深套/短炒
4. **情景判定阈值调整** — detect_scenario 的参数
### 环节4:回测验证
修正后的规则用历史数据跑模拟,对比新旧规则的成功率:
```
模拟方式:取过去60天的数据
1. 用旧规则生成每条策略 → 计算成功率
2. 用新规则生成同样股票的策略 → 计算成功率
3. 对比:新规则是否 > 旧规则 +5%?
4. 如果是 → 部署新规则
5. 如果不是 → 继续调整
```
## 三、参考来源
知识库中有多篇量化分析文章可以参考:
- 止损/止盈的统计学最优位置
- 多因子信号合成的权重分配方法
- 不同市场环境下的策略参数调优
- 回测验证的方法论和陷阱(过拟合/幸存者偏差)
## 四、实施路线
### Phase 1(本session
- 策略复盘脚本:遍历 active 策略,检查实际结果,写入 accuracy_stats
- 归因分析:对失败策略分类失败模式
- 初步报告:当前策略整体成功率 + 常见失败模式
### Phase 2(后续)
- 策略逻辑修正:根据归因调整 prompt_manager 规则
- 回测验证:用历史数据验证新规则
- 知识库文章萃取:从量化分析文章中提取可用因子
- 持续迭代:每周跑一次复盘,持续优化
View File
+55 -51
View File
@@ -151,7 +151,17 @@ def refresh_data_prices():
updated += 1
changed = True
if changed:
pf['updated_at'] = datetime.now().strftime('%Y-%m-%d %H:%M')
json.dump(pf, open(PORTFOLIO_PATH, 'w'), ensure_ascii=False, indent=2)
elif pf.get('updated_at'):
# 即使价格无变化,每10分钟刷新一次updated_at,防健康检查误报
try:
last_ts = datetime.strptime(pf['updated_at'], '%Y-%m-%d %H:%M')
if (datetime.now() - last_ts).total_seconds() > 600:
pf['updated_at'] = datetime.now().strftime('%Y-%m-%d %H:%M')
json.dump(pf, open(PORTFOLIO_PATH, 'w'), ensure_ascii=False, indent=2)
except:
pass
# 更新watchlist(只在价格变化时写入)
changed = False
@@ -282,36 +292,32 @@ def record_event(code, name, event_type, price, trigger_value, event_label=""):
pass # SQLite 写入失败不影响主流程
def get_trigger_zones(trigger):
"""返回该trigger所有可监控的区间列表,跳过已执行的batch"""
def get_trigger_zones(d):
"""返回该decision所有可监控的区间列表,从顶层字段读取"""
zones = []
for key, label in [
("entry_zone", "加仓区间"),
("batch1_price", "试仓区间"),
("batch2_price", "加仓区间"),
("take_profit_zone", "止盈区间"),
("watch_low", "关注区间"),
("watch_high", "减仓区间"),
("watch_break", "止损区间")
]:
status_key = key.replace("_price", "_status")
if status_key in trigger and trigger[status_key] == "executed":
continue
val = trigger.get(key, "")
if val and "~" in val:
try:
parts = val.split("~")
lo, hi = float(parts[0]), float(parts[1])
zones.append((key, label, lo, hi))
except:
pass
sl = trigger.get("stop_loss", "")
if sl:
is_holding = d.get('shares', 0) > 0
# 买入区间(自选和持仓都监控)
el = d.get("entry_low", 0)
eh = d.get("entry_high", 0)
if el and eh and float(el) > 0 and float(eh) > 0:
try:
sl_price = float(sl) if isinstance(sl, (int, float)) else float(sl)
zones.append(("stop_loss", "止损", 0, sl_price))
zones.append(("entry_zone", "买入区间", float(el), float(eh)))
except:
pass
# 止损+止盈(只有持仓才监控,自选无意义)
if is_holding:
sl = d.get("stop_loss", 0)
if sl and float(sl) > 0:
try:
zones.append(("stop_loss", "止损", 0, float(sl)))
except:
pass
tp = d.get("take_profit", 0)
if tp and float(tp) > 0:
try:
zones.append(("take_profit_zone", "止盈区间", 0, float(tp)))
except:
pass
return zones
@@ -344,7 +350,7 @@ def run_once(round_label=""):
print(f"{label} 无法读取decisions.json", file=sys.stderr)
return
active = [d for d in dec.get("decisions", []) if d.get("status") == "active"]
active = [d for d in dec.get("decisions", []) if d.get("status") in ("active", "updated")]
state = load_state()
outputs = []
state_updated = False
@@ -352,8 +358,7 @@ def run_once(round_label=""):
# 收集所有需要检查的代码
check_codes = set()
for d in active:
trig = d.get("trigger", {})
if trig:
if get_trigger_zones(d):
check_codes.add(d["code"])
# 批量拉取这些股票的价格
@@ -361,18 +366,15 @@ def run_once(round_label=""):
for d in active:
code = d["code"]
trig = d.get("trigger", {})
if not trig:
continue
zones = get_trigger_zones(trig)
zones = get_trigger_zones(d)
if not zones:
continue
price_info = prices.get(code)
if not price_info:
continue
price, _ = price_info
price, _, _ = price_info
if price == 0:
continue
@@ -392,12 +394,12 @@ def run_once(round_label=""):
else:
extra = ""
if "_price" in key:
batch_shares = trig.get(key.replace("_price", "_shares"), "")
action = trig.get(key.replace("_price", "_action"), "")
batch_shares = d.get(key.replace("_price", "_shares"), "")
action = d.get(key.replace("_price", "_action"), "")
if batch_shares:
extra = f" {action}{batch_shares}" if action else f" {batch_shares}"
elif key in ("take_profit_zone",):
act = trig.get("take_profit_action", "")
act = d.get("take_profit_action", "")
if act:
extra = f"{act}"
branch_sfx = _branch_alert_suffix(code, price, d.get('shares',0), d.get('cost',0))
@@ -420,7 +422,7 @@ def run_once(round_label=""):
price_info = prices.get(code)
if not price_info:
continue
price, _ = price_info
price, _, _ = price_info
if price == 0:
continue
@@ -510,19 +512,21 @@ def run_once(round_label=""):
# 简短一行一个触发
for o in outputs:
print(o)
# 直接推到老爸私信(免等待 cron_to_xmpp
try:
body = "\n".join([f"{now_str}"] + outputs)
payload = json.dumps({
"to": "hmo@yoin.fun", "body": body, "type": "chat",
}).encode("utf-8")
req = urllib.request.Request(
"http://127.0.0.1:5805/", data=payload,
headers={"Content-Type": "application/json"},
)
urllib.request.urlopen(req, timeout=5)
except Exception:
pass
# 推送XMPP(只推关键事件:止损跌破+情景切换,不推买入区进出/重评等操作细节
critical = [o for o in outputs if o.startswith(("⚠️", "🌀"))]
if critical:
try:
body = "\n".join([f"{now_str}"] + critical)
payload = json.dumps({
"to": "hmo@yoin.fun", "body": body, "type": "chat",
}).encode("utf-8")
req = urllib.request.Request(
"http://127.0.0.1:5805/", data=payload,
headers={"Content-Type": "application/json"},
)
urllib.request.urlopen(req, timeout=5)
except Exception:
pass
# else: SILENT — 无触发,无输出,不推
if state_updated:
+3
View File
@@ -56,6 +56,9 @@ def main():
code = clean_cell(r[0])
name = r[1].strip()
shares = int(clean_cell(r[2]))
# 跳过0股(已清仓的残留条目)
if shares <= 0:
continue
price_raw = r[4].strip()
currency = 'HKD' if '港币' in price_raw or '' in r[10] else 'CNY'
price_str = price_raw.replace('港币', '').replace('港元', '').replace('', '').strip()
+4 -4
View File
@@ -183,14 +183,14 @@ def trigger_regen_sync(stock_codes=None):
def load_cash():
"""从 portfolio.json 实时读现金,不硬编码"""
"""从 portfolio.json 实时读可用现金(不含冻结部分),不硬编码"""
try:
with open(PORTFOLIO_PATH) as f:
data = json.load(f)
if isinstance(data, dict):
return data.get("cash", 0)
return data.get("cash_available", data.get("cash", 0))
if isinstance(data, list) and len(data) > 1 and isinstance(data[1], dict):
return data[1].get("cash", 0)
return data[1].get("cash_available", data[1].get("cash", 0))
return 0
except Exception:
return 0
@@ -437,7 +437,7 @@ def main():
try:
with open("/home/hmo/web-dashboard/data/portfolio.json") as f:
pf = json.load(f)
available_cash = pf.get("cash", 0) or 0
available_cash = pf.get("cash_available", pf.get("cash", 0)) or 0
# 直接取 portfolio.json 的总资产(导入时已做港币→人民币换算)
total_assets = pf.get("total_assets", 0) or 0
if total_assets <= 0:
+196
View File
@@ -0,0 +1,196 @@
#!/usr/bin/env python3
"""strategy_review.py — 策略成功率复盘 (no_agent)
遍历所有active策略,检查实际结果,写入accuracy_stats表。
归因分析失败模式,输出复盘报告。
用法:
python3 scripts/strategy_review.py # 正常复盘
python3 scripts/strategy_review.py --force # 强制重新评估所有
"""
import json, sqlite3, sys, time, urllib.request
from pathlib import Path
from datetime import datetime, timedelta
from collections import Counter
BASE = Path("/home/hmo/MoFin")
DATA = BASE / "data"
DB_PATH = DATA / "mofin.db"
DECISIONS_PATH = DATA / "decisions.json"
FAILURE_MODES = {
"stop_too_tight": {"label": "止损过紧", "fix": "放宽止损到强支撑×0.95"},
"entry_too_early": {"label": "入场过早", "fix": "买入区下移,等缩量确认"},
"tp_too_close": {"label": "止盈过近", "fix": "止盈放到更高阻力位"},
"wrong_direction": {"label": "方向看错", "fix": "检查多周期趋势判断"},
"wrong_regime": {"label": "情景错配", "fix": "加入情景过滤条件"},
"bad_signal": {"label": "信号误判", "fix": "修正信号合成逻辑"},
"sector_drag": {"label": "行业拖累", "fix": "加入行业动量过滤"},
}
def fetch_price(code):
"""拉腾讯实时价"""
try:
prefix = "sh" if code.startswith(('60','68','51','56','50')) else "sz" if code.startswith(('00','30','15')) else "hk"
url = f"http://qt.gtimg.cn/q={prefix}{code}"
req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
resp = urllib.request.urlopen(req, timeout=5).read().decode('gbk')
fld = resp.split('=')[1].strip().strip('"').strip(';').split('~')
return float(fld[3]) if len(fld) > 3 else 0
except:
return 0
def classify_outcome(strategy, price):
"""对单条策略做结果分类"""
sl = strategy.get("stop_loss", 0) or 0
tp = strategy.get("take_profit", 0) or 0
entry_low = strategy.get("entry_low", 0) or 0
entry_high = strategy.get("entry_high", 0) or 0
created = strategy.get("created_at", "") or strategy.get("timestamp", "")
code = strategy.get("code", "")
name = strategy.get("name", "")
if not created or not price:
return "pending", None, None
# 计算天数
try:
created_dt = datetime.fromisoformat(created)
days = (datetime.now() - created_dt).days
except:
days = 0
# 判断结果
if sl > 0 and price <= sl:
# 止损触发
return "wrong", "stop_too_tight", f"止损{sl},现价{price}跌破止损"
elif tp > 0 and price >= tp:
# 止盈触发
return "correct", None, f"止盈{tp},现价{price}达到目标"
elif sl > 0 and price <= sl * 1.03:
# 逼近止损
return "pending", None, f"距止损仅{(price-sl)/sl*100:.1f}%"
elif entry_low > 0 and price < entry_low * 0.9:
# 入场后大跌
drift = (entry_low - price) / entry_low
if drift > 0.15:
return "wrong", "entry_too_early", f"入场{entry_low}后跌{drift:.0f}%至{price}"
else:
return "partial", None, f"入场{entry_low}后微跌{drift:.1f}%"
elif tp > 0 and price >= tp * 0.85:
# 接近止盈但没到
return "correct", None, f"距止盈{tp}{(tp-price)/price*100:.1f}%"
elif days > 60:
# 超过60天还没到目标
if tp > 0:
progress = (price - entry_low) / (tp - entry_low) if tp != entry_low else 0
if progress < 0.3:
return "wrong", "tp_too_close", f"60天+仅走{progress:.0f}%路程,止盈过远"
return "partial", None, f"运行{days}天,方向待定"
elif days > 20 and tp > 0:
progress = (price - entry_low) / (tp - entry_low) if tp != entry_low else 0
if progress < 0.2:
return "partial", None, f"20天+仅走{progress:.0f}%"
return "correct", None, f"20天走{progress:.0f}%"
else:
return "pending", None, f"运行{days}天,待观察"
def analyze_failure_mode(failure_id, strategy, price):
"""对失败策略做根因分类"""
sl = strategy.get("stop_loss", 0) or 0
tp = strategy.get("take_profit", 0) or 0
entry = strategy.get("entry_low", 0) or strategy.get("entry_high", 0) or 0
if failure_id == "stop_too_tight":
# 止损过紧:止损后价格是否反弹了?
return {"mode": "stop_too_tight", "severity": "high",
"detail": f"止损{sl}被打,检查强支撑是否在{sl}以下足够空间"}
elif failure_id == "entry_too_early":
return {"mode": "entry_too_early", "severity": "medium",
"detail": f"买入区下沿{entry}后继续跌至{price},需缩量确认后再入"}
elif failure_id == "tp_too_close":
return {"mode": "tp_too_close", "severity": "medium",
"detail": f"止盈{tp}过早到达或从未到达,检查阻力位是否准确"}
else:
return {"mode": "unknown", "severity": "low", "detail": "需人工分析"}
def review():
start = time.time()
force = "--force" in sys.argv
decisions = json.loads(DECISIONS_PATH.read_text())
strategies = decisions.get("decisions", [])
conn = sqlite3.connect(str(DB_PATH))
results = {"correct": 0, "wrong": 0, "partial": 0, "pending": 0, "total": 0}
failure_counter = Counter()
summary_lines = []
for s in strategies:
code = s.get("code", "")
name = s.get("name", "")
status = s.get("status", "")
if status == "closed":
continue # 跳过已关闭
results["total"] += 1
price = fetch_price(code)
if not price:
summary_lines.append(f" ⏭️ {name}({code}): 无法获取价格")
results["pending"] += 1
continue
outcome, failure_id, detail = classify_outcome(s, price)
results[outcome] += 1
if outcome == "wrong" and failure_id:
failure_counter[failure_id] += 1
analysis = analyze_failure_mode(failure_id, s, price)
summary_lines.append(f"{name}({code}): {FAILURE_MODES.get(failure_id,{}).get('label','未知')}{detail}")
elif outcome == "correct":
summary_lines.append(f"{name}({code}): {detail}")
elif outcome == "partial":
summary_lines.append(f" ⚠️ {name}({code}): {detail}")
else:
summary_lines.append(f"{name}({code}): {detail}")
# 写入 accuracy_stats
conn.execute(
"INSERT INTO accuracy_stats (total_advice, correct, wrong, partial, pending, "
"accuracy_pct, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?)",
(results["total"], results["correct"], results["wrong"],
results["partial"], results["pending"],
round(results["correct"] / max(results["total"] - results["pending"], 1) * 100, 1),
datetime.now().isoformat()))
conn.commit()
conn.close()
# 输出报告
elapsed = time.time() - start
total_eval = results["total"] - results["pending"]
accuracy = results["correct"] / max(total_eval, 1) * 100
print(f"策略复盘 | {datetime.now().strftime('%Y-%m-%d')} | {results['total']}条策略 | ({elapsed:.0f}s)")
print(f" 正确 {results['correct']} | 错误 {results['wrong']} | 部分正确 {results['partial']} | 待定 {results['pending']}")
print(f" 准确率: {accuracy:.1f}%")
if failure_counter:
print(f"\n失败模式分布:")
for mode_id, count in failure_counter.most_common():
info = FAILURE_MODES.get(mode_id, {})
print(f" {info.get('label', mode_id)} ({count}次): {info.get('fix', '')}")
if summary_lines:
print(f"\n逐条复盘:")
for line in summary_lines:
print(line)
if __name__ == "__main__":
review()
+14 -1
View File
@@ -1657,6 +1657,7 @@ def regenerate_all(stdout=True):
"position_advice": result.get("position_advice", "中等仓位"),
"time_horizon": result.get("time_horizon", "2周~3月"),
}
new_entry["trigger"] = trig
# created_at: 首次创建时设置,后续 preserve
old_entry = existing_decisions.get(code, {})
if old_entry.get("created_at"):
@@ -1786,7 +1787,19 @@ def regenerate_all(stdout=True):
existing_pf = json.load(open(PORTFOLIO_PATH))
except Exception:
existing_pf = {}
existing_pf["holdings"] = pf.get("holdings", [])
# 保留 price/change_pct — price_monitor 维护的实时价,regenerate_all 不应清除
_existing_holdings_map = {}
for _h in existing_pf.get('holdings', []):
if _h.get('code'):
_existing_holdings_map[_h['code']] = _h
_new_holdings = pf.get("holdings", [])
for _h in _new_holdings:
_code = _h.get('code')
if _code and _code in _existing_holdings_map:
_old = _existing_holdings_map[_code]
_h['price'] = _old.get('price', 0)
_h['change_pct'] = _old.get('change_pct', 0)
existing_pf["holdings"] = _new_holdings
existing_pf["updated_at"] = datetime.now().strftime('%Y-%m-%d %H:%M')
json.dump(existing_pf, open(PORTFOLIO_PATH, "w"), ensure_ascii=False, indent=2)
json.dump(wl, open(WATCHLIST_PATH, "w"), ensure_ascii=False, indent=2)
+1 -1
View File
@@ -71,7 +71,7 @@ def audit_stocks(conn):
def audit_strategies(conn):
try:
dec = json.loads((WEB_DATA / "decisions.json").read_text())
active = [d for d in dec.get("decisions", []) if d.get("status") == "active"]
active = [d for d in dec.get("decisions", []) if d.get("status") in ("active", "updated")]
stale_count = 0
no_stop = 0
for d in active: