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:
Binary file not shown.
Binary file not shown.
@@ -20,3 +20,78 @@
|
|||||||
- 自选股18只全部处于买入区(价格距离买入区<3%),属正常范围
|
- 自选股18只全部处于买入区(价格距离买入区<3%),属正常范围
|
||||||
- 其中2只策略为空(楚江新材、中谷物流)— 需补充
|
- 其中2只策略为空(楚江新材、中谷物流)— 需补充
|
||||||
- 整体仓位93.02%,弱势+深套占比41.9%>40%
|
- 整体仓位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.py:load_cash() 和 calc_position() 优先读 cash_available,fallback到 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
File diff suppressed because it is too large
Load Diff
+133
-133
@@ -1,154 +1,154 @@
|
|||||||
{
|
{
|
||||||
"updated_at": "2026-06-24 12:00:22",
|
"updated_at": "2026-06-25 12:00:51",
|
||||||
"data_timestamp": "2026-06-24 12:00:00",
|
"data_timestamp": "2026-06-25 12:00:00",
|
||||||
"session": "midday",
|
"session": "midday",
|
||||||
"has_valid_data": true,
|
"has_valid_data": true,
|
||||||
"indices": {
|
"indices": {
|
||||||
"上证指数": {
|
"上证指数": {
|
||||||
"price": 4096.14,
|
"price": 4125.76,
|
||||||
"change_pct": -0.25,
|
"change_pct": 0.36,
|
||||||
"high": 4113.19,
|
"high": 4133.1,
|
||||||
"low": 4075.49
|
"low": 4093.01
|
||||||
},
|
},
|
||||||
"深证成指": {
|
"深证成指": {
|
||||||
"price": 15906.57,
|
"price": 16285.83,
|
||||||
"change_pct": 0.33,
|
"change_pct": 1.46,
|
||||||
"high": 15943.66,
|
"high": 16303.39,
|
||||||
"low": 15730.16
|
"low": 16058.85
|
||||||
},
|
},
|
||||||
"创业板指": {
|
"创业板指": {
|
||||||
"price": 4209.9,
|
"price": 4336.74,
|
||||||
"change_pct": 0.42,
|
"change_pct": 2.01,
|
||||||
"high": 4233.7,
|
"high": 4338.71,
|
||||||
"low": 4161.58
|
"low": 4242.86
|
||||||
},
|
},
|
||||||
"科创50": {
|
"科创50": {
|
||||||
"price": 1963.82,
|
"price": 2072.5,
|
||||||
"change_pct": 2.48,
|
"change_pct": 4.18,
|
||||||
"high": 1975.25,
|
"high": 2076.88,
|
||||||
"low": 1886.74
|
"low": 2000.8
|
||||||
},
|
},
|
||||||
"恒生指数": {
|
"恒生指数": {
|
||||||
"price": 23353.31,
|
"price": 23038.52,
|
||||||
"change_pct": 0.07,
|
"change_pct": -1.6,
|
||||||
"high": 23521.52,
|
"high": 23388.5,
|
||||||
"low": 23248.87
|
"low": 23004.75
|
||||||
},
|
},
|
||||||
"国企指数": {
|
"国企指数": {
|
||||||
"price": 7756.13,
|
"price": 7601.15,
|
||||||
"change_pct": -0.04,
|
"change_pct": -2.11,
|
||||||
"high": 7817.92,
|
"high": 7757.49,
|
||||||
"low": 7718.92
|
"low": 7583.03
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"structure": {
|
"structure": {
|
||||||
"overall": "bullish",
|
"overall": "strong_bullish",
|
||||||
"description": "科技成长领涨"
|
"description": "科技成长领涨"
|
||||||
},
|
},
|
||||||
"key_sectors": [
|
"key_sectors": [
|
||||||
{
|
{
|
||||||
"name": "国证芯片",
|
"name": "国证芯片",
|
||||||
"change_pct": 3.2
|
"change_pct": 5.17
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "上证信息",
|
"name": "上证信息",
|
||||||
"change_pct": 2.99
|
"change_pct": 4.32
|
||||||
},
|
|
||||||
{
|
|
||||||
"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
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "机器人产业",
|
"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": [
|
"top_gainers": [
|
||||||
{
|
{
|
||||||
"name": "化学制药",
|
"name": "机场航运",
|
||||||
"code": "",
|
"code": "",
|
||||||
"price": 0,
|
"price": 0,
|
||||||
"change": 3.68,
|
"change": 4.26,
|
||||||
"volume": 2844.37,
|
"volume": 1319.21,
|
||||||
"turnover": 477.43,
|
"turnover": 65.18,
|
||||||
"net_inflow": -1.16,
|
"net_inflow": 13.1,
|
||||||
"up_count": 144,
|
"up_count": 13,
|
||||||
"down_count": 13,
|
"down_count": 0,
|
||||||
"avg_price": 16.79,
|
"avg_price": 4.94,
|
||||||
"lead_stock": "新赣江",
|
"lead_stock": "华夏航空",
|
||||||
"lead_stock_change": 27.9
|
"lead_stock_change": 10.03
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "生物制品",
|
"name": "保险",
|
||||||
"code": "",
|
"code": "",
|
||||||
"price": 0,
|
"price": 0,
|
||||||
"change": 2.96,
|
"change": 3.56,
|
||||||
"volume": 808.83,
|
"volume": 348.27,
|
||||||
"turnover": 136.16,
|
"turnover": 106.54,
|
||||||
"net_inflow": -0.75,
|
"net_inflow": 6.75,
|
||||||
"up_count": 47,
|
"up_count": 5,
|
||||||
"down_count": 7,
|
"down_count": 0,
|
||||||
"avg_price": 16.83,
|
"avg_price": 30.59,
|
||||||
"lead_stock": "赛升药业",
|
"lead_stock": "中国人保",
|
||||||
"lead_stock_change": 18.44
|
"lead_stock_change": 5.63
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "医疗服务",
|
"name": "证券",
|
||||||
"code": "",
|
"code": "",
|
||||||
"price": 0,
|
"price": 0,
|
||||||
"change": 2.39,
|
"change": 3.31,
|
||||||
"volume": 1079.74,
|
"volume": 5369.91,
|
||||||
"turnover": 225.78,
|
"turnover": 678.34,
|
||||||
"net_inflow": -0.93,
|
"net_inflow": 62.2,
|
||||||
"up_count": 44,
|
"up_count": 50,
|
||||||
"down_count": 11,
|
"down_count": 0,
|
||||||
"avg_price": 20.91,
|
"avg_price": 12.63,
|
||||||
"lead_stock": "睿智医药",
|
"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": "合富中国",
|
|
||||||
"lead_stock_change": 9.99
|
"lead_stock_change": 9.99
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "中药",
|
"name": "元件",
|
||||||
"code": "",
|
"code": "",
|
||||||
"price": 0,
|
"price": 0,
|
||||||
"change": 2.18,
|
"change": 2.55,
|
||||||
"volume": 1208.33,
|
"volume": 1951.11,
|
||||||
"turnover": 107.45,
|
"turnover": 1357.67,
|
||||||
"net_inflow": 2.87,
|
"net_inflow": 87.09,
|
||||||
"up_count": 57,
|
"up_count": 42,
|
||||||
"down_count": 10,
|
"down_count": 20,
|
||||||
"avg_price": 8.89,
|
"avg_price": 69.58,
|
||||||
"lead_stock": "特一药业",
|
"lead_stock": "中京电子",
|
||||||
"lead_stock_change": 9.97
|
"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": [
|
"top_losers": [
|
||||||
@@ -156,45 +156,45 @@
|
|||||||
"name": "贵金属",
|
"name": "贵金属",
|
||||||
"code": "",
|
"code": "",
|
||||||
"price": 0,
|
"price": 0,
|
||||||
"change": -8.6,
|
"change": -3.86,
|
||||||
"volume": 1529.11,
|
"volume": 933.0,
|
||||||
"turnover": 390.56,
|
"turnover": 231.38,
|
||||||
"net_inflow": -61.53,
|
"net_inflow": -19.5,
|
||||||
"up_count": 1,
|
"up_count": 0,
|
||||||
"down_count": 13,
|
"down_count": 14,
|
||||||
"avg_price": 25.54,
|
"avg_price": 24.8,
|
||||||
"lead_stock": "株冶集团",
|
"lead_stock": "株冶集团",
|
||||||
"lead_stock_change": 4.42
|
"lead_stock_change": -1.23
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "小金属",
|
"name": "教育",
|
||||||
"code": "",
|
"code": "",
|
||||||
"price": 0,
|
"price": 0,
|
||||||
"change": -5.58,
|
"change": -2.98,
|
||||||
"volume": 2154.58,
|
"volume": 223.13,
|
||||||
"turnover": 1125.15,
|
"turnover": 10.17,
|
||||||
"net_inflow": -68.28,
|
"net_inflow": -1.14,
|
||||||
"up_count": 4,
|
"up_count": 2,
|
||||||
"down_count": 25,
|
"down_count": 13,
|
||||||
"avg_price": 52.22,
|
"avg_price": 4.56,
|
||||||
"lead_stock": "长裕集团",
|
"lead_stock": "*ST高科",
|
||||||
"lead_stock_change": 9.99
|
"lead_stock_change": 2.02
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "工业金属",
|
"name": "农化制品",
|
||||||
"code": "",
|
"code": "",
|
||||||
"price": 0,
|
"price": 0,
|
||||||
"change": -5.53,
|
"change": -2.69,
|
||||||
"volume": 6361.35,
|
"volume": 1142.32,
|
||||||
"turnover": 809.03,
|
"turnover": 172.6,
|
||||||
"net_inflow": -125.48,
|
"net_inflow": -15.41,
|
||||||
"up_count": 5,
|
"up_count": 3,
|
||||||
"down_count": 50,
|
"down_count": 58,
|
||||||
"avg_price": 12.72,
|
"avg_price": 15.11,
|
||||||
"lead_stock": "锌业股份",
|
"lead_stock": "兴发集团",
|
||||||
"lead_stock_change": 6.35
|
"lead_stock_change": 3.13
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"sector_up_ratio": 48.9,
|
"sector_up_ratio": 11.1,
|
||||||
"sector_mood": "neutral"
|
"sector_mood": "bearish"
|
||||||
}
|
}
|
||||||
+35278
-49790
File diff suppressed because it is too large
Load Diff
+576
-558
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+234
-8
@@ -53,6 +53,12 @@
|
|||||||
"high": 116.94,
|
"high": 116.94,
|
||||||
"low": 105.76,
|
"low": 105.76,
|
||||||
"close": 115.4
|
"close": 115.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 118.5,
|
||||||
|
"low": 106.9,
|
||||||
|
"close": 117.36
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"002594": [
|
"002594": [
|
||||||
@@ -109,6 +115,12 @@
|
|||||||
"high": 88.32,
|
"high": 88.32,
|
||||||
"low": 82.78,
|
"low": 82.78,
|
||||||
"close": 83.3
|
"close": 83.3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 84.7,
|
||||||
|
"low": 81.34,
|
||||||
|
"close": 82.2
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"00700": [
|
"00700": [
|
||||||
@@ -165,6 +177,12 @@
|
|||||||
"high": 439.8,
|
"high": 439.8,
|
||||||
"low": 412.6,
|
"low": 412.6,
|
||||||
"close": 428.8
|
"close": 428.8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 439.8,
|
||||||
|
"low": 412.6,
|
||||||
|
"close": 418.6
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"000700": [
|
"000700": [
|
||||||
@@ -221,6 +239,12 @@
|
|||||||
"high": 15.6,
|
"high": 15.6,
|
||||||
"low": 14.3,
|
"low": 14.3,
|
||||||
"close": 14.52
|
"close": 14.52
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 15.22,
|
||||||
|
"low": 13.81,
|
||||||
|
"close": 13.89
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"001309": [
|
"001309": [
|
||||||
@@ -277,6 +301,12 @@
|
|||||||
"high": 816.88,
|
"high": 816.88,
|
||||||
"low": 706.0,
|
"low": 706.0,
|
||||||
"close": 810.0
|
"close": 810.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 891.0,
|
||||||
|
"low": 743.51,
|
||||||
|
"close": 891.0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"00968": [
|
"00968": [
|
||||||
@@ -333,6 +363,12 @@
|
|||||||
"high": 2.26,
|
"high": 2.26,
|
||||||
"low": 1.93,
|
"low": 1.93,
|
||||||
"close": 2.0
|
"close": 2.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 2.08,
|
||||||
|
"low": 1.93,
|
||||||
|
"close": 2.06
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"00981": [
|
"00981": [
|
||||||
@@ -389,6 +425,12 @@
|
|||||||
"high": 86.45,
|
"high": 86.45,
|
||||||
"low": 76.5,
|
"low": 76.5,
|
||||||
"close": 84.8
|
"close": 84.8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 88.7,
|
||||||
|
"low": 77.6,
|
||||||
|
"close": 86.0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"01070": [
|
"01070": [
|
||||||
@@ -445,6 +487,12 @@
|
|||||||
"high": 13.47,
|
"high": 13.47,
|
||||||
"low": 12.55,
|
"low": 12.55,
|
||||||
"close": 13.1
|
"close": 13.1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 13.29,
|
||||||
|
"low": 12.55,
|
||||||
|
"close": 12.55
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"01088": [
|
"01088": [
|
||||||
@@ -501,6 +549,12 @@
|
|||||||
"high": 43.14,
|
"high": 43.14,
|
||||||
"low": 41.26,
|
"low": 41.26,
|
||||||
"close": 41.9
|
"close": 41.9
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 42.18,
|
||||||
|
"low": 40.44,
|
||||||
|
"close": 40.4
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"01211": [
|
"01211": [
|
||||||
@@ -557,6 +611,12 @@
|
|||||||
"high": 78.3,
|
"high": 78.3,
|
||||||
"low": 74.2,
|
"low": 74.2,
|
||||||
"close": 75.95
|
"close": 75.95
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 77.45,
|
||||||
|
"low": 74.2,
|
||||||
|
"close": 76.2
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"01478": [
|
"01478": [
|
||||||
@@ -613,6 +673,12 @@
|
|||||||
"high": 8.54,
|
"high": 8.54,
|
||||||
"low": 7.51,
|
"low": 7.51,
|
||||||
"close": 7.69
|
"close": 7.69
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 7.88,
|
||||||
|
"low": 7.11,
|
||||||
|
"close": 7.16
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"01888": [
|
"01888": [
|
||||||
@@ -669,6 +735,12 @@
|
|||||||
"high": 97.4,
|
"high": 97.4,
|
||||||
"low": 83.7,
|
"low": 83.7,
|
||||||
"close": 93.55
|
"close": 93.55
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 107.2,
|
||||||
|
"low": 87.6,
|
||||||
|
"close": 104.2
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"02202": [
|
"02202": [
|
||||||
@@ -725,6 +797,12 @@
|
|||||||
"high": 2.53,
|
"high": 2.53,
|
||||||
"low": 2.31,
|
"low": 2.31,
|
||||||
"close": 2.31
|
"close": 2.31
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 2.45,
|
||||||
|
"low": 2.21,
|
||||||
|
"close": 2.24
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"02318": [
|
"02318": [
|
||||||
@@ -781,6 +859,12 @@
|
|||||||
"high": 55.5,
|
"high": 55.5,
|
||||||
"low": 52.3,
|
"low": 52.3,
|
||||||
"close": 52.85
|
"close": 52.85
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 53.9,
|
||||||
|
"low": 51.2,
|
||||||
|
"close": 51.45
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"02359": [
|
"02359": [
|
||||||
@@ -837,6 +921,12 @@
|
|||||||
"high": 145.0,
|
"high": 145.0,
|
||||||
"low": 130.0,
|
"low": 130.0,
|
||||||
"close": 141.7
|
"close": 141.7
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 148.9,
|
||||||
|
"low": 131.3,
|
||||||
|
"close": 145.2
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"02388": [
|
"02388": [
|
||||||
@@ -893,6 +983,12 @@
|
|||||||
"high": 47.86,
|
"high": 47.86,
|
||||||
"low": 45.9,
|
"low": 45.9,
|
||||||
"close": 46.52
|
"close": 46.52
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 47.58,
|
||||||
|
"low": 45.9,
|
||||||
|
"close": 46.32
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"02628": [
|
"02628": [
|
||||||
@@ -949,6 +1045,12 @@
|
|||||||
"high": 30.56,
|
"high": 30.56,
|
||||||
"low": 28.06,
|
"low": 28.06,
|
||||||
"close": 28.32
|
"close": 28.32
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 29.48,
|
||||||
|
"low": 27.62,
|
||||||
|
"close": 28.3
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"06160": [
|
"06160": [
|
||||||
@@ -1005,6 +1107,12 @@
|
|||||||
"high": 168.6,
|
"high": 168.6,
|
||||||
"low": 160.0,
|
"low": 160.0,
|
||||||
"close": 165.2
|
"close": 165.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 168.9,
|
||||||
|
"low": 162.8,
|
||||||
|
"close": 166.2
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"06869": [
|
"06869": [
|
||||||
@@ -1061,6 +1169,12 @@
|
|||||||
"high": 305.0,
|
"high": 305.0,
|
||||||
"low": 251.2,
|
"low": 251.2,
|
||||||
"close": 261.2
|
"close": 261.2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 288.0,
|
||||||
|
"low": 251.2,
|
||||||
|
"close": 287.0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"09868": [
|
"09868": [
|
||||||
@@ -1117,6 +1231,12 @@
|
|||||||
"high": 52.3,
|
"high": 52.3,
|
||||||
"low": 48.82,
|
"low": 48.82,
|
||||||
"close": 49.14
|
"close": 49.14
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 50.8,
|
||||||
|
"low": 46.56,
|
||||||
|
"close": 47.42
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"09988": [
|
"09988": [
|
||||||
@@ -1173,6 +1293,12 @@
|
|||||||
"high": 103.4,
|
"high": 103.4,
|
||||||
"low": 97.65,
|
"low": 97.65,
|
||||||
"close": 99.4
|
"close": 99.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 101.5,
|
||||||
|
"low": 94.0,
|
||||||
|
"close": 94.6
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"300035": [
|
"300035": [
|
||||||
@@ -1229,6 +1355,12 @@
|
|||||||
"high": 17.1,
|
"high": 17.1,
|
||||||
"low": 15.96,
|
"low": 15.96,
|
||||||
"close": 16.08
|
"close": 16.08
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 16.41,
|
||||||
|
"low": 14.96,
|
||||||
|
"close": 15.13
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"300124": [
|
"300124": [
|
||||||
@@ -1285,17 +1417,15 @@
|
|||||||
"high": 68.8,
|
"high": 68.8,
|
||||||
"low": 65.74,
|
"low": 65.74,
|
||||||
"close": 66.31
|
"close": 66.31
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 70.32,
|
||||||
|
"low": 65.74,
|
||||||
|
"close": 66.84
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"300548": [
|
"300548": [
|
||||||
{
|
|
||||||
"date": "2026-03-27",
|
|
||||||
"open": 145.73,
|
|
||||||
"close": 150.7,
|
|
||||||
"high": 154.82,
|
|
||||||
"low": 142.25,
|
|
||||||
"volume": 192929.0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"date": "2026-03-30",
|
"date": "2026-03-30",
|
||||||
"open": 146.71,
|
"open": 146.71,
|
||||||
@@ -1757,6 +1887,12 @@
|
|||||||
"high": 309.6,
|
"high": 309.6,
|
||||||
"low": 275.86,
|
"low": 275.86,
|
||||||
"close": 282.23
|
"close": 282.23
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 299.97,
|
||||||
|
"low": 274.59,
|
||||||
|
"close": 281.9
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"300750": [
|
"300750": [
|
||||||
@@ -1813,6 +1949,12 @@
|
|||||||
"high": 414.04,
|
"high": 414.04,
|
||||||
"low": 386.66,
|
"low": 386.66,
|
||||||
"close": 395.36
|
"close": 395.36
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 402.55,
|
||||||
|
"low": 386.66,
|
||||||
|
"close": 401.9
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"518880": [
|
"518880": [
|
||||||
@@ -1869,6 +2011,12 @@
|
|||||||
"high": 8.674,
|
"high": 8.674,
|
||||||
"low": 8.426,
|
"low": 8.426,
|
||||||
"close": 8.515
|
"close": 8.515
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 8.53,
|
||||||
|
"low": 8.267,
|
||||||
|
"close": 8.287
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"600036": [
|
"600036": [
|
||||||
@@ -2031,6 +2179,12 @@
|
|||||||
"high": 178.76,
|
"high": 178.76,
|
||||||
"low": 160.6,
|
"low": 160.6,
|
||||||
"close": 178.76
|
"close": 178.76
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 191.55,
|
||||||
|
"low": 161.95,
|
||||||
|
"close": 190.04
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"600739": [
|
"600739": [
|
||||||
@@ -2149,6 +2303,12 @@
|
|||||||
"high": 30.0,
|
"high": 30.0,
|
||||||
"low": 27.33,
|
"low": 27.33,
|
||||||
"close": 27.65
|
"close": 27.65
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 27.97,
|
||||||
|
"low": 25.73,
|
||||||
|
"close": 25.92
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"688411": [
|
"688411": [
|
||||||
@@ -2205,6 +2365,12 @@
|
|||||||
"high": 285.98,
|
"high": 285.98,
|
||||||
"low": 261.8,
|
"low": 261.8,
|
||||||
"close": 266.19
|
"close": 266.19
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 283.6,
|
||||||
|
"low": 261.66,
|
||||||
|
"close": 275.89
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"688639": [
|
"688639": [
|
||||||
@@ -2261,6 +2427,12 @@
|
|||||||
"high": 22.47,
|
"high": 22.47,
|
||||||
"low": 20.99,
|
"low": 20.99,
|
||||||
"close": 21.4
|
"close": 21.4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 22.03,
|
||||||
|
"low": 17.12,
|
||||||
|
"close": 17.12
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"688795": [
|
"688795": [
|
||||||
@@ -2317,6 +2489,12 @@
|
|||||||
"high": 745.2,
|
"high": 745.2,
|
||||||
"low": 660.01,
|
"low": 660.01,
|
||||||
"close": 704.8
|
"close": 704.8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 717.58,
|
||||||
|
"low": 669.0,
|
||||||
|
"close": 700.0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"688802": [
|
"688802": [
|
||||||
@@ -2373,6 +2551,12 @@
|
|||||||
"high": 808.0,
|
"high": 808.0,
|
||||||
"low": 726.1,
|
"low": 726.1,
|
||||||
"close": 770.19
|
"close": 770.19
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 786.8,
|
||||||
|
"low": 726.1,
|
||||||
|
"close": 770.52
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"688981": [
|
"688981": [
|
||||||
@@ -2429,6 +2613,12 @@
|
|||||||
"high": 156.35,
|
"high": 156.35,
|
||||||
"low": 139.6,
|
"low": 139.6,
|
||||||
"close": 151.53
|
"close": 151.53
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 158.66,
|
||||||
|
"low": 141.32,
|
||||||
|
"close": 156.86
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"000711": [
|
"000711": [
|
||||||
@@ -2467,6 +2657,12 @@
|
|||||||
"high": 5.38,
|
"high": 5.38,
|
||||||
"low": 4.86,
|
"low": 4.86,
|
||||||
"close": 5.04
|
"close": 5.04
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 5.25,
|
||||||
|
"low": 4.79,
|
||||||
|
"close": 4.79
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"688630": [
|
"688630": [
|
||||||
@@ -2499,6 +2695,12 @@
|
|||||||
"high": 515.85,
|
"high": 515.85,
|
||||||
"low": 455.55,
|
"low": 455.55,
|
||||||
"close": 513.88
|
"close": 513.88
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 563.89,
|
||||||
|
"low": 455.55,
|
||||||
|
"close": 555.5
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"300690": [
|
"300690": [
|
||||||
@@ -2551,6 +2753,12 @@
|
|||||||
"high": 113.99,
|
"high": 113.99,
|
||||||
"low": 94.79,
|
"low": 94.79,
|
||||||
"close": 100.08
|
"close": 100.08
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 107.58,
|
||||||
|
"low": 94.79,
|
||||||
|
"close": 105.68
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"300308": [
|
"300308": [
|
||||||
@@ -2571,6 +2779,12 @@
|
|||||||
"high": 1395.0,
|
"high": 1395.0,
|
||||||
"low": 1282.15,
|
"low": 1282.15,
|
||||||
"close": 1312.18
|
"close": 1312.18
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 1345.09,
|
||||||
|
"low": 1280.02,
|
||||||
|
"close": 1323.4
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"600519": [
|
"600519": [
|
||||||
@@ -2591,6 +2805,12 @@
|
|||||||
"high": 1264.0,
|
"high": 1264.0,
|
||||||
"low": 1207.51,
|
"low": 1207.51,
|
||||||
"close": 1207.68
|
"close": 1207.68
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 1241.87,
|
||||||
|
"low": 1200.0,
|
||||||
|
"close": 1212.1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"601318": [
|
"601318": [
|
||||||
@@ -2611,6 +2831,12 @@
|
|||||||
"high": 52.43,
|
"high": 52.43,
|
||||||
"low": 49.03,
|
"low": 49.03,
|
||||||
"close": 49.12
|
"close": 49.12
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2026-06-25",
|
||||||
|
"high": 50.88,
|
||||||
|
"low": 48.56,
|
||||||
|
"close": 49.3
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"002171": [
|
"002171": [
|
||||||
|
|||||||
+4
-67
@@ -1,70 +1,7 @@
|
|||||||
{
|
{
|
||||||
"code": "001309",
|
"code": "001309",
|
||||||
"history": [
|
"name": "德明利",
|
||||||
{
|
"status": "watchlist",
|
||||||
"time": "2026-06-12T08:55:32.432962",
|
"converted_at": "2026-06-25 13:21",
|
||||||
"content": "**德明利(001309)** 现价617.7 | 仓位0% | 买入区585~647,知微6/9收紧区间。存储芯片回调充分,止损523安全。",
|
"note": "清仓转自选,价格参考: 药明康德@0 德明利@885.85"
|
||||||
"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"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
@@ -111,6 +111,11 @@
|
|||||||
"content": "- **腾讯(00700)** ¥466.2 | 昨日+4.79%强势,弱支撑457.2/弱压468,持有不操作",
|
"content": "- **腾讯(00700)** ¥466.2 | 昨日+4.79%强势,弱支撑457.2/弱压468,持有不操作",
|
||||||
"report_id": "cron_99c06255590a_2026-06-18_08-38-18"
|
"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",
|
"time": "2026-06-02T11:55:44.093905",
|
||||||
"content": "❌ 反例:腾讯00700,底仓100股(3.59%),浮盈+4.79%。看到\"距止盈470仅0.77%\"就建议触及减仓清仓 —— 机械执行,未考虑底仓属性+浮盈幅度。",
|
"content": "❌ 反例:腾讯00700,底仓100股(3.59%),浮盈+4.79%。看到\"距止盈470仅0.77%\"就建议触及减仓清仓 —— 机械执行,未考虑底仓属性+浮盈幅度。",
|
||||||
|
|||||||
@@ -51,6 +51,11 @@
|
|||||||
"content": "**中芯国际-H(00981)** 71.30 +0.09% — 与A股共振,策略买入区70~75已进入,持有",
|
"content": "**中芯国际-H(00981)** 71.30 +0.09% — 与A股共振,策略买入区70~75已进入,持有",
|
||||||
"report_id": "cron_99c06255590a_2026-06-16_08-38-28"
|
"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",
|
"time": "2026-06-02T12:55:54.836964",
|
||||||
"content": "• 中芯国际H(00981) ¥82.20 +3.46% — 高于买入区72-75",
|
"content": "• 中芯国际H(00981) ¥82.20 +3.46% — 高于买入区72-75",
|
||||||
|
|||||||
@@ -581,6 +581,11 @@
|
|||||||
"content": "**比亚迪股份(01211) 距止损仅3.1%!**",
|
"content": "**比亚迪股份(01211) 距止损仅3.1%!**",
|
||||||
"report_id": "cron_d42f2ce3b479_2026-06-17_20-20-48"
|
"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",
|
"time": "2026-06-22T08:55:38.754230",
|
||||||
"content": "| **比亚迪(01211)** | 成本$105.49,现价≈$84.25,浮亏-20.1%,止损$81.72距仅3% | 严格执行止损,破$82不犹豫 |",
|
"content": "| **比亚迪(01211)** | 成本$105.49,现价≈$84.25,浮亏-20.1%,止损$81.72距仅3% | 严格执行止损,破$82不犹豫 |",
|
||||||
|
|||||||
@@ -46,6 +46,11 @@
|
|||||||
"content": "长芯博创(300548) @281.99 +21.83% 放量走强持有,止损261.71;辽宁成大(600739) @10.09 -17.88% 弱撑10.0待企稳;海博思创(688411) @281",
|
"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"
|
"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",
|
"time": "2026-06-02T12:55:54.834592",
|
||||||
"content": "| 丘钛科技(01478) | 10.12 | -1.17% | 9.19% | 深套持有,止损9.0 |",
|
"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可考虑减",
|
"content": "**2. 丘钛科技(01478) 8.75HKD(-1.83%)** — 深套-36.90%,仓位8.13%为最重仓。评级⭐⭐⭐⭐⭐基本面强但短期无起色。仓位过重不宜补,持有等待,反弹至9.5可考虑减",
|
||||||
"report_id": "cron_d42f2ce3b479_2026-06-18_20-14-45"
|
"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",
|
"time": "2026-06-01T10:25:54.503460",
|
||||||
"content": "丘钛科技(01478) 仓位8.58% +4.10%→ 持有,走势健康",
|
"content": "丘钛科技(01478) 仓位8.58% +4.10%→ 持有,走势健康",
|
||||||
|
|||||||
@@ -56,6 +56,11 @@
|
|||||||
"content": "长芯博创(300548) @281.99 +21.83% 放量走强持有,止损261.71;辽宁成大(600739) @10.09 -17.88% 弱撑10.0待企稳;海博思创(688411) @281",
|
"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"
|
"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",
|
"time": "2026-06-02T14:55:53.464779",
|
||||||
"content": "| 建滔积层板(01888) | 49.48 | +4.30% | 42-44 | 🔴 远超买入区 |",
|
"content": "| 建滔积层板(01888) | 49.48 | +4.30% | 42-44 | 🔴 远超买入区 |",
|
||||||
|
|||||||
@@ -591,6 +591,11 @@
|
|||||||
"content": "| 万科企业 | 02202 | 2.69(-3.24%) | 补仓区2.5~2.6 | 高于补仓区 |",
|
"content": "| 万科企业 | 02202 | 2.69(-3.24%) | 补仓区2.5~2.6 | 高于补仓区 |",
|
||||||
"report_id": "cron_d39e265198ad_2026-06-03_10-58-48"
|
"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",
|
"time": "2026-06-04T09:55:40.300986",
|
||||||
"content": "- 万科(02202): 补仓区间2.5~2.6,昨收2.70,距+3.8%,未进入。",
|
"content": "- 万科(02202): 补仓区间2.5~2.6,昨收2.70,距+3.8%,未进入。",
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
{
|
{
|
||||||
"code": "02318",
|
"code": "02318",
|
||||||
"history": [
|
"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",
|
"time": "2026-06-01T15:56:03.416800",
|
||||||
"content": "🟢关注 中国平安(02318) | 现价60.40 | +0.58% | 买入区58-60,可建仓3%",
|
"content": "🟢关注 中国平安(02318) | 现价60.40 | +0.58% | 买入区58-60,可建仓3%",
|
||||||
|
|||||||
@@ -56,6 +56,11 @@
|
|||||||
"content": "长芯博创(300548) @281.99 +21.83% 放量走强持有,止损261.71;辽宁成大(600739) @10.09 -17.88% 弱撑10.0待企稳;海博思创(688411) @281",
|
"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"
|
"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",
|
"time": "2026-06-02T12:55:54.834592",
|
||||||
"content": "| 中银香港(02388) | 47.80 | -0.95% | 3.95% | 持有,止损46止盈52 |",
|
"content": "| 中银香港(02388) | 47.80 | -0.95% | 3.95% | 持有,止损46止盈52 |",
|
||||||
|
|||||||
@@ -46,6 +46,11 @@
|
|||||||
"content": "长芯博创(300548) @281.99 +21.83% 放量走强持有,止损261.71;辽宁成大(600739) @10.09 -17.88% 弱撑10.0待企稳;海博思创(688411) @281",
|
"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"
|
"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",
|
"time": "2026-06-02T12:55:54.834592",
|
||||||
"content": "| 中科电气(300035) | 16.44 | -2.66% | 1.77% | 深套持有,止损15.0 |",
|
"content": "| 中科电气(300035) | 16.44 | -2.66% | 1.77% | 深套持有,止损15.0 |",
|
||||||
|
|||||||
@@ -51,6 +51,11 @@
|
|||||||
"content": "• 黄金ETF(518880) 8.91 — 金价高位但ETF深套-26.9%,暂持有",
|
"content": "• 黄金ETF(518880) 8.91 — 金价高位但ETF深套-26.9%,暂持有",
|
||||||
"report_id": "cron_99c06255590a_2026-06-22_08-37-35"
|
"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",
|
"time": "2026-06-02T12:55:54.834592",
|
||||||
"content": "| 黄金ETF(518880) | 9.323 | -0.22% | 2.14% | 深套持有,止损9.0 |",
|
"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未收复。黄金近期承压下行,不加仓不补",
|
"content": "**3. 黄金ETF(518880) 8.908(-0.55%)** — 浮亏-26.93%,此前已破止损9.54未收复。黄金近期承压下行,不加仓不补",
|
||||||
"report_id": "cron_d42f2ce3b479_2026-06-18_20-14-45"
|
"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",
|
"time": "2026-06-01T10:25:54.503460",
|
||||||
"content": "黄金ETF华安(518880) 仓位2.16% +2.73%→ 持有,金价支撑",
|
"content": "黄金ETF华安(518880) 仓位2.16% +2.73%→ 持有,金价支撑",
|
||||||
|
|||||||
@@ -51,6 +51,11 @@
|
|||||||
"content": "• **紫金矿业(601899) ¥29.09 (-28.90%)** — 深套持有,止损24.73,目标30.06",
|
"content": "• **紫金矿业(601899) ¥29.09 (-28.90%)** — 深套持有,止损24.73,目标30.06",
|
||||||
"report_id": "cron_99c06255590a_2026-06-15_08-41-00"
|
"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",
|
"time": "2026-06-01T10:25:54.419132",
|
||||||
"content": "2. **紫金矿业(601899)** 进入加仓区间29-30,可考虑分批加仓",
|
"content": "2. **紫金矿业(601899)** 进入加仓区间29-30,可考虑分批加仓",
|
||||||
|
|||||||
+4
-97
@@ -1,100 +1,7 @@
|
|||||||
{
|
{
|
||||||
"code": "603259",
|
"code": "603259",
|
||||||
"history": [
|
"name": "药明康德",
|
||||||
{
|
"status": "watchlist",
|
||||||
"time": "2026-06-11T08:55:22.591626",
|
"converted_at": "2026-06-25 13:21",
|
||||||
"content": "• 药明康德(603259) 97.04 → 持有,略高于买入区93.5~97.0上沿。止损90/止盈105。200股浮盈+0%。",
|
"note": "清仓转自选,价格参考: 药明康德@117.52 德明利@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"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
@@ -21,6 +21,11 @@
|
|||||||
"content": "自选靠近买入区:华恒生物(688639) @21.2 量价齐升信号,买入区20.78~21.4 RR 2.28;信义光能(00968) @2.41 接近支撑位关注,买入区2.36~2.46 RR 3.",
|
"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"
|
"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",
|
"time": "2026-06-01T14:55:20.378304",
|
||||||
"content": "• 华恒生物(688639) 23.58 | +0.47% → 🤝持有,接近止损23.18",
|
"content": "• 华恒生物(688639) 23.58 | +0.47% → 🤝持有,接近止损23.18",
|
||||||
|
|||||||
@@ -31,6 +31,11 @@
|
|||||||
"content": "- **中芯国际A(688981)** ¥125.58 | 半导体板块+3.97%净流入269亿是当前最强主线,继续持有,加仓等回调至122~124",
|
"content": "- **中芯国际A(688981)** ¥125.58 | 半导体板块+3.97%净流入269亿是当前最强主线,继续持有,加仓等回调至122~124",
|
||||||
"report_id": "cron_99c06255590a_2026-06-18_08-38-18"
|
"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",
|
"time": "2026-06-01T11:55:35.956320",
|
||||||
"content": "• **688981|中芯国际|134.87|-3.60%|建议观望等企稳【短线】|前几日大涨后获利回吐,关注134支撑**",
|
"content": "• **688981|中芯国际|134.87|-3.60%|建议观望等企稳【短线】|前几日大涨后获利回吐,关注134支撑**",
|
||||||
|
|||||||
+114
-162
@@ -1,293 +1,245 @@
|
|||||||
{
|
{
|
||||||
"checked_at": "2026-06-24T09:00:31",
|
"checked_at": "2026-06-25T11:35:00",
|
||||||
"total_active": 51,
|
"total_active": 52,
|
||||||
"flagged_count": 18,
|
"flagged_count": 15,
|
||||||
"flagged": [
|
"flagged": [
|
||||||
{
|
{
|
||||||
"code": "000657",
|
"code": "000657",
|
||||||
"name": "中钨高新",
|
"name": "\u4e2d\u94a8\u9ad8\u65b0",
|
||||||
"price": 106.0,
|
"price": 100.08,
|
||||||
"flags": [
|
"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,
|
"age_days": 0,
|
||||||
"last_update": "2026-06-23 12:00",
|
"last_update": "2026-06-24 16:44",
|
||||||
"entry_zone": "104~108",
|
"entry_zone": "98~102",
|
||||||
"current": "盈利持有 | 目标119.16 | 止损102.39 | 买入区103.88~108.12",
|
"current": "\u76c8\u5229\u6301\u6709 | \u76ee\u6807112.75 | \u6b62\u635f95.93 | \u4e70\u5165\u533a98.08~102.08",
|
||||||
"updated_by": "auto",
|
"updated_by": "auto",
|
||||||
"updated_reason": "自动生成",
|
"updated_reason": "\u81ea\u52a8\u751f\u6210",
|
||||||
"is_watchlist": true
|
"is_watchlist": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"code": "000711",
|
"code": "000711",
|
||||||
"name": "ST京蓝",
|
"name": "ST\u4eac\u84dd",
|
||||||
"price": 5.22,
|
"price": 5.04,
|
||||||
"flags": [
|
"flags": [
|
||||||
"[STRATEGY_STALE] 信号不良(timing_signal含['等企稳'])",
|
"\u73b0\u4ef75.04\u5728\u4e70\u5165\u533a5~5\uff08\u662f\u5426\u53ef\u4e70\u9700\u7ed3\u5408timing_signal\u5224\u65ad\uff09"
|
||||||
"现价5.22在买入区5~5(是否可买需结合timing_signal判断)"
|
|
||||||
],
|
],
|
||||||
"age_days": 0,
|
"age_days": 0,
|
||||||
"last_update": "2026-06-23 12:01",
|
"last_update": "2026-06-24 16:44",
|
||||||
"entry_zone": "5~5",
|
"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_by": "auto",
|
||||||
"updated_reason": "自动生成",
|
"updated_reason": "\u81ea\u52a8\u751f\u6210",
|
||||||
"is_watchlist": true
|
"is_watchlist": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"code": "002594",
|
"code": "002594",
|
||||||
"name": "比亚迪",
|
"name": "\u6bd4\u4e9a\u8fea",
|
||||||
"price": 85.94,
|
"price": 83.3,
|
||||||
"flags": [
|
"flags": [
|
||||||
"[STRATEGY_STALE] 信号不良(timing_signal含['等企稳'])",
|
"\u73b0\u4ef783.30\u5728\u4e70\u5165\u533a82~85\uff08\u662f\u5426\u53ef\u4e70\u9700\u7ed3\u5408timing_signal\u5224\u65ad\uff09"
|
||||||
"现价85.94在买入区84~88(是否可买需结合timing_signal判断)"
|
|
||||||
],
|
],
|
||||||
"age_days": 0,
|
"age_days": 0,
|
||||||
"last_update": "2026-06-23 12:01",
|
"last_update": "2026-06-24 16:44",
|
||||||
"entry_zone": "84~88",
|
"entry_zone": "82~85",
|
||||||
"current": "盈利持有 | 目标94.0 | 止损83.36 | 买入区84.22~87.62 | 信号:放量下跌,等企稳再入",
|
"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_by": "auto",
|
||||||
"updated_reason": "自动生成",
|
"updated_reason": "\u81ea\u52a8\u751f\u6210",
|
||||||
"is_watchlist": true
|
"is_watchlist": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"code": "00968",
|
"code": "00968",
|
||||||
"name": "信义光能",
|
"name": "\u4fe1\u4e49\u5149\u80fd",
|
||||||
"price": 2.11,
|
"price": 2.0,
|
||||||
"flags": [
|
"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,
|
"age_days": 0,
|
||||||
"last_update": "2026-06-23 12:01",
|
"last_update": "2026-06-24 16:44",
|
||||||
"entry_zone": "2~2",
|
"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_by": "auto",
|
||||||
"updated_reason": "自动生成",
|
"updated_reason": "\u81ea\u52a8\u751f\u6210",
|
||||||
"is_watchlist": true
|
"is_watchlist": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"code": "01070",
|
"code": "01070",
|
||||||
"name": "TCL电子",
|
"name": "TCL\u7535\u5b50",
|
||||||
"price": 13.1,
|
"price": 13.1,
|
||||||
"flags": [
|
"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,
|
"age_days": 0,
|
||||||
"last_update": "2026-06-23 12:01",
|
"last_update": "2026-06-24 16:44",
|
||||||
"entry_zone": "13~13",
|
"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_by": "auto",
|
||||||
"updated_reason": "自动生成",
|
"updated_reason": "\u81ea\u52a8\u751f\u6210",
|
||||||
"is_watchlist": true
|
"is_watchlist": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"code": "02359",
|
"code": "02359",
|
||||||
"name": "药明康德",
|
"name": "\u836f\u660e\u5eb7\u5fb7",
|
||||||
"price": 131.8,
|
"price": 141.7,
|
||||||
"flags": [
|
"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,
|
"age_days": 0,
|
||||||
"last_update": "2026-06-23 12:01",
|
"last_update": "2026-06-24 16:45",
|
||||||
"entry_zone": "129~134",
|
"entry_zone": "139~144",
|
||||||
"current": "盈利持有 | 目标147.67 | 止损127.85 | 买入区129.16~134.44 | 信号:接近支撑位,关注",
|
"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_by": "auto",
|
||||||
"updated_reason": "自动生成",
|
"updated_reason": "\u81ea\u52a8\u751f\u6210",
|
||||||
"is_watchlist": true
|
"is_watchlist": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"code": "02628",
|
"code": "02628",
|
||||||
"name": "中国人寿",
|
"name": "\u4e2d\u56fd\u4eba\u5bff",
|
||||||
"price": 29.5,
|
"price": 28.32,
|
||||||
"flags": [
|
"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,
|
"age_days": 0,
|
||||||
"last_update": "2026-06-23 12:01",
|
"last_update": "2026-06-24 16:45",
|
||||||
"entry_zone": "29~30",
|
"entry_zone": "28~29",
|
||||||
"current": "盈利持有 | 目标33.9 | 止损28.61 | 买入区28.91~30.09 | 信号:接近支撑位,关注",
|
"current": "\u76c8\u5229\u6301\u6709 | \u76ee\u680732.72 | \u6b62\u635f25.58 | \u4e70\u5165\u533a27.75~28.89",
|
||||||
"updated_by": "auto",
|
"updated_by": "auto",
|
||||||
"updated_reason": "自动生成",
|
"updated_reason": "\u81ea\u52a8\u751f\u6210",
|
||||||
"is_watchlist": true
|
"is_watchlist": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"code": "06160",
|
"code": "06160",
|
||||||
"name": "百济神州",
|
"name": "\u767e\u6d4e\u795e\u5dde",
|
||||||
"price": 163.5,
|
"price": 165.2,
|
||||||
"flags": [
|
"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,
|
"age_days": 0,
|
||||||
"last_update": "2026-06-23 12:01",
|
"last_update": "2026-06-24 16:45",
|
||||||
"entry_zone": "160~167",
|
"entry_zone": "162~168",
|
||||||
"current": "盈利持有 | 目标178.73 | 止损158.59 | 买入区160.23~166.65 | 信号:接近支撑位,关注",
|
"current": "\u76c8\u5229\u6301\u6709 | \u76ee\u6807180.64 | \u6b62\u635f149.22 | \u4e70\u5165\u533a161.9~168.4",
|
||||||
"updated_by": "auto",
|
"updated_by": "auto",
|
||||||
"updated_reason": "自动生成",
|
"updated_reason": "\u81ea\u52a8\u751f\u6210",
|
||||||
"is_watchlist": true
|
"is_watchlist": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"code": "06869",
|
"code": "09988",
|
||||||
"name": "长飞光纤",
|
"name": "\u963f\u91cc\u5df4\u5df4-W",
|
||||||
"price": 267.6,
|
"price": 99.4,
|
||||||
"flags": [
|
"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,
|
"age_days": 0,
|
||||||
"last_update": "2026-06-23 12:01",
|
"last_update": "2026-06-24 16:45",
|
||||||
"entry_zone": "262~273",
|
"entry_zone": "97~101",
|
||||||
"current": "盈利持有 | 目标367.2 | 止损251.8 | 买入区262.25~272.95",
|
"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_by": "auto",
|
||||||
"updated_reason": "自动生成",
|
"updated_reason": "\u81ea\u52a8\u751f\u6210",
|
||||||
"is_watchlist": true
|
"is_watchlist": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"code": "300124",
|
"code": "300124",
|
||||||
"name": "汇川技术",
|
"name": "\u6c47\u5ddd\u6280\u672f",
|
||||||
"price": 67.81,
|
"price": 66.31,
|
||||||
"flags": [
|
"flags": [
|
||||||
"[STRATEGY_STALE] 信号不良(timing_signal含['等企稳'])",
|
"\u73b0\u4ef766.31\u5728\u4e70\u5165\u533a65~68\uff08\u662f\u5426\u53ef\u4e70\u9700\u7ed3\u5408timing_signal\u5224\u65ad\uff09"
|
||||||
"现价67.81在买入区66~69(是否可买需结合timing_signal判断)"
|
|
||||||
],
|
],
|
||||||
"age_days": 0,
|
"age_days": 0,
|
||||||
"last_update": "2026-06-23 12:01",
|
"last_update": "2026-06-24 16:45",
|
||||||
"entry_zone": "66~69",
|
"entry_zone": "65~68",
|
||||||
"current": "盈利持有 | 目标73.65 | 止损65.78 | 买入区66.45~68.93 | 信号:放量下跌,等企稳再入",
|
"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_by": "auto",
|
||||||
"updated_reason": "自动生成",
|
"updated_reason": "\u81ea\u52a8\u751f\u6210",
|
||||||
"is_watchlist": true
|
"is_watchlist": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"code": "300308",
|
"code": "300308",
|
||||||
"name": "中际旭创",
|
"name": "\u4e2d\u9645\u65ed\u521b",
|
||||||
"price": 1327.13,
|
"price": 1312.18,
|
||||||
"flags": [
|
"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,
|
"age_days": 0,
|
||||||
"last_update": "2026-06-23 12:01",
|
"last_update": "2026-06-24 16:45",
|
||||||
"entry_zone": "1301~1354",
|
"entry_zone": "1286~1338",
|
||||||
"current": "盈利持有 | 目标1453.2 | 止损1287.32 | 买入区1300.59~1353.67",
|
"current": "\u76c8\u5229\u6301\u6709 | \u76ee\u68071447.8 | \u6b62\u635f1272.81 | \u4e70\u5165\u533a1285.94~1338.42",
|
||||||
"updated_by": "auto",
|
"updated_by": "auto",
|
||||||
"updated_reason": "自动生成",
|
"updated_reason": "\u81ea\u52a8\u751f\u6210",
|
||||||
"is_watchlist": true
|
"is_watchlist": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"code": "600519",
|
"code": "600519",
|
||||||
"name": "贵州茅台",
|
"name": "\u8d35\u5dde\u8305\u53f0",
|
||||||
"price": 1228.61,
|
"price": 1207.68,
|
||||||
"flags": [
|
"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,
|
"age_days": 0,
|
||||||
"last_update": "2026-06-23 12:01",
|
"last_update": "2026-06-24 16:45",
|
||||||
"entry_zone": "1204~1235",
|
"entry_zone": "1184~1231",
|
||||||
"current": "盈利持有 | ⚠️盈亏比偏低(1:2.0),谨慎买入 | 目标1300.67 | 止损1191.75 | 买入区1204.04~1235.32 | 信号:接近支撑位,关注",
|
"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_by": "auto",
|
||||||
"updated_reason": "自动生成",
|
"updated_reason": "\u81ea\u52a8\u751f\u6210",
|
||||||
"is_watchlist": true
|
"is_watchlist": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"code": "601318",
|
"code": "601318",
|
||||||
"name": "中国平安",
|
"name": "\u4e2d\u56fd\u5e73\u5b89",
|
||||||
"price": 51.02,
|
"price": 49.12,
|
||||||
"flags": [
|
"flags": [
|
||||||
"[STRATEGY_STALE] 信号不良(timing_signal含['等企稳'])",
|
"\u73b0\u4ef749.12\u5728\u4e70\u5165\u533a48~50\uff08\u662f\u5426\u53ef\u4e70\u9700\u7ed3\u5408timing_signal\u5224\u65ad\uff09"
|
||||||
"现价51.02在买入区50~52(是否可买需结合timing_signal判断)"
|
|
||||||
],
|
],
|
||||||
"age_days": 0,
|
"age_days": 0,
|
||||||
"last_update": "2026-06-23 12:01",
|
"last_update": "2026-06-24 16:45",
|
||||||
"entry_zone": "50~52",
|
"entry_zone": "48~50",
|
||||||
"current": "盈利持有 | 止损参考49.42 | 买入区49.93~51.97 | 信号:放量下跌,等企稳再入",
|
"current": "\u76c8\u5229\u6301\u6709 | \u76ee\u680753.61 | \u6b62\u635f47.65 | \u4e70\u5165\u533a48.14~50.03 | \u4fe1\u53f7:\u89c2\u671b",
|
||||||
"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",
|
|
||||||
"updated_by": "auto",
|
"updated_by": "auto",
|
||||||
"updated_reason": "自动生成",
|
"updated_reason": "\u81ea\u52a8\u751f\u6210",
|
||||||
"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": "自动生成",
|
|
||||||
"is_watchlist": true
|
"is_watchlist": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"code": "688795",
|
"code": "688795",
|
||||||
"name": "摩尔线程-U",
|
"name": "\u6469\u5c14\u7ebf\u7a0b-U",
|
||||||
"price": 718.68,
|
"price": 704.8,
|
||||||
"flags": [
|
"flags": [
|
||||||
"[STRATEGY_STALE] 信号不良(timing_signal含['等企稳'])",
|
"\u73b0\u4ef7704.80\u5728\u4e70\u5165\u533a691~719\uff08\u662f\u5426\u53ef\u4e70\u9700\u7ed3\u5408timing_signal\u5224\u65ad\uff09"
|
||||||
"现价718.68在买入区704~724(是否可买需结合timing_signal判断)"
|
|
||||||
],
|
],
|
||||||
"age_days": 0,
|
"age_days": 0,
|
||||||
"last_update": "2026-06-23 12:01",
|
"last_update": "2026-06-24 16:45",
|
||||||
"entry_zone": "704~724",
|
"entry_zone": "691~719",
|
||||||
"current": "盈利持有 | ⚠️盈亏比偏低(1:1.8),谨慎买入 | 目标804.6 | 止损683.91 | 买入区704.31~724.14 | 信号:放量下跌,等企稳再入",
|
"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_by": "auto",
|
||||||
"updated_reason": "自动生成",
|
"updated_reason": "\u81ea\u52a8\u751f\u6210",
|
||||||
"is_watchlist": true
|
"is_watchlist": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"code": "688802",
|
"code": "688802",
|
||||||
"name": "沐曦股份-U",
|
"name": "\u6c90\u66e6\u80a1\u4efd-U",
|
||||||
"price": 786.0,
|
"price": 770.19,
|
||||||
"flags": [
|
"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,
|
"age_days": 0,
|
||||||
"last_update": "2026-06-23 12:01",
|
"last_update": "2026-06-24 16:45",
|
||||||
"entry_zone": "770~802",
|
"entry_zone": "755~786",
|
||||||
"current": "盈利持有 | 目标899.0 | 止损756.85 | 买入区770.28~801.72",
|
"current": "\u76c8\u5229\u6301\u6709 | \u76ee\u6807882.43 | \u6b62\u635f747.08 | \u4e70\u5165\u533a754.79~785.59",
|
||||||
"updated_by": "auto",
|
"updated_by": "auto",
|
||||||
"updated_reason": "自动生成",
|
"updated_reason": "\u81ea\u52a8\u751f\u6210",
|
||||||
"is_watchlist": true
|
"is_watchlist": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"portfolio": {
|
"portfolio": {
|
||||||
"position_pct": 91.95,
|
"total_assets": 1212445.58,
|
||||||
"cash": 80476,
|
"cash": 150624.58,
|
||||||
"weak_position_pct": 36.4,
|
"position_pct": 87.6,
|
||||||
"all_weak_pct": 39.2,
|
"weak_position_pct": 47.8,
|
||||||
|
"all_weak_pct": 47.8,
|
||||||
"signals": [
|
"signals": [
|
||||||
"[PORTFOLIO_WEAK_MILD] 组合弱势占比36.4%,需关注",
|
"[PORTFOLIO_WEAK] \u7ec4\u5408\u5f31\u52bf\u5360\u6bd448%>40%\uff0c\u5efa\u8bae\u7cfb\u7edf\u6027\u51cf\u4ed3",
|
||||||
"[PORTFOLIO_FULL] 总仓位91.95%(现金80476元),买入建议受限"
|
"[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
@@ -1,145 +1,85 @@
|
|||||||
{
|
{
|
||||||
"timestamp": "2026-06-24 16:00",
|
"timestamp": "2026-06-25 16:00",
|
||||||
"source": "小果新闻情感分析(降级:API不可达,自行分析)",
|
|
||||||
"market_context": "大盘48.9%板块上涨,市场情绪中性。化学制药(+3.68%)、生物制品(+2.96%)领涨;贵金属(-8.6%)、小金属(-5.58%)、工业金属(-5.53%)领跌。持仓多只个股大涨(法拉电子+10%、药明康德+8.6%、中芯国际H+9.6%),但部分深套股继续承压。",
|
|
||||||
"analyses": [
|
"analyses": [
|
||||||
{
|
{
|
||||||
"name": "德明利",
|
"name": "法拉电子",
|
||||||
"code": "001309",
|
"code": "600563",
|
||||||
"sentiment": "positive",
|
"sentiment": "positive",
|
||||||
"confidence": 0.90,
|
"confidence": 0.82,
|
||||||
"brief": "股价首度突破800元创历史新高,年内涨幅超250%,走势强劲但距止盈仅0.1%需警惕回调风险",
|
"brief": "元器件板块大涨3.14%,法拉电子领涨6.31%",
|
||||||
"keywords": ["突破800元", "历史新高", "年内涨超250%", "存储芯片"],
|
"keywords": ["元器件", "板块领涨", "电容器"]
|
||||||
"news_headlines": [
|
|
||||||
"德明利股价首度突破800元 年内累计最大涨幅超250%(2026-06-24)",
|
|
||||||
"德明利盘中创历史新高(2026-06-23)",
|
|
||||||
"德明利深圳福田拿地!打造研发总部基地(2026-06-23)"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "中国神华",
|
"name": "中芯国际",
|
||||||
"code": "01088",
|
"code": "688981",
|
||||||
"sentiment": "positive",
|
"sentiment": "positive",
|
||||||
"confidence": 0.80,
|
"confidence": 0.75,
|
||||||
"brief": "5月煤炭销量5050万吨同比+11.7%,销量增长向好但产量同比下降4.1%,煤价承压行业偏弱",
|
"brief": "半导体板块涨2.21%,中芯国际涨3.52%跟随",
|
||||||
"keywords": ["煤炭销量", "同比增长", "外购煤放量", "产量下降"],
|
"keywords": ["半导体", "中芯国际", "科创板"]
|
||||||
"news_headlines": [
|
},
|
||||||
"中国神华:5月煤炭销售量5050万吨 同比增长11.7%(2026-06-17)",
|
{
|
||||||
"中国神华:5月商品煤产量同比下降4.1%(2026-06-17)"
|
"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": "建滔积层板",
|
"name": "建滔积层板",
|
||||||
"code": "01888",
|
"code": "01888",
|
||||||
"sentiment": "positive",
|
"sentiment": "positive",
|
||||||
"confidence": 0.85,
|
"confidence": 0.88,
|
||||||
"brief": "获南向资金连续11天净买入,年内第五次涨价累计超40%,量价齐升趋势明确",
|
"brief": "元件板块强势,建滔积层板大涨11.38%",
|
||||||
"keywords": ["南向资金", "连续净买入", "第五次涨价", "累计涨价超40%"],
|
"keywords": ["覆铜板", "元件", "大涨"]
|
||||||
"news_headlines": [
|
|
||||||
"建滔积层板获南向资金连续11天净买入(2026-06-23)",
|
|
||||||
"建滔积层板完成第五次涨价,年内累计涨价超40%(2026-06-22)"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "法拉电子",
|
"name": "长飞光纤光缆",
|
||||||
"code": "600563",
|
"code": "06869",
|
||||||
"sentiment": "positive",
|
"sentiment": "positive",
|
||||||
"confidence": 0.85,
|
"confidence": 0.85,
|
||||||
"brief": "今日涨停+10%,新能源+高铁双轮驱动需求旺盛,满产状态订单充足",
|
"brief": "光纤光缆需求旺盛,长飞大涨10.11%",
|
||||||
"keywords": ["涨停", "新能源", "满产", "订单充足"],
|
"keywords": ["光纤光缆", "通信", "大涨"]
|
||||||
"news_headlines": [
|
|
||||||
"法拉电子今日涨停10%(2026-06-24)",
|
|
||||||
"法拉电子:三季度订单充足 生产处于满产状态(2026-06-04)",
|
|
||||||
"法拉电子:产品已广泛应用于高铁、动车领域(2026-05-27)"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "药明康德",
|
"name": "丘钛科技",
|
||||||
"code": "603259",
|
"code": "01478",
|
||||||
"sentiment": "positive",
|
"sentiment": "negative",
|
||||||
|
"confidence": 0.80,
|
||||||
|
"brief": "光学光电子板块弱势,丘钛科技大跌6.37%",
|
||||||
|
"keywords": ["手机产业链", "光学", "大跌"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "紫金矿业",
|
||||||
|
"code": "601899",
|
||||||
|
"sentiment": "negative",
|
||||||
"confidence": 0.85,
|
"confidence": 0.85,
|
||||||
"brief": "CRO概念逆势走强,药明康德涨停,医药板块整体回暖情绪积极",
|
"brief": "贵金属板块领跌4.2%,紫金矿业大跌6.26%",
|
||||||
"keywords": ["CRO概念", "涨停", "医药板块", "逆势走强"],
|
"keywords": ["黄金", "紫金矿业", "贵金属"]
|
||||||
"news_headlines": [
|
|
||||||
"CRO概念股活跃 药明康德涨停(2026-06-24)",
|
|
||||||
"CRO概念逆势走强 药明康德封涨停(2026-06-24)"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "华恒生物",
|
"name": "中科电气",
|
||||||
"code": "688639",
|
"code": "300035",
|
||||||
"sentiment": "positive",
|
"sentiment": "negative",
|
||||||
"confidence": 0.75,
|
"confidence": 0.75,
|
||||||
"brief": "通过港交所聆讯即将港股上市,国际化战略推进,但距止盈仅3.5%接近目标",
|
"brief": "小金属板块微跌,中科电气大跌5.91%",
|
||||||
"keywords": ["港股IPO", "通过聆讯", "国际化", "生物制造"],
|
"keywords": ["石墨电极", "小金属", "大跌"]
|
||||||
"news_headlines": [
|
|
||||||
"华恒生物通过港交所聆讯 华泰国际为独家保荐人(2026-06-23)",
|
|
||||||
"华恒生物:第五届董事会第五次会议决议公告(2026-06-22)"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "模塑科技",
|
"name": "模塑科技",
|
||||||
"code": "000700",
|
"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",
|
"sentiment": "negative",
|
||||||
"confidence": 0.85,
|
"confidence": 0.78,
|
||||||
"brief": "今日再跌3.33%,房地产板块持续承压,2025年净亏损885.56亿元基本面疲弱",
|
"brief": "跌破止损位13.91,汽车零部件板块走弱",
|
||||||
"keywords": ["房地产", "下跌", "净亏损", "基本面承压"],
|
"keywords": ["止损", "汽车零部件", "下跌"]
|
||||||
"news_headlines": [
|
|
||||||
"万科企业:2025年净亏损885.56亿元(2026-04-15)",
|
|
||||||
"港股内房股集体上涨 万科企业涨超12%(2026-05-04)"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
]
|
||||||
"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只偏空(万科基本面疲弱)。今日持仓多只大涨,但德明利和中国神华已接近止盈位,需注意执行。"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 规则
|
||||||
|
- 回测验证:用历史数据验证新规则
|
||||||
|
- 知识库文章萃取:从量化分析文章中提取可用因子
|
||||||
|
- 持续迭代:每周跑一次复盘,持续优化
|
||||||
+55
-51
@@ -151,7 +151,17 @@ def refresh_data_prices():
|
|||||||
updated += 1
|
updated += 1
|
||||||
changed = True
|
changed = True
|
||||||
if changed:
|
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)
|
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(只在价格变化时写入)
|
# 更新watchlist(只在价格变化时写入)
|
||||||
changed = False
|
changed = False
|
||||||
@@ -282,36 +292,32 @@ def record_event(code, name, event_type, price, trigger_value, event_label=""):
|
|||||||
pass # SQLite 写入失败不影响主流程
|
pass # SQLite 写入失败不影响主流程
|
||||||
|
|
||||||
|
|
||||||
def get_trigger_zones(trigger):
|
def get_trigger_zones(d):
|
||||||
"""返回该trigger所有可监控的区间列表,跳过已执行的batch"""
|
"""返回该decision所有可监控的区间列表,从顶层字段读取"""
|
||||||
zones = []
|
zones = []
|
||||||
for key, label in [
|
is_holding = d.get('shares', 0) > 0
|
||||||
("entry_zone", "加仓区间"),
|
# 买入区间(自选和持仓都监控)
|
||||||
("batch1_price", "试仓区间"),
|
el = d.get("entry_low", 0)
|
||||||
("batch2_price", "加仓区间"),
|
eh = d.get("entry_high", 0)
|
||||||
("take_profit_zone", "止盈区间"),
|
if el and eh and float(el) > 0 and float(eh) > 0:
|
||||||
("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:
|
|
||||||
try:
|
try:
|
||||||
sl_price = float(sl) if isinstance(sl, (int, float)) else float(sl)
|
zones.append(("entry_zone", "买入区间", float(el), float(eh)))
|
||||||
zones.append(("stop_loss", "止损", 0, sl_price))
|
|
||||||
except:
|
except:
|
||||||
pass
|
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
|
return zones
|
||||||
|
|
||||||
|
|
||||||
@@ -344,7 +350,7 @@ def run_once(round_label=""):
|
|||||||
print(f"❌{label} 无法读取decisions.json", file=sys.stderr)
|
print(f"❌{label} 无法读取decisions.json", file=sys.stderr)
|
||||||
return
|
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()
|
state = load_state()
|
||||||
outputs = []
|
outputs = []
|
||||||
state_updated = False
|
state_updated = False
|
||||||
@@ -352,8 +358,7 @@ def run_once(round_label=""):
|
|||||||
# 收集所有需要检查的代码
|
# 收集所有需要检查的代码
|
||||||
check_codes = set()
|
check_codes = set()
|
||||||
for d in active:
|
for d in active:
|
||||||
trig = d.get("trigger", {})
|
if get_trigger_zones(d):
|
||||||
if trig:
|
|
||||||
check_codes.add(d["code"])
|
check_codes.add(d["code"])
|
||||||
|
|
||||||
# 批量拉取这些股票的价格
|
# 批量拉取这些股票的价格
|
||||||
@@ -361,18 +366,15 @@ def run_once(round_label=""):
|
|||||||
|
|
||||||
for d in active:
|
for d in active:
|
||||||
code = d["code"]
|
code = d["code"]
|
||||||
trig = d.get("trigger", {})
|
|
||||||
if not trig:
|
|
||||||
continue
|
|
||||||
|
|
||||||
zones = get_trigger_zones(trig)
|
zones = get_trigger_zones(d)
|
||||||
if not zones:
|
if not zones:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
price_info = prices.get(code)
|
price_info = prices.get(code)
|
||||||
if not price_info:
|
if not price_info:
|
||||||
continue
|
continue
|
||||||
price, _ = price_info
|
price, _, _ = price_info
|
||||||
if price == 0:
|
if price == 0:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@@ -392,12 +394,12 @@ def run_once(round_label=""):
|
|||||||
else:
|
else:
|
||||||
extra = ""
|
extra = ""
|
||||||
if "_price" in key:
|
if "_price" in key:
|
||||||
batch_shares = trig.get(key.replace("_price", "_shares"), "")
|
batch_shares = d.get(key.replace("_price", "_shares"), "")
|
||||||
action = trig.get(key.replace("_price", "_action"), "")
|
action = d.get(key.replace("_price", "_action"), "")
|
||||||
if batch_shares:
|
if batch_shares:
|
||||||
extra = f" {action}{batch_shares}股" if action else f" {batch_shares}股"
|
extra = f" {action}{batch_shares}股" if action else f" {batch_shares}股"
|
||||||
elif key in ("take_profit_zone",):
|
elif key in ("take_profit_zone",):
|
||||||
act = trig.get("take_profit_action", "")
|
act = d.get("take_profit_action", "")
|
||||||
if act:
|
if act:
|
||||||
extra = f"({act})"
|
extra = f"({act})"
|
||||||
branch_sfx = _branch_alert_suffix(code, price, d.get('shares',0), d.get('cost',0))
|
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)
|
price_info = prices.get(code)
|
||||||
if not price_info:
|
if not price_info:
|
||||||
continue
|
continue
|
||||||
price, _ = price_info
|
price, _, _ = price_info
|
||||||
if price == 0:
|
if price == 0:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@@ -510,19 +512,21 @@ def run_once(round_label=""):
|
|||||||
# 简短一行一个触发
|
# 简短一行一个触发
|
||||||
for o in outputs:
|
for o in outputs:
|
||||||
print(o)
|
print(o)
|
||||||
# 直接推到老爸私信(免等待 cron_to_xmpp)
|
# 推送XMPP(只推关键事件:止损跌破+情景切换,不推买入区进出/重评等操作细节)
|
||||||
try:
|
critical = [o for o in outputs if o.startswith(("⚠️", "🌀"))]
|
||||||
body = "\n".join([f"{now_str}"] + outputs)
|
if critical:
|
||||||
payload = json.dumps({
|
try:
|
||||||
"to": "hmo@yoin.fun", "body": body, "type": "chat",
|
body = "\n".join([f"{now_str}"] + critical)
|
||||||
}).encode("utf-8")
|
payload = json.dumps({
|
||||||
req = urllib.request.Request(
|
"to": "hmo@yoin.fun", "body": body, "type": "chat",
|
||||||
"http://127.0.0.1:5805/", data=payload,
|
}).encode("utf-8")
|
||||||
headers={"Content-Type": "application/json"},
|
req = urllib.request.Request(
|
||||||
)
|
"http://127.0.0.1:5805/", data=payload,
|
||||||
urllib.request.urlopen(req, timeout=5)
|
headers={"Content-Type": "application/json"},
|
||||||
except Exception:
|
)
|
||||||
pass
|
urllib.request.urlopen(req, timeout=5)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
# else: SILENT — 无触发,无输出,不推
|
# else: SILENT — 无触发,无输出,不推
|
||||||
|
|
||||||
if state_updated:
|
if state_updated:
|
||||||
|
|||||||
@@ -56,6 +56,9 @@ def main():
|
|||||||
code = clean_cell(r[0])
|
code = clean_cell(r[0])
|
||||||
name = r[1].strip()
|
name = r[1].strip()
|
||||||
shares = int(clean_cell(r[2]))
|
shares = int(clean_cell(r[2]))
|
||||||
|
# 跳过0股(已清仓的残留条目)
|
||||||
|
if shares <= 0:
|
||||||
|
continue
|
||||||
price_raw = r[4].strip()
|
price_raw = r[4].strip()
|
||||||
currency = 'HKD' if '港币' in price_raw or '港' in r[10] else 'CNY'
|
currency = 'HKD' if '港币' in price_raw or '港' in r[10] else 'CNY'
|
||||||
price_str = price_raw.replace('港币', '').replace('港元', '').replace('港', '').strip()
|
price_str = price_raw.replace('港币', '').replace('港元', '').replace('港', '').strip()
|
||||||
|
|||||||
@@ -183,14 +183,14 @@ def trigger_regen_sync(stock_codes=None):
|
|||||||
|
|
||||||
|
|
||||||
def load_cash():
|
def load_cash():
|
||||||
"""从 portfolio.json 实时读现金,不硬编码"""
|
"""从 portfolio.json 实时读可用现金(不含冻结部分),不硬编码"""
|
||||||
try:
|
try:
|
||||||
with open(PORTFOLIO_PATH) as f:
|
with open(PORTFOLIO_PATH) as f:
|
||||||
data = json.load(f)
|
data = json.load(f)
|
||||||
if isinstance(data, dict):
|
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):
|
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
|
return 0
|
||||||
except Exception:
|
except Exception:
|
||||||
return 0
|
return 0
|
||||||
@@ -437,7 +437,7 @@ def main():
|
|||||||
try:
|
try:
|
||||||
with open("/home/hmo/web-dashboard/data/portfolio.json") as f:
|
with open("/home/hmo/web-dashboard/data/portfolio.json") as f:
|
||||||
pf = json.load(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 的总资产(导入时已做港币→人民币换算)
|
# 直接取 portfolio.json 的总资产(导入时已做港币→人民币换算)
|
||||||
total_assets = pf.get("total_assets", 0) or 0
|
total_assets = pf.get("total_assets", 0) or 0
|
||||||
if total_assets <= 0:
|
if total_assets <= 0:
|
||||||
|
|||||||
@@ -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
@@ -1657,6 +1657,7 @@ def regenerate_all(stdout=True):
|
|||||||
"position_advice": result.get("position_advice", "中等仓位"),
|
"position_advice": result.get("position_advice", "中等仓位"),
|
||||||
"time_horizon": result.get("time_horizon", "2周~3月"),
|
"time_horizon": result.get("time_horizon", "2周~3月"),
|
||||||
}
|
}
|
||||||
|
new_entry["trigger"] = trig
|
||||||
# created_at: 首次创建时设置,后续 preserve
|
# created_at: 首次创建时设置,后续 preserve
|
||||||
old_entry = existing_decisions.get(code, {})
|
old_entry = existing_decisions.get(code, {})
|
||||||
if old_entry.get("created_at"):
|
if old_entry.get("created_at"):
|
||||||
@@ -1786,7 +1787,19 @@ def regenerate_all(stdout=True):
|
|||||||
existing_pf = json.load(open(PORTFOLIO_PATH))
|
existing_pf = json.load(open(PORTFOLIO_PATH))
|
||||||
except Exception:
|
except Exception:
|
||||||
existing_pf = {}
|
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')
|
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(existing_pf, open(PORTFOLIO_PATH, "w"), ensure_ascii=False, indent=2)
|
||||||
json.dump(wl, open(WATCHLIST_PATH, "w"), ensure_ascii=False, indent=2)
|
json.dump(wl, open(WATCHLIST_PATH, "w"), ensure_ascii=False, indent=2)
|
||||||
|
|||||||
+1
-1
@@ -71,7 +71,7 @@ def audit_stocks(conn):
|
|||||||
def audit_strategies(conn):
|
def audit_strategies(conn):
|
||||||
try:
|
try:
|
||||||
dec = json.loads((WEB_DATA / "decisions.json").read_text())
|
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
|
stale_count = 0
|
||||||
no_stop = 0
|
no_stop = 0
|
||||||
for d in active:
|
for d in active:
|
||||||
|
|||||||
Reference in New Issue
Block a user