Prism 股票监控与模拟交易系统

原名”小米模拟交易系统”,自 2026-04-17 起扩展为多标的(multi-ticker)股票监控 + 模拟/实盘双账本系统。

当前 Tasks

🔥 进行中

  • 实时新闻接入(事件驱动决策):方案 B — 直接爬财联社官网 https://www.cls.cn/telegraph HTML 首屏 ~20 条 SSR;配套 SQLite 表 + 5min 轮询脚本 + 决策时按持仓+宏观关键词注入 context;派 Claude Code 去 163.228.243.161 服务器搭。注意:stock-v4 本地目录只有 spec/log,决策代码实际在服务器或 stock-dashboard,待 fries 定位代码位置后才能动手 — (eagle hermes 已派出,2026-05-14)

⏸ 等决策/卡点

  • 校正 600036.SH placeholder 成本(1000 股 @ ¥40)— (长期挂账)

概述

基于 Prism Agent 的自动股票监控与模拟交易系统。AI 定时扫描标的行情,推送做 T/做 V 机会到 Discord + 微信,并向 dashboard 写入告警;支持纸上交易(SIM ledger)与用户手动记录的实盘(REAL ledger)双账本对照。所有自动交易决策由 Prism Agent 完成。

交易策略(仅小米)

分析框架 — wall-street-analyst skill(2026-04-16 升级 10 轮)

推送前的行情分析走 ~/.hermes/skills/research/wall-street-analyst,该 skill 2026-04-16 完成一次大版本升级:

  • 多市场支持:HK(XXXX.HK)/ A 股(XXXX.SS/.SZ)/ 美股,货币感知(HKD / CNY / USD),附市场交易时段表(US 21:30–04:00 CST, HK 09:30–16:00 CST 等)
  • 6 维加权评分(大师思路映射):基本面 25%(巴菲特 + 芒格)/ 增长 20%(彼得·林奇 + Cathie Wood / PEG)/ 估值 25%(达摩达兰 DCF)/ 技术 15%(Druckenmiller 均线/RSI/MACD)/ 情绪 10% / 风险 5%(Ackman 下行催化剂)
  • DCA 摊薄成本模块:平均成本公式、金字塔买入(30%/20%/30%)、网格交易
  • 加入 Soros(reflexivity)+ Dalio(all-weather / debt cycle) 人设,量化信号 × 置信度

做T(日内交易)

  • 正T (long_T):价格在 MA5 下方 + RSI<35(超卖)+ 放量 → 低买高卖
  • 反T (short_T):价格在 MA5 上方 + RSI>65(超买)+ 缩量 → 高卖低买
  • 每笔 2000-3000 股,最低价差目标 ≥ HK$0.3/股
  • 每日上限 10 笔
  • 单笔资金上限 ≈ HK$6800(约等于 RMB 6300,04-17 起与实际账户余额对齐)

做V(波段交易)

  • 价格偏离 MA10 超过 3% → 均值回归操作
  • 每笔 2000-3000 股,最低价差 ≥ HK$0.8

技术指标体系

指标计算方式用途
MA5近5日收盘均价短期趋势判断
MA10近10日收盘均价中期趋势+做V参考
RSI(6)6日相对强弱指标超买超卖信号
振幅(最高-最低)/前收盘×100%交易可行性过滤
量比当前成交量/近5日均量量价配合确认

止损规则

  • 单笔止损:亏损 > HK$0.3/股 → 立即平仓
  • 当日止损:累计亏损 > HK$1500 → 当日停止交易
  • 不交易条件:振幅 < 0.5%、预期利润 < 3 倍手续费

系统架构(v4 — 04-22 Round 3 重构定版)

后端数据层 (SQLite, better-sqlite3)

/home/restry/trading-sim/trades.db(环境变量 DB_PATH 覆盖;老的 ~/.hermes/trading-sim.db / trades.db / data.db 等为历史残留):

  • portfolio / trades / alerts / summary — 账本基础表
  • market_snapshots — 每 5 分钟行情快照(386+ 条)
  • ticker_analysis — 每轮决策结果(字段:decision/reason/composite_score/confidence/input_snapshot_json/input_context_json/llm_output_json/alert_payload_json/outcome_24h/outcome_48h/llm_error/rule_version 默认 v4.0/filled_alert_id)
  • daily_summary — OHLC 日线(04-22 起 open/high/low/close 全量回填,TEST/活跃 ticker 全覆盖,仅 2026-04-20 600036.SH 历史空值)
  • cron_heartbeat — 每条 cron 跑完写 (job, ok_at, rows),health-check 扫 >20min 无心跳告警
  • schema_migrations — v4.0 记录,幂等清表

LLM 从关键路径移到旁路

  • 脚本是事实源analyze_v2.py 直写 ticker_analysis + 触发 alerts;硬护栏:单日 buy/sell ≤3、加仓 shares ≤ 持仓 20%、新开仓 notional ≤ 市场绝对金额 cap(HK 50k HKD / CN 30k CNY / US 5k USD,04-24 改版)、价格 ±5%、decision 枚举。被拒时错误信息带 max_shares≈N 提示让 LLM 下轮自动合规重试
  • LLM 仅做 reason 润色reason-polish 每 15 min 跑,失败无害
  • 全链路带心跳 + 过期守卫(latest_*()max_age,陈旧标”数据陈旧”不贴决策)

前端 Dashboard

主站(Next.js, stock.eagle): /home/restry/projects/stock-dashboardhttps://stock.eagle.openclaws.co.uk

  • PM2 stock-dashboard (fork, next start -p 3457, Node 22)
  • 组件:AnalystStrip / LatestDecision / DimensionsRadar(七维雷达)/ Kelly 卡 / ActionTimeline(decision/alert_created/alert_filled/trade 四类事件统一时间流) / MarketSessionBadge(港股/A 股盘前盘后 + 1s 刷新) / MarketTickerBar / IntradayChart / TradesTable / AlertsBar
  • 路由:/decisions(列表,整行点击跳详情)、/decisions/[id](详情:基本信息 / 雷达 / Kelly / alert_payload / input_context_json / llm_output_json)
  • API:/api/stats/api/summary/api/trades/api/decisions?ticker=X&limit=N/api/timeline?ticker=X/api/market/snapshot/api/market/history?hours=8/api/alerts/api/portfolio

旧 Astro 站 prism-dashboardhttps://dash.eagle.openclaws.co.uk):04-22 Phase 3 股神内容全量回滚;04-24 Resley 要求彻底去股票化,Portfolio 持仓卡(首屏大卡)+ 项目近况里的”持仓系统”卡 + data.tsgetPortfolio/PortfolioItem/PortfolioData/PORTFOLIO_API 全部删除;股神相关统一收敛到 Next.js stock-dashboard

cron 任务(v4.1,04-23 偏移调整,9 个股神 cron)

任务调度说明
analyst-1810.HK / 00700.HK32,47,2,17 9-15 工作日港股分析,09:32 首跑(04-23 从 */15 9-15 改为 32,47/...,给 A 股 9:30 开盘让 1 分钟报价就位)
analyst-600036.SH / 000978.SZ32,47,2,17 9-14 工作日A 股分析
analyst-broadcast*/5 9-16脚本直出 + dedup/[SILENT]
market-snapshot*/3 * * * *日内行情不调 LLM,04-23 从 */5 改为 */3,盘外自动 skip 成本忽略
health-check*/10 9-16cron_heartbeat 告警
outcome-backfill4:00 每日24/48h 结果回填
portfolio-daily16:30 工作日日报
reason-polish*/15唯一 LLM cron,旁路润色 reason

监控标的

标的代码持仓成本行情源备注
小米集团1810.HK8800 股HK$45.67(04-19 最新)tencent(主)/ yahoo fallback主力,做 T/V
腾讯00700.HKtencent(主)/ yahoo fallback04-21 Yahoo 报价失效,04-23 切 tencent 修复
招商银行600036.SH1000 股(占位)¥40(占位)sina04-17 新增
桂林旅游000978.SZsina

MSFT 美股独立一族(21/22/23 时工作日推送)。

架构支持任意 ticker,通过 dashboard ⚙ 标的按钮 + POST /api/portfolio 动态添加。

交易记录

2026-04-17(首日,小米)

  • 3 笔全盈利,累计收益 HK$2,220
  • 成本从 HK45.75(降 HK$0.25/股)
  • 策略:反T 为主,利用早盘波动

近期里程碑

  • 2026-04-28stock.eagle PM2 复发 + snapshot cron 启动期数据缺口:早 9:25 微信报「打不开」→ pm2 列表里 stock-dashboard 又没了(04-20 之后的二次复发)。pm2 start ... --time 拉起 + pm2 save 持久化,HTTP 200 恢复。snapshot cron 启动期缺口:09:00–09:27 之间 snapshot */3 几轮要么撞上 dashboard 502 重启窗口、要么 cron 启动延迟 → 数据库最新记录还是 04-27 16:00 UTC(开盘前),日内行情为空。手动重跑首轮 snapshot 后立刻每分钟入库 7 标的(手动重跑前一次执行是 0 ok / 7 skipped,疑似 better-sqlite3 首次启动锁/初始化抖动),09:32 第一轮 analyst 也照常触发。pm2 save 守则升级:04-20 已经定过”新服务必 pm2 save”,但服务器重启后 stock-dashboard 仍掉队 → 怀疑 ecosystem dump 没真正写入或被覆盖,下次复发时核对 ~/.pm2/dump.pm2
  • 2026-04-25stock-dashboard 线上重发(resley 微信「发布一下」→ 澄清是发到 stock.eagle.openclaws.co.uk,本地 build + PM2 restart 走线、HTTP 200)。同日对 components/ReportsPage.tsx (810 行) 跑了一轮 frontend audit(产物 tmp/audit-report-v4.md),重点:实盘 vs 模拟视觉权重、模拟账本是否在「今日战况 / 账户快照」两次重复露出、ChevronDown 折叠交互可发现性、中文段落版式、token 一致性、移动端断点、44px 触摸目标 — 仅审计未改码
  • 2026-04-24 — 新开仓风控改金额 cap + dashboard 去股票化:
    • 新开仓风控:MV 比例 → 绝对金额:原 held==0 分支用 shares × price > portfolio_MV × 10% 拒单,对小组合下 400+ 港币高价股极不友好(34 万 RMB 组合里 00700 只能买 70 股,所谓”试探仓”根本探不动)。Resley 拍板用业界常用”按市场分档绝对金额 cap”:HK ≤ 50k HKD / CN ≤ 30k CNY / US ≤ 5k USD。execute_decision.py:101-107 替换 _validate_alert_payload 签名加 ticker/market,4 用例回归通过(00700 100 股@491=49.1k ✅ / 150 股@491=73.65k ❌ / 招行 1000 股@39.7=39.7k ❌ / 700 股@39.7=27.79k ✅);被拒时错误信息带 max_shares≈N 提示让 LLM 下轮改量重试。下次 analyst cron (10:02) 自动生效无需重启
    • 触发事件:09:48 LLM 给 00700 建新仓 100 股被旧规则拦(cap≈70 股),而 00700 在 04-21 21:59 刚清仓 @520(real 账户)—— portfolio.shares=0initial_shares=100,硬风控走 held==0 分支不识别”再入场”
    • ticker_analysis.analyzed_at 误判:Resley 报告”全是 2000-01-01”,复查发现字段是 unix epoch int,原查询姿势错;4 只票 09:32-09:33 HOLD 决策时间戳正确,无 bug
    • Dashboard 去股票化:Resley「wiki 功能里整理的股票信息去掉」明确指向 dash.eagle.openclaws.co.ukprism-dashboard Astro 站),派 Claude Code 删 Portfolio 首屏大卡 + “持仓系统”项目卡 + data.ts Portfolio 相关代码,build + 线上生效。stock-dashboard 保留为股神唯一入口
    • confidence 语义澄清confidence 非脚本算,是 LLM 对自身 HOLD 判断的把握度(七维 signal×weight → composite_score → decision 映射,顶层 confidence 由 LLM 输出,recent_outcomes.hit_rate_24h<0.4 时压一档校准)。09:46 全 4 票 HOLD conf=0.55 = 震荡开盘信号不明
  • 2026-04-23 — 港股行情源切换 + cron 偏移调整:
    • Yahoo HK 开盘卡昨收根治:Yahoo 港股 regularMarketPrice 开盘后持续返回昨收(小米卡在 31.8 / 腾讯卡在 500),meta 不更新且 intraday bars 缺失。腾讯 qt.gtimg.cn/q=r_hk01810 和新浪实时正常 → 港股源切腾讯主源 + Yahoo fallback;字段映射踩坑 3=current, 4=prev_close(曾误读成 pct=0 / prev_close=30.94
    • analyst cron 偏移 → :32/:47/:02/:17:原 */15 9-15 在 9:00 就触发一次,但 A 股 9:30、港股 9:30 开盘,首跑遇 market_session != trading 全部 skip stale。改为 :32 首跑让开盘 2 分钟让报价就位
    • market-snapshot */5*/3:Resley 要「日内行情更紧」,snapshot 不调 LLM 成本忽略;盘外自动 0 ok, 7 skipped 不污染 DB
    • 开盘前诊断方法论:在用户质疑”网页数据还是 17 小时前”时快速澄清「非故障,是 market_session != trading skip + broadcast [SILENT] 设计」;09:51 全绿:4 只全部实时入库(小米 30.9 / 腾讯 496.0 / 招商 39.69 / 桂旅 7.22 tencent+sina 3-5s 延迟)
  • 2026-04-22 — v4 架构 3 轮深度审计(Round 1/2/3)对照「LLM 决策详情 / 5 分钟数据 / 决策动作时间流 / 盘前盘后 Badge」4 大需求验收:
    • ActionTimeline 四类事件(decision/alert_created/alert_filled/trade)统一时间流上线,/api/timeline 打通
    • /decisions/[id] 详情页(七维雷达 + Kelly + full JSON)+ /decisions 列表页 + LatestDecision 历史入口
    • MarketSessionBadge 港股/A 股双挂 1s 刷新 + cleanup;source_decision_id 加入 alerts 表
    • daily_summary OHLC 回填(04-20 前 600036.SH 仍有历史 NULL,不影响主流程)
    • ⚠️ 残留 P1/P2:volume_ratio/amplitude/rsi6 分时折线缺;id=2 早期 BUY 的 llm_output_json 为空(老版 collector)
  • 2026-04-22 — 旧 prism-dashboard Astro 站 Phase 3 股神内容全量回滚(src/pages/stock/src/lib/stock.tsbetter-sqlite3 依赖移除),股神站点单点统一到 Next.js stock-dashboard
  • 2026-04-17 — Dashboard 重构:
    • app/page.tsx 去重 + 双账本 LedgerCard 布局
    • 告警面板从卡片网格改为单行紧凑条
    • 新增声音 + 浏览器 Notification、15s 轮询、🔊 开关
    • 新增 TickerTabsManageHoldingsModal、LogTradeModal 自动回填
    • 招商银行(600036.SH)作为第二个监控标的上线,placeholder 持仓待 UI 校正
    • 8 个 cmb-* cron 任务克隆自 xiaomi
  • 2026-04-17 — 视觉反馈未闭环:用户反映 “emoji 图标看着不顺眼”,视觉分析超时,待下轮 UI polish

成功率预估(小米)

阶段预估成功率说明
基础策略(纯价格判断)55-65%只看快照价格,无技术指标
技术指标增强(当前)70-75%MA+RSI+量价+止损
未来优化方向75-85%加分钟K线、历史学习、自适应参数

相关页面

2026-05-14 — 决定接入实时新闻做事件驱动决策

Resley 提问”决策考虑了最新时事吗?比如特朗普访华”,确认当前决策只用价格 + 财报 + 技术面,无新闻源。一日讨论定方案:

  • 目标:事件驱动 + 持仓相关性筛选(不是泛新闻摘要)
  • :财联社电报(首选)。先尝试 RSSHub 公共源 rsshub.app/cls/telegraph 已被限流,改方案 B:直接爬 https://www.cls.cn/telegraph HTML SSR 首屏 ~20 条
  • 存储:全量入库 SQLite,决策时按持仓 + 宏观关键词过滤
  • 频率:5min 轮询;新条目 LLM 打标签(利好 / 利空 / 中性 + 关联标的)
  • 集成点:决策 cron 之前注入新闻 context;当前痛点 — stock-v4 本地目录只有 spec/log,决策代码实际位于服务器或 stock-dashboard,待定位
  • 派 Claude Code163.228.243.161deployer 主机)搭爬虫 + SQLite + 轮询脚本

替代方案(已弃):方案 A 自建 RSSHub docker(长期更稳但启动重)、方案 1 Tushare 付费结构化、方案 3 每天开盘前 web_search 摘要塞 context(最省事)。Resley 选 B:脆但即时,反爬挂时再切 A。

推送频率调整记录

  • 2026-04-15 — Resley:「投资分析的东西不要太频繁,一小时一次就行」。msft-portfolio-update 从每 30 分钟调整为每小时(21:00/22:00/23:00 工作日)
  • 2026-04-16 — 小米 4 档 cron 上线,覆盖盘前/早盘/午盘/收盘
  • 2026-04-17 — 新增 xiaomi-sim-trade 实际执行交易的 cron(每 30 分钟,工作日 9:00-15:30),首日 3 笔全盈利共 HK$2,220

stock-dashboard 运维踩坑

  • 2026-04-20 上午https://stock.eagle.openclaws.co.uk/ 打不开:pm2 列表为空,服务器重启后 stock-dashboard 未自动起。已手动 pm2 start + pm2 save,HTTP 200。后续:所有新 pm2 服务必须立即 pm2 save,避免下次重启失联。
  • 2026-04-21 上午 cron 休市刷屏 → 频率与推送策略定版*/30 9-15 9:00 就触发一次,港股 9:30 / A 股 9:30 尚未开盘,4 个分析 cron 齐发「休市」消息刷屏。修复走了一段弯路:
    1. 第一版改 deliver=local + 让 agent 自己 send_message。失败——系统 prompt 给 cron 注入了「deliver=local 就别用 send_message,用 [SILENT] 抑制推送」,agent 于是永不推送,09:31 的真实分析报告憋在 local 没发出,Resley「怎么回事」
    2. 最终方案:deliver= 回到 discord 频道交由系统自动投递,休市时 agent 输出 [SILENT] 自动抑制推送,微信侧继续用 send_message 同步
    3. 频率最终定为 15 分钟一次*/15 9-15,Resley 要做 T);6 个分析 cron(xiaomi / cmb / 1810 / 00700 / 600036 / 000978)同步更新
  • 腾讯 00700.HK 通过 Yahoo 的报价在 04-21 盘中失效,04-23 根治:港股统一切 qt.gtimg.cn 主源 + Yahoo fallback,详见 上方 04-23 里程碑

待办

  • 校正 600036.SH placeholder 成本(1000 股 @ ¥40)
  • UI emoji / 视觉 polish(悬而未决)
  • 接入分钟级 K 线数据源,提高入场精度
  • 历史交易回顾机制:让 AI 分析历史成败再决策
  • 自适应参数:根据近期胜率动态调整 RSI 阈值
  • 加入 MACD 交叉信号辅助判断