知识
← 返回

金融专家团队模拟交易方案

2026-05-17 金融
#金融 #githubfetch

title: 金融专家团队自动化模拟交易方案 v2
date: 2026-05-17T18:50:00+08:00
lastmod: 2026-05-17T18:50:00+08:00


金融专家团队自动化模拟交易方案 v2

基于现状:已有 4 个金融专家(调研/策略/风控/短线)+ 真实数据接口(sina/tencent/akshare)+ 持仓管理(portfolio.json)+ SiYuan 落档

已确认决策:初始资金 10 万,触发后需用户确认再分析,选股从零调研开始


一、核心思路

不重写,只串联。

专家团队现有的能力完全够用——策略专家会算 MACD/RSI/布林带,风控管家管仓位,调研专家找新闻。缺的只是一个「调度层」,让这些专家从被动问答变成主动运转的模拟交易系统。

┌──────────────────────────────────────────────────────────────┐
│                         调度引擎                             │
│                 (监控脚本 + cron 定时任务)                   │
│                    Token 消耗 ≈ 0                           │
└──────────────┬──────────────┬──────────────┬───────────────┘
               │              │              │
     ┌─────────▼──┐   ┌──────▼──────┐   ┌───▼──────────┐
     │ 回测引擎     │   │ 实时盯盘脚本   │   │ 绩效统计      │
     │ (一次性)      │   │ (cron 每分钟) │   │ (cron 每日)  │
     └─────────────┘   └──────┬──────┘   └──────────────┘
                              │ 命中条件时 → 通知你
                     ┌────────▼────────┐
                     │  Matrix 通知     │
                     │  "茅台触发了     │
                     │  MACD金叉,     │
                     │  要不要分析?"    │
                     └────────┬────────┘
                              │ 你说"分析"→
                     ┌────────▼────────┐
                     │  策略专家(LLM)  │
                     │  Token ~2000/次  │
                     │  出分析报告       │
                     └────────┬────────┘
                              │ 你决定 → 
                     ┌────────▼────────┐
                     │  风控管家(LLM)  │
                     │  检查模拟持仓风险  │
                     │  登记模拟交易     │
                     └─────────────────┘

Token 成本: 盯盘脚本每分钟跑一次,零 LLM 调用。只有「策略条件被触发 + 你确认要分析」时才调一次策略专家(约 2000 token/次)。如果一天触发 3-5 次、其中你说「分析」1-2 次,日 token 成本约 $0.02-0.05。


二、第一阶段:选股调研(从零开始)

这是整个系统的起点。你是一个新手,没有自己关注的股票池,需要专家从零帮你筛选。

2.1 调研流程

第一步,调研专家出马。他会做以下几件事:

大盘环境摸底

  • 当前大盘处于什么阶段?牛市、熊市、震荡市?
  • 沪深 300 近 60 日走势、成交量变化
  • 当前市场风格(大盘股强还是小盘股强?价值还是成长?)

行业扫描

  • 申万一级行业分类,最近 1 个月哪个行业板块涨幅最大、哪个跌幅最大
  • 从涨幅前 5 的行业和跌幅前 5 的行业中各挑 2-3 个代表性股票
  • 波动率筛选:近 20 日波动率适中(不是死水一潭也不是过山车)的标的

推荐候选池
调研专家产出报告,推荐 5-8 只候选股票,每只附上:

维度 说明
基本信息 做什么的、市值多少、PE/PB
近期新闻 有没有重大事件(业绩预告、资产重组、利空/利多)
流动性 日均成交量够不够(模拟交易要能成交)
技术面初筛 近期有没有趋势(不是横盘震荡一年没动静)
关注理由 为什么这只值得盯

2.2 你确认候选池

调研报告发到 Matrix 给你,你看完后决定:从这 5-8 只里选 3-5 只作为初始监控池。

你的决策依据很简单——你觉得哪几只的名字听起来顺眼、行业你看得懂、或者调研专家说的理由你认同。选了就说「就这几只」,没看中的就说「换一批」,调研专家换一批再给你看。

2.3 存到配置里

你确认的股票写入 strategy_config.json,作为盯盘脚本的初始监控列表。


三、第二阶段:回测验证(一次性搭建)

在实盘模拟跑之前,先用历史数据回滚验证这些股票的技术策略胜率。

3.1 回测方法

策略专家的 prompt 里规定了技术分析流程:取 60-120 天历史 → 算 MACD/RSI/布林带/均线 → 给出方向判断和置信度。

回测就复现这个过程——但区别是:

不需要 LLM 参与。 策略专家做判断的核心逻辑其实是工具函数算出来的技术指标。一个 Python 脚本就能完成同样的事:

  • 取过去两年的日线数据
  • 在每个交易日,回头看前 120 天数据
  • 算技术指标(MACD 金叉/死叉、RSI 超买超卖、均线排列、布林带位置)
  • 根据策略专家 prompt 里的置信度规则(≥3 个同向指标→高置信度)算出「建议」
  • 对比 5 天/10 天/20 天后实际涨跌
  • 统计胜率、盈亏比、最大回撤

3.2 回测产出

对候选池里每只股票出一份报告,包含:

  • 每个策略信号的胜率(金叉买入 vs 死叉卖出 vs RSI 超卖买入)
  • 高/中/低置信度判断的实际准确率——这个最有用,可以验证专家是不是真的有判断力
  • 如果某只股票近两年几乎没有触发任何信号,考虑剔除

3.3 你确认回测结果

回测报告发给你看。你不需要懂技术细节,只看结论:

  • 「东阿阿胶过去 2 年的策略信号胜率 65%,高置信度信号胜率 78%」
  • 「茅台的 RSI 超卖买入策略胜率 82%」
  • 「中国石油因为波动太小,近两年几乎没触发信号,建议剔除」

你觉得 OK 就进下一阶段。如果有顾虑就换股。

3.4 存放位置

作为 Python 脚本放在 /opt/agent/financial-team/tools/backtest.py,单独运行,不依赖 LLM。


四、第三阶段:搭建盯盘系统

4.1 盯盘脚本(零 LLM)

一个轻量 Python 脚本,每分钟跑一轮,纯数值判断。

定义你的触发条件:

条件 信号含义 示例
MACD 金叉/死叉 趋势转向信号 DIFF 刚上穿 DEA(金叉)或刚下穿(死叉)
RSI 超买/超卖 短期可能回调或反弹 RSI(14) > 70 超买或 < 30 超卖
布林带突破 价格异常波动 收盘价突破布林带上轨/下轨
均线排列变化 趋势确认 MA5 > MA20 > MA60(多头)或反之(空头)
放量/缩量 资金异动 当日成交量 > 20 日均量 × 1.5
单日涨跌幅超限 异动提醒 涨 > 5% 或跌 > 4%

脚本流程:

每分钟循环:
  1. 判断当前是否为交易时段(9:30-15:00,非周末非节假日)
  2. 如果不是交易时段 → silent 退出
  3. 如果是交易时段:
     a. 对监控池每只股票请求 sina 实时行情
     b. 检查价格类条件(涨跌幅、价格水平)
     c. 每 15 分钟请求一次历史数据 + 算技术指标
     d. 指标是否触发策略条件
     e. 如果有触发:
        - 检查是否在 24 小时内重复触发同一信号 → 是则跳过
        - 不是则写入 .triggers/ 队列
        - 发 Matrix 通知问你
     f. 如果无触发 → silent,继续下一分钟

4.2 你确认的节奏

盯盘脚本不会像轰炸机一样一直发消息。

  • 只有条件触发时才找你
  • 同一只股票同一信号 24 小时内不重复提醒
  • 当你回复「分析」时,调策略专家出完整报告
  • 当你回复「跳过」或没回复→本轮忽略
  • 如果你觉得太吵,可以说「调低灵敏度」或「今天别烦我」

4.3 收盘扫描

每天 15:30(收盘后),脚本自动做一次全量扫描:

  • 计算所有监控股的当日技术指标
  • 更新盘中累积的触发记录
  • 如果你是第一次用、盘中没触发任何条件,收盘时会有一条简单的「今日无信号」

4.4 存放位置

/opt/agent/financial-team/tools/monitor.py,通过系统 crontab 每分钟调度。

# crontab
* * * * 1-5 root python3 /opt/agent/financial-team/tools/monitor.py --tick
30 15 * * 1-5 root python3 /opt/agent/financial-team/tools/monitor.py --daily-scan

五、第四阶段:专家分析 + 模拟交易

5.1 触发到你确认的全流程

用大白话讲一遍你实际会看到什么:

  1. 你收到一条 Matrix 消息

⚠️ 东阿阿胶触发信号:RSI(14)=28.3,进入超卖区间(<30)。要不要分析?

  1. 你回复「分析」
  • 策略专家开始工作,拉数据、算指标、写报告
  • 几分钟后你收到完整的分析报告摘要,SiYuan 上有完整版 3. 你问:「所以我现在该咋办?」

  • 策略专家用大白话解释:当前价格 52.26,技术面怎么看,风险在哪

  • 最后会有一个明确的「建议方向」和置信度 4. 如果你说「买入 1000 股看看」

  • 风控管家登场:检查模拟组合当前状态

  • 确认你的买入不超风险限制
  • 登记到 portfolio_sim.json
  • 回复确认消息:「已登记模拟买入东阿阿胶 1000 股 @ 52.26 元,模拟持仓现金剩余 94,774 元」 5. 如果不操作,直接忽略,等下一个信号

5.2 模拟持仓

新建 portfolio_sim.json,初始资金 100,000 元:

{
  "mode": "simulation",
  "start_date": "2026-05-18",
  "initial_capital": 100000,
  "cash": 100000,
  "holdings": [],
  "transactions": [],
  "last_updated": "..."
}

风控管家用跟真实持仓完全一样的 write_portfolio​ 逻辑,只是文件换成 portfolio_sim.json

5.3 模拟交易规则

买入:

  • 你看到分析报告后说「买入 X 股」
  • 风控管家检查模拟组合,确认不超 25% 单票警告线
  • 登记买入,扣减 cash,增加 holdings

卖出:

  • 你说「卖出」或「不想要了」
  • 或持仓触发止损线(买入价的 -8% 自动预警,问你「要不要卖?」)
  • 你确认后登记卖出

5.4 跟你的真实持仓完全独立

模拟持仓的买入卖出不影响你真实的 portfolio.json。你可以在真实账户里继续做你自己的交易,模拟盘独立跑。两者对比本身就是一件有趣的事——看看专家的判断比你自己操作强多少。


六、第五阶段:看成绩

6.1 每天看什么

每天收盘后生成一句话:

📊 模拟盘日报(第 7 天)
总资产:103,250 元(+3.25%)
持仓:东阿阿胶 1000 股 @ 52.26,浮盈 +2.1%
同期沪深 300:+1.8%
今日无新信号触发

6.2 每周看什么

每周发一份 SiYuan 报告,包含:

  • 收益曲线图
  • 所有交易清单(买卖时间、价格、盈亏)
  • 信号分析:本周触发了几次信号?你确认分析了几次?最后执行了几次?
  • 哪个信号类型效果最好(MACD 金叉 vs RSI 超卖 vs 突破)

6.3 一个月后

算总账:

  • 总收益率
  • 跑赢大盘多少
  • 胜率(赚钱的交易/总交易数)
  • 最大回撤(从最高点跌了多少)
  • 跟专家判断对比:专家高置信度的交易胜率和低置信度的交易胜率差多少

这个月结就是最重要的产出——你会知道这套系统到底值不值得继续跑、改参数、甚至投入真钱。


七、新增文件清单

/opt/agent/financial-team/
├── tools/
   ├── backtest.py              # 回测引擎(新)
   ├── monitor.py               # 实时盯盘脚本(新)
   ├── performance.py           # 绩效统计(新)
   └── strategy_config.json     # 策略条件配置 + 监控股票列表(新)
├── shared/
   ├── portfolio_sim.json       # 模拟持仓(新)
   ├── portfolio.json           # 真实持仓(已有,不受影响)
   └── .triggers/               # 信号队列目录(新)
       ├── 2026-05-17.jsonl
       └── errors.jsonl
   users/
       └── ywz/
           └── portfolio.json   # 已有
├── agents/                      # 已有,不动
└── prompts/                     # 已有,不动

不改任何现有代码。 所有新功能都是新增独立文件。


八、实施阶段总览

阶段 干什么 你需要做什么 产出
阶段一:选股 调研专家出研报,推候选池 从报告里选 3-5 只你感兴趣的股 监控股票池
阶段二:回测 backtest.py 跑历史策略验证 看结论确认是否继续 历史胜率报告
阶段三:搭建 写 monitor.py + 配置 cron + 建模拟持仓 没问题就开跑 盯盘系统上线
阶段四:运行 触发 → 问你 → 分析 → 你决定 聊着天就看了 模拟交易记录
阶段五:总结 每日/每周/每月出成绩单 看成绩决定下一步 收益报告

每个阶段都是独立的,你随时可以喊停。


九、风险提示(说人话版)

  1. 回测漂亮不代表实盘也漂亮 —— 历史数据拟合得太好,到实盘可能就不灵了。模拟盘就是用来验证这个的。
  2. 专家不是神 —— 高置信度信号也有看走眼的时候,不是每次分析都准。用模拟盘跑一段时间就知道了。
  3. 技术指标天生滞后 —— MACD 金叉出现的时候,可能已经涨了 5% 了。这没办法,但 8%-10% 的止损线可以控制亏损。
  4. 非交易时间安静 —— 周末、节假日、盘中休息时间脚本不会打扰你。
  5. 你随时可以退出 —— 不想玩了就说「不跑了」,不损失任何东西。

可行性评估结论

评估时间:2026-05-17|基于实际代码调研,非凭空判断

总体结论

方案高度可行,核心基础设施已全部就位,缺的只是 3 个纯 Python 脚本。


已就位的能力(无需新写)

方案需要 代码现状 结论
4 个专家(调研/策略/风控/短线) prompts/ 下 4 个完整 .md,agents/base_agent.py + expert_runner.py 已运行 ✅ 直接用
技术指标计算(MACD/RSI/布林带/均线/KDJ) real_tools.py 里 calculate_technical 本地计算,9 种指标,0 网络依赖 ✅ 直接用
数据接口(sina/tencent/akshare) get_stock_spot + get_stock_history + get_stock_news,双路径 fallback ✅ 直接用
持仓管理(read/write_portfolio) 完整实现,权限隔离,自动备份,已运行 23+ 笔交易(junjun) ✅ 直接用
Matrix 通知 expert_runner.py 里 send_matrix_message,Markdown 转 HTML,已生产验证 ✅ 直接用
SiYuan 落档 save_to_siyuan,ywz/junjun 双端口配置,已激活 ✅ 直接用
交易日校验 get_trade_calendar,akshare 交易日历,周末/节假日自动跳过 ✅ 直接用
策略专家置信度规则(≥3 同向指标=高) strategy.md 里明文定义,方案拿来做回测判断逻辑完全匹配 ✅ 直接用

确实缺失的部分(方案说”新增文件”是对的)

缺失项 工作量评估 备注
monitor.py(盯盘脚本) 中等,约 200-300 行纯 Python 调用已有 calculate_technical + get_stock_spot,逻辑是纯数值判断,不涉及 LLM
backtest.py(回测引擎) 中等,约 150-200 行 调用 get_stock_history + calculate_technical,循环遍历历史日期即可
performance.py(绩效统计) 小,约 100 行 读 portfolio_sim.json + 实时价格,计算浮盈/回撤
strategy_config.json 极小 配置文件,写监控股票列表和条件阈值
portfolio_sim.json 极小 模拟持仓初始化,复用 portfolio.json 同结构
.triggers/ 目录 极小 mkdir 即可

两个需要提前确认的风险点

风险一:cron 权限

方案里写了 * * * * 1-5 root python3 /opt/agent/financial-team/tools/monitor.py --tick,这是系统级 crontab(需要 root 写 /etc/crontab)。当前代码仓库操作范围限制在 /opt/ 下,没有 sudo 权限。

替代方案:用 junjunclaw 的 OpenClaw cron 机制触发,或用 user-level crontab(crontab -e),或 monitor.py 内部用 APScheduler 自循环。三选一,建议选 user crontab。

风险二:ywz 用户 portfolio 为空

当前 ywz 用户的 portfolio.json 里 cash=0,holdings 为空。模拟持仓用的是独立的 portfolio_sim.json,和真实持仓无关,所以这不影响模拟盘跑起来。但如果后续想把真实持仓和模拟持仓对比,需要先初始化 ywz 的真实持仓文件。


方案与代码的主要偏差

方案第四阶段写的是「你说分析 → 策略专家工作」,实际代码里专家是 fire-and-forget 启动的(junjunclaw 发指令 → router.py 路由 → expert_runner.py 异步执行 → 结果 Matrix 直发)。整个交互链路已经实现,触发方式和方案描述完全匹配,无偏差。

方案里提到 DSA 服务(短线猎手依赖 localhost:8000),如果 DSA 没跑起来,hunter 会报错。这个依赖方案里没有特别说明,实施前需确认 DSA 服务状态。


实施优先级建议

按代码依赖顺序,建议这样启动:

  1. 初始化 portfolio_sim.json(5 分钟,直接建文件)
  2. 写 backtest.py,对候选股跑历史验证(1-2 天)
  3. 写 monitor.py,先 dry-run 不触发真实通知(1-2 天)
  4. 接入 user crontab,上线盯盘(半天)
  5. 写 performance.py 日报(半天)

总工时估算:3-5 天可以跑起来完整的模拟盘。


RunBook:从零到上线

本 RunBook 对应方案 v2,覆盖:环境前置检查 → 新建文件 → 接线 → 验证 → 回滚。所有改动均为新增,不修改已有代码。

0. 前置检查(动手前必过)

逐项确认,全部 ✅ 再往下走。

  • [ ] Python 环境:python3 /opt/ywz-agent-ecosystem/agent/financial-team/tools/real_tools.py 不报错
  • [ ] 数据接口:调用 get_stock_spot('000423') 能返回正常报价(Sina/Tencent 双路径)
  • [ ] SiYuan 落档:curl http://localhost:6806/api/system/getConf -H 'Authorization: Token be1e32q75r4j294r' 返回 200
  • [ ] Matrix 通知:expert_runner.py 里 MATRIX_HOMESERVER / MATRIX_ACCESS_TOKEN 环境变量已配
  • [ ] DSA 服务:localhost:8000 目前无响应 → hunter 专家暂时不用,其余三个专家不受影响
  • [ ] 写权限:ls -la /opt/ywz-agent-ecosystem/agent/financial-team/shared/ 能看到 users/ 目录

1. 新建文件清单(不改任何已有文件)

共 6 个新文件 + 1 个目录,全部新增,零侵入。

1-A strategy_config.json

路径/opt/ywz-agent-ecosystem/agent/financial-team/shared/strategy_config.json

作用:统一配置中心。盯盘脚本、回测引擎、绩效统计三个模块都从这里读参数,改一处全生效。内容包括监控股票池、技术指标阈值、风控线、通知去重时窗。

{
  "monitoring_stocks": [],
  "signal_thresholds": {
    "rsi_oversold": 30,
    "rsi_overbought": 70,
    "volume_multiplier": 1.5,
    "daily_change_up_pct": 5.0,
    "daily_change_down_pct": -4.0,
    "bollinger_period": 20,
    "macd_fast": 12,
    "macd_slow": 26,
    "macd_signal": 9
  },
  "risk_control": {
    "single_stock_limit_pct": 0.25,
    "stop_loss_pct": -0.08,
    "notification_repeat_hours": 24
  },
  "simulation": {
    "initial_capital": 100000,
    "start_date": "2026-05-18"
  }
}

1-B portfolio_sim.json

路径/opt/ywz-agent-ecosystem/agent/financial-team/shared/portfolio_sim.json

作用:模拟持仓账本,与真实 portfolio.json 完全隔离。记录模拟买卖、现金余额、每笔交易触发信号。风控管家登记交易时写这个文件,performance.py 读这个文件出报告。

{
  "mode": "simulation",
  "start_date": "2026-05-18",
  "initial_capital": 100000,
  "cash": 100000,
  "holdings": [],
  "transactions": []
}

1-C .triggers/ 目录

路径/opt/ywz-agent-ecosystem/agent/financial-team/shared/.triggers/

作用:信号队列。monitor.py 触发信号时写入当天的 .jsonl 文件,记录已通知状态,防止 24h 内重复打扰。performance.py 读取统计信号触发次数与执行率。

1-D backtest.py

路径/opt/ywz-agent-ecosystem/agent/financial-team/tools/backtest.py

作用:一次性跑完,不依赖 LLM。对监控股票池里每只股票,取过去 2 年日线,模拟策略专家的置信度规则,统计 MACD / RSI / 布林带各类信号的 5/10/20 日胜率和最大回撤。输出报告存 SiYuan + 本地 shared/backtest_report.json

实现效果:跑完后你能看到类似「东阿阿胶 MACD 金叉近 2 年胜率 68%,RSI 超卖反弹胜率 72%」的结论,决定要不要这只股进入正式监控。

1-E monitor.py

路径/opt/ywz-agent-ecosystem/agent/financial-team/tools/monitor.py

作用:零 LLM 的盯盘引擎,由 crontab 每分钟调用一次。支持两个模式:

  • --tick(每分钟):判断是否交易时段 → 拉 Sina 实时行情 → 每 15 分钟算一次技术指标 → 检查 6 类信号 → 去重(24h 内不重复)→ 写 .triggers/ → 发 Matrix 通知
  • --daily-scan(收盘后 15:30):扫全部监控股当日指标 → 更新触发记录 → 无信号则发「今日无信号」日报

实现效果:上线后不需要盯盘,只有真正触发技术信号时才会收到 Matrix 消息,消息里直接问「要不要分析」。

1-F performance.py

路径/opt/ywz-agent-ecosystem/agent/financial-team/tools/performance.py

作用:读 portfolio_sim.json + 实时行情,生成三种报告:

  • 日报(每日 15:35 crontab 触发):总资产、浮盈浮亏、当日涨跌、同期沪深 300 对比
  • 周报(每周五 16:00):收益曲线、完整交易清单、各信号类型效果排名,落档 SiYuan
  • 月报(每月最后交易日):总收益率、跑赢大盘幅度、胜率、最大回撤、高低置信度交易对比

实现效果:系统自动告诉你这个月专家判断对了几次、赚了多少、哪类信号最准。

2. 执行步骤(按顺序)

Step 1:初始化配置和模拟账本(5 分钟)

cd /opt/ywz-agent-ecosystem/agent/financial-team/shared

# 创建配置文件
cat > strategy_config.json << 'EOF'
{
  "monitoring_stocks": [],
  "signal_thresholds": {
    "rsi_oversold": 30, "rsi_overbought": 70,
    "volume_multiplier": 1.5,
    "daily_change_up_pct": 5.0, "daily_change_down_pct": -4.0,
    "bollinger_period": 20, "macd_fast": 12, "macd_slow": 26, "macd_signal": 9
  },
  "risk_control": {
    "single_stock_limit_pct": 0.25, "stop_loss_pct": -0.08,
    "notification_repeat_hours": 24
  },
  "simulation": { "initial_capital": 100000, "start_date": "2026-05-18" }
}
EOF

# 创建模拟持仓
cat > portfolio_sim.json << 'EOF'
{
  "mode": "simulation", "start_date": "2026-05-18",
  "initial_capital": 100000, "cash": 100000,
  "holdings": [], "transactions": []
}
EOF

mkdir -p .triggers
echo "✅ Step 1 完成"

Step 2:让调研专家选股(用户操作)

在 Matrix 对 junjunclaw 说:

帮我调研当前市场环境,从申万一级行业里筛选 5-8 只适合波段操作的候选股,重点看波动率适中、流动性好、近期有催化剂的标的,出一份推荐报告

报告发到 Matrix + 落档 SiYuan 后,从里面选 3-5 只,把代码填进 strategy_config.json​ 的 monitoring_stocks

Step 3:跑回测(30-60 分钟,一次性)

cd /opt/ywz-agent-ecosystem/agent/financial-team
python3 tools/backtest.py --config shared/strategy_config.json --output shared/backtest_report.json

# 查看结果
python3 -c "import json; r=json.load(open('shared/backtest_report.json')); [print(k,v) for k,v in r.items()]"

胜率低于 55% 的股票考虑换掉,剩下的进入正式监控池。

Step 4:配置 crontab 上线盯盘(10 分钟)

crontab -e
# 加入以下 4 行:

# 盯盘:交易日每分钟
* * * * 1-5 python3 /opt/ywz-agent-ecosystem/agent/financial-team/tools/monitor.py --tick >> /opt/ywz-agent-ecosystem/agent/financial-team/shared/monitor.log 2>&1

# 收盘扫描:每个交易日 15:30
30 15 * * 1-5 python3 /opt/ywz-agent-ecosystem/agent/financial-team/tools/monitor.py --daily-scan >> /opt/ywz-agent-ecosystem/agent/financial-team/shared/monitor.log 2>&1

# 日报:每个交易日 15:35
35 15 * * 1-5 python3 /opt/ywz-agent-ecosystem/agent/financial-team/tools/performance.py --daily >> /opt/ywz-agent-ecosystem/agent/financial-team/shared/monitor.log 2>&1

# 周报:每周五 16:00
0 16 * * 5 python3 /opt/ywz-agent-ecosystem/agent/financial-team/tools/performance.py --weekly >> /opt/ywz-agent-ecosystem/agent/financial-team/shared/monitor.log 2>&1

Step 5:验证盯盘在跑(交易时段内执行)

python3 /opt/ywz-agent-ecosystem/agent/financial-team/tools/monitor.py --tick
tail -20 /opt/ywz-agent-ecosystem/agent/financial-team/shared/monitor.log

3. 验证清单(上线后第一天确认)

  1. crontab -l 能看到 4 条新任务
  2. monitor.log 在 9:30-15:00 内每分钟有新记录
  3. 触发任意信号后,Matrix 收到通知(格式:「⚠️ XXX 触发信号:…要不要分析?」)
  4. 说「分析」后,策略专家跑完,Matrix 收到报告,SiYuan 有落档
  5. 说「买入 500 股」后,风控管家登记到 portfolio_sim.json(不动真实 portfolio.json)
  6. 15:35 收到日报(哪怕内容是「今日无交易」也算正常)

4. 回滚方案

本方案全部新增,回滚极简:

# 停止盯盘
crontab -e  # 删除 4 条 monitor/performance 任务

# 清理新建文件(可选)
rm /opt/ywz-agent-ecosystem/agent/financial-team/shared/strategy_config.json
rm /opt/ywz-agent-ecosystem/agent/financial-team/shared/portfolio_sim.json
rm -rf /opt/ywz-agent-ecosystem/agent/financial-team/shared/.triggers/

# 已有代码完全未改动,无需恢复
echo "回滚完成,系统恢复到方案 v2 实施前状态"

5. 常见问题

  • monitor.py 报「非交易时段」:正常,脚本判断当前不在 9:30-15:00 或是周末/节假日,直接退出,不是 bug
  • Sina 数据拉不到:real_tools.py 内置 Tencent fallback,自动切换,继续等下一分钟
  • 同一信号反复通知:检查 .triggers/ 下当天的 .jsonl,确认 status 字段是否正确写入「notified」
  • 策略专家跑很久没结果:查 expert_runner.py 日志,可能是 DeepSeek API 限速,等 1-2 分钟重试
  • hunter 专家报错:DSA 服务(localhost:8000)未启动,暂时不用 hunter,其余三个专家正常
  • portfolio_sim.json 数据写坏:直接重建从初始资金重来,不影响真实 portfolio.json

附录:改动前后文件树对比

改动前(当前状态)

financial-team/
├── agents/
   ├── base_agent.py           已有(ReAct 引擎,不动)
   ├── expert_runner.py        已有(Matrix 发送 + SiYuan 落档,不动)
   └── router.py               已有(fire-and-forget 路由,不动)
├── tools/
   ├── real_tools.py           已有(24 个函数,数据接口 + 持仓管理,不动)
   ├── memory_manager.py       已有(对话历史 + 投资画像,不动)
   └── dsa_client.py           已有(DSA 分析服务客户端,目前服务离线)
├── prompts/
   ├── research.md             已有(调研专家,不动)
   ├── strategy.md             已有(策略专家,不动)
   ├── risk.md                 已有(风控管家,不动)
   └── hunter.md               已有(短线猎手,DSA 离线时受限)
├── shared/
   ├── users/
      ├── ywz/
         ├── portfolio.json           已有(cash=0holdings 为空)
         ├── conversation_history.jsonl
         ├── memory/                 10  session 记忆文件)
         ├── research-reports/       2 份调研报告)
         ├── strategy-advice/        9 份策略建议)
         ├── hunter-picks/           2 份猎手选股)
         └── risk-alerts/            (空目录)
      └── junjun/                     junjun 独立空间)
   ├── market-cache/
   └── memory/
├── fin_tool.json
├── ARCHITECTURE.md
└── junjunclaw_integration.py

改动后(v2 方案实施完成)

financial-team/
├── agents/                    (全部不动)
├── tools/
   ├── real_tools.py          (不动)
   ├── memory_manager.py      (不动)
   ├── dsa_client.py          (不动)
   ├── backtest.py            🆕 回测引擎(~200 行,一次性跑,不依赖 LLM
   ├── monitor.py             🆕 盯盘脚本(~300 行,crontab 每分钟调用,零 LLM
   └── performance.py         🆕 绩效统计(~100 行,日//月报,落档 SiYuan
├── prompts/                   (全部不动)
├── shared/
   ├── strategy_config.json   🆕 统一配置中心(监控股票池 + 指标阈值 + 风控线)
   ├── portfolio_sim.json     🆕 模拟持仓账本(10 万初始,与真实持仓完全隔离)
   ├── backtest_report.json   🆕 回测结果(Step 3 跑完后生成)
   ├── monitor.log            🆕 盯盘运行日志(crontab 追加写入)
   ├── .triggers/             🆕 信号队列目录
      ├── 2026-05-18.jsonl   (每个交易日一个文件,记录触发信号和通知状态)
      └── errors.jsonl       (异常记录)
   └── users/
       ├── ywz/
          ├── portfolio.json          (不动,真实持仓独立)
          ├── strategy-advice/        (每次说「分析」后新增一份)
          └── ...                     (其余不动)
       └── junjun/                     (不动)
├── fin_tool.json              (不动)
└── ...

变更汇总

| 类型 | 数量 | 清单 |
| 新增文件 | 3 | backtest.py、monitor.py、performance.py |
| 新增配置 | 3 | strategy_config.json、portfolio_sim.json、.triggers/ |
| 运行时生成 | 2 | backtest_report.json、monitor.log |
| 修改已有文件 | 0 | 零侵入 |