金融专家团队模拟交易方案
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 触发到你确认的全流程
用大白话讲一遍你实际会看到什么:
- 你收到一条 Matrix 消息
⚠️ 东阿阿胶触发信号:RSI(14)=28.3,进入超卖区间(<30)。要不要分析?
- 你回复「分析」
- 策略专家开始工作,拉数据、算指标、写报告
-
几分钟后你收到完整的分析报告摘要,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 + 建模拟持仓 | 没问题就开跑 | 盯盘系统上线 |
| 阶段四:运行 | 触发 → 问你 → 分析 → 你决定 | 聊着天就看了 | 模拟交易记录 |
| 阶段五:总结 | 每日/每周/每月出成绩单 | 看成绩决定下一步 | 收益报告 |
每个阶段都是独立的,你随时可以喊停。
九、风险提示(说人话版)
- 回测漂亮不代表实盘也漂亮 —— 历史数据拟合得太好,到实盘可能就不灵了。模拟盘就是用来验证这个的。
- 专家不是神 —— 高置信度信号也有看走眼的时候,不是每次分析都准。用模拟盘跑一段时间就知道了。
- 技术指标天生滞后 —— MACD 金叉出现的时候,可能已经涨了 5% 了。这没办法,但 8%-10% 的止损线可以控制亏损。
- 非交易时间安静 —— 周末、节假日、盘中休息时间脚本不会打扰你。
- 你随时可以退出 —— 不想玩了就说「不跑了」,不损失任何东西。
可行性评估结论
评估时间: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 服务状态。
实施优先级建议
按代码依赖顺序,建议这样启动:
- 初始化 portfolio_sim.json(5 分钟,直接建文件)
- 写 backtest.py,对候选股跑历史验证(1-2 天)
- 写 monitor.py,先 dry-run 不触发真实通知(1-2 天)
- 接入 user crontab,上线盯盘(半天)
- 写 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. 验证清单(上线后第一天确认)
-
crontab -l能看到 4 条新任务 - monitor.log 在 9:30-15:00 内每分钟有新记录
- 触发任意信号后,Matrix 收到通知(格式:「⚠️ XXX 触发信号:…要不要分析?」)
- 说「分析」后,策略专家跑完,Matrix 收到报告,SiYuan 有落档
- 说「买入 500 股」后,风控管家登记到 portfolio_sim.json(不动真实 portfolio.json)
- 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=0,holdings 为空)
│ │ │ ├── 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 | 零侵入 |