From ec6373a577ac88bef2d927af23a7b944a07fd1be Mon Sep 17 00:00:00 2001 From: Yaojia Wang Date: Sat, 21 Mar 2026 12:05:13 +0100 Subject: [PATCH] vault: add Trading Agents project - hybrid architecture plan and original analysis --- .../Trading Agents 混合架构方案.md | 308 ++++++++++++++++++ .../TradingAgents 原始架构分析.md | 179 ++++++++++ 2 files changed, 487 insertions(+) create mode 100644 2 - Projects/Trading-Agents/Trading Agents 混合架构方案.md create mode 100644 2 - Projects/Trading-Agents/TradingAgents 原始架构分析.md diff --git a/2 - Projects/Trading-Agents/Trading Agents 混合架构方案.md b/2 - Projects/Trading-Agents/Trading Agents 混合架构方案.md new file mode 100644 index 0000000..3dbb842 --- /dev/null +++ b/2 - Projects/Trading-Agents/Trading Agents 混合架构方案.md @@ -0,0 +1,308 @@ +--- +created: "2026-03-21" +type: project +status: active +deadline: "" +tags: [trading, multi-agent, openclaw, openbb, architecture] +--- + +# Trading Agents 混合架构方案 + +## 目标 + +基于 [[openbb-invest-api]] 的数据层,在 OpenClaw 上实现类似 [TradingAgents](https://github.com/TauricResearch/TradingAgents) 的多角色交易决策系统。核心是**辩论驱动的投资决策**。 + +--- + +## 一、TradingAgents 原始架构分析 + +### 5 大模块 + +| 模块 | 角色 | 职责 | +|------|------|------| +| **Analyst Team** | 市场/社媒/新闻/基本面 4个分析师 | 并行抓数据,各写分析报告 | +| **Researcher Team** | Bull + Bear + 裁判 | 多空辩论 N 轮,裁判出投资方案 | +| **Trader** | 交易员 | 根据投资方案做 BUY/SELL/HOLD 决策 | +| **Risk Mgmt Team** | 激进/保守/中性 + 裁判 | 三方辩论风险,裁判修正决策 | +| **Memory System** | BM25 相似度检索 | 记住历史情况和教训,下次决策参考 | + +### 执行流程(LangGraph 状态机) + +``` +START → [Market/Social/News/Fundamentals Analysts 并行] + → Bull Researcher ⇄ Bear Researcher (N轮辩论) + → Research Manager (裁判裁决) + → Trader (交易决策) + → Aggressive ⇄ Conservative ⇄ Neutral (风控三方辩论) + → Risk Manager (最终裁决) + → END (BUY/SELL/HOLD) +``` + +### 技术栈 + +- **编排**:LangGraph (StateGraph + 条件路由) +- **LLM**:支持 OpenAI/Anthropic/Google/xAI/Ollama +- **数据**:yfinance + Alpha Vantage +- **记忆**:BM25 (rank-bm25) 离线相似度检索 +- **辩论**:可配置轮次 (`max_debate_rounds`, `max_risk_discuss_rounds`) + +--- + +## 二、openbb-invest-api 数据覆盖映射 + +> **结论:openbb-invest-api 已完全覆盖 TradingAgents 所有数据需求,且更丰富。** + +| TradingAgents 数据需求 | openbb-invest-api 端点 | 额外优势 | +|---|---|---| +| 股票行情 OHLCV | `/stock/{symbol}/historical` | ✅ | +| 技术指标 (RSI, MACD, BB, ATR) | `/stock/{symbol}/technical/*` | 14种指标 + Ichimoku, Fibonacci 等 | +| 基本面 (财报、资产负债表) | `/stock/{symbol}/financials`, `/metrics` | ✅ | +| 公司新闻 | `/stock/{symbol}/news` | ✅ | +| 宏观新闻 | `/macro/overview`, `/economy/*` | CPI, GDP, 就业, FOMC 等 | +| 内幕交易 | `/stock/{symbol}/insider-trades` | ✅ | +| 情感分析 | `/stock/{symbol}/sentiment` | 多源复合评分 (Finnhub + AV + Reddit) | + +### openbb-invest-api 独有数据(TradingAgents 没有的) + +- 做空数据 (`/shorts/*`):空头量、FTD、暗池 +- 期权数据 (`/market/options/*`):期权链、Greeks、IV +- 固收数据 (`/fixed-income/*`):收益率曲线、国债、SOFR +- DeFi 数据 (`/defi/*`):TVL、收益池、DEX 交易量 +- A 股/港股 (`/cn/*`):实时行情 + 历史数据 +- 投资组合分析 (`/portfolio/*`):HRP 优化、风险平价、t-SNE 聚类 +- 回测引擎 (`/backtest/*`):SMA/RSI/动量策略回测 + +--- + +## 三、混合架构设计 + +### 核心思路 + +**并行的地方用 `sessions_spawn`,需要对话的地方用 `sessions_send`。** + +### 架构图 + +``` +┌─────────────────────────────────────────────┐ +│ Orchestrator Agent (Judge/PM) │ +│ Model: Claude Opus (深度推理) │ +│ SOUL.md: 客观裁判,综合决策 │ +├─────────────────────────────────────────────┤ +│ │ +│ Phase 1: 数据收集 (sessions_spawn 并行) │ +│ ┌───────────┐ ┌─────────────┐ │ +│ │ Market │ │ Fundamen- │ │ +│ │ Analyst │ │ tals │ │ +│ │ (Sonnet) │ │ (Sonnet) │ │ +│ └───────────┘ └─────────────┘ │ +│ ┌───────────┐ ┌─────────────┐ │ +│ │ Sentiment │ │ News │ │ +│ │ Analyst │ │ Analyst │ │ +│ │ (Haiku) │ │ (Haiku) │ │ +│ └───────────┘ └─────────────┘ │ +│ │ +│ Phase 2: 多空辩论 (sessions_send ping-pong) │ +│ ┌───────────┐ 3-5 轮 ┌───────────┐ │ +│ │ Bull │◄────────►│ Bear │ │ +│ │ Researcher│ │ Researcher│ │ +│ │ (Opus) │ │ (Opus) │ │ +│ └───────────┘ └───────────┘ │ +│ │ +│ Phase 3: 风控辩论 (sessions_send ping-pong) │ +│ ┌───────────┐ 2-3 轮 ┌───────────┐ │ +│ │ Aggressive│◄────────►│ Conserva- │ │ +│ │ (Sonnet) │ │ tive │ │ +│ └───────────┘ │ (Sonnet) │ │ +│ └───────────┘ │ +│ │ +│ Phase 4: Orchestrator 综合裁决 │ +│ → 输出 BUY/SELL/HOLD + 完整推理 │ +└─────────────────────────────────────────────┘ +``` + +### 为什么不用群聊辩论 + +OpenClaw 的 Multi-Agent Group Chat [尚未实现](https://github.com/openclaw/openclaw/issues/18869)(Issue #18869,PR 未合并)。即使实现了,`sessions_send` 方案也更优: + +| 维度 | 群聊辩论 | sessions_send 辩论 | +|------|---------|-------------------| +| 流程控制 | 混乱,谁先说不确定 | 结构化,轮次可控 | +| 循环风险 | 高(可能死循环) | 无(maxPingPongTurns 硬限制) | +| 上下文 | 所有人共享一个上下文窗口 | 每个 agent 独立上下文,更专注 | +| Token 成本 | N 个 agent × 完整群聊历史 | 仅辩论双方共享必要上下文 | +| 可观测性 | 难以追踪谁说了什么 | 完整的 session 记录 | +| 当前可用性 | ❌ 未实现 | ✅ 已可用 | + +### 学术依据 + +- [ICLR 2025 MAD 研究](https://d2jud02ci9yv69.cloudfront.net/2025-04-28-mad-159/blog/mad/):**异构 agent + 结构化拓扑**效果最好 +- [Adaptive HMAD](https://link.springer.com/article/10.1007/s44443-025-00353-3):异构辩论比同构辩论准确率高 4-6%,事实错误减少 30%+ +- 无结构多 agent 网络会**放大错误达 17.2 倍** + +--- + +## 四、OpenClaw 配置详情 + +### Agent Workspace 结构 + +``` +~/.openclaw/ +├── openclaw.json # 主配置 +├── workspace-orchestrator/ # 编排者 +│ ├── AGENTS.md +│ ├── SOUL.md # 客观裁判人格 +│ ├── MEMORY.md +│ ├── skills/ +│ │ └── trade-analyze/SKILL.md # 主入口 skill +│ └── memory/ +├── workspace-market-analyst/ # 技术分析师 +│ ├── SOUL.md # 专注技术指标 +│ └── skills/ +│ └── analyze/SKILL.md # 调用 /technical/* 端点 +├── workspace-fundamentals-analyst/ # 基本面分析师 +│ ├── SOUL.md +│ └── skills/ +│ └── analyze/SKILL.md # 调用 /metrics, /financials +├── workspace-sentiment-analyst/ # 情感分析师 +│ ├── SOUL.md +│ └── skills/ +│ └── analyze/SKILL.md # 调用 /sentiment, /insider-trades +├── workspace-news-analyst/ # 新闻分析师 +│ ├── SOUL.md +│ └── skills/ +│ └── analyze/SKILL.md # 调用 /macro/overview, /economy/* +├── workspace-bull/ # 多方研究员 +│ ├── SOUL.md # 坚定看多,寻找增长机会 +│ └── MEMORY.md # 历史成功案例 +├── workspace-bear/ # 空方研究员 +│ ├── SOUL.md # 谨慎看空,揭示风险 +│ └── MEMORY.md # 历史失败教训 +├── workspace-aggressive/ # 激进风控 +│ └── SOUL.md # 高风险高回报 +└── workspace-conservative/ # 保守风控 + └── SOUL.md # 资产保护优先 +``` + +### 核心配置(openclaw.json) + +```json5 +{ + agents: { + list: [ + { id: "orchestrator", workspace: "~/.openclaw/workspace-orchestrator" }, + { id: "market-analyst", workspace: "~/.openclaw/workspace-market-analyst" }, + { id: "fundamentals-analyst", workspace: "~/.openclaw/workspace-fundamentals-analyst" }, + { id: "sentiment-analyst", workspace: "~/.openclaw/workspace-sentiment-analyst" }, + { id: "news-analyst", workspace: "~/.openclaw/workspace-news-analyst" }, + { id: "bull", workspace: "~/.openclaw/workspace-bull" }, + { id: "bear", workspace: "~/.openclaw/workspace-bear" }, + { id: "aggressive", workspace: "~/.openclaw/workspace-aggressive" }, + { id: "conservative", workspace: "~/.openclaw/workspace-conservative" } + ] + }, + tools: { + agentToAgent: { + enabled: true, + allow: ["orchestrator", "bull", "bear", "aggressive", "conservative"] + } + }, + session: { + agentToAgent: { + maxPingPongTurns: 5 // Bull/Bear 辩论最多 5 轮 + } + } +} +``` + +### sessions_spawn vs sessions_send 用法 + +**Phase 1 — 并行数据收集(sessions_spawn):** + +Orchestrator 同时 spawn 4 个分析师: +``` +sessions_spawn → market-analyst (task: "分析 NVDA 技术面") +sessions_spawn → fundamentals-analyst (task: "分析 NVDA 基本面") +sessions_spawn → sentiment-analyst (task: "分析 NVDA 市场情绪") +sessions_spawn → news-analyst (task: "分析 NVDA 宏观环境") +``` + +每个 spawn 独立执行,完成后 announce 结果回 Orchestrator。 + +**Phase 2 — 多空辩论(sessions_send ping-pong):** + +``` +Orchestrator ──sessions_send(报告摘要)──► Bull Agent +Bull Agent 回复 bull case + ──自动 ping-pong──► Bear Agent 反驳 + ──ping-pong──► Bull 再反驳 + ...(最多 5 轮,或 agent 回复 REPLY_SKIP 结束) +Orchestrator 收到完整辩论记录(announce step) +``` + +**Phase 3 — 风控辩论(sessions_send ping-pong):** + +同理,Aggressive ⇄ Conservative 2-3 轮。 + +**Phase 4 — 最终裁决:** + +Orchestrator 综合所有报告 + 辩论记录,输出 BUY/SELL/HOLD。 + +--- + +## 五、实现路线图 + +### Phase 1:基础设施(1-2 天) + +- [ ] 确保 openbb-invest-api 在 localhost:8000 运行 +- [ ] 安装 OpenClaw,`openclaw onboard` +- [ ] 创建 9 个 agent workspace +- [ ] 编写各 agent 的 SOUL.md(人格定义) + +### Phase 2:4 个分析师 Skills(2-3 天) + +- [ ] market-analyst skill:调用 `/technical/composite`, `/historical` +- [ ] fundamentals-analyst skill:调用 `/metrics`, `/financials` +- [ ] sentiment-analyst skill:调用 `/sentiment`, `/insider-trades`, `/reddit/trending` +- [ ] news-analyst skill:调用 `/macro/overview`, `/economy/*`, `/fixed-income/yield-curve` +- [ ] 每个 skill 用 `exec` 调用 curl 或封装 Python 脚本 + +### Phase 3:辩论 + 风控(1-2 天) + +- [ ] 配置 `agentToAgent.enabled: true` +- [ ] 测试 Bull ⇄ Bear `sessions_send` ping-pong +- [ ] 测试 Aggressive ⇄ Conservative ping-pong +- [ ] Orchestrator 的 trade-analyze skill 编排完整流程 + +### Phase 4:记忆 + 复盘(1 天) + +- [ ] 利用 OpenClaw 内建 memory 系统 +- [ ] 每次决策存入 `memory/YYYY-MM-DD.md` +- [ ] 用 `memory_search` 在辩论时检索相似历史 +- [ ] 实现 reflect 机制:对比实际收益,更新记忆 + +### Phase 5:通道对接 + 优化(1 天) + +- [ ] 绑定 Telegram/WhatsApp,直接聊天触发分析 +- [ ] 优化 prompt(减少 token 消耗) +- [ ] 添加 openbb-invest-api 独有数据源(做空、期权、DeFi) + +--- + +## 六、与 TradingAgents 的差异对比 + +| 维度 | TradingAgents (LangGraph) | OpenClaw 混合架构 | +|------|---|---| +| 编排 | 显式状态机,条件路由 | sessions_spawn + sessions_send | +| 并行 | 4 分析师真并行 | sessions_spawn 并行 | +| 辩论 | 多轮循环,独立 LLM 调用 | ping-pong 机制,最多 5 轮 | +| 记忆 | 自建 BM25 | OpenClaw 内建(BM25 + 向量 + 时间衰减) | +| 数据 | yfinance 直调 | openbb-invest-api(133+ 端点) | +| 交互 | 纯 CLI/API | WhatsApp/Telegram/Discord 直接对话 | +| 部署 | 需要自托管 | OpenClaw 本地运行,开箱即用 | + +--- + +## Related + +- [[openbb-invest-api]] +- [[OpenClaw]] diff --git a/2 - Projects/Trading-Agents/TradingAgents 原始架构分析.md b/2 - Projects/Trading-Agents/TradingAgents 原始架构分析.md new file mode 100644 index 0000000..b3dc6ac --- /dev/null +++ b/2 - Projects/Trading-Agents/TradingAgents 原始架构分析.md @@ -0,0 +1,179 @@ +--- +created: "2026-03-21" +type: resource +tags: [trading, multi-agent, langgraph, architecture, reference] +source: "https://github.com/TauricResearch/TradingAgents" +--- + +# TradingAgents 原始架构分析 + +## 概述 + +[TradingAgents](https://github.com/TauricResearch/TradingAgents) 是一个基于 LangGraph 的多角色 LLM 交易决策框架,模拟真实交易公司的协作流程:分析师团队 → 多空辩论 → 交易决策 → 风控辩论 → 最终裁决。 + +--- + +## 核心文件结构 + +| 文件 | 职责 | +|------|------| +| `tradingagents/graph/trading_graph.py` | 主入口,编排整个系统 | +| `tradingagents/graph/setup.py` | 构建 LangGraph 状态机 | +| `tradingagents/graph/conditional_logic.py` | 条件路由(工具调用 / 辩论轮次) | +| `tradingagents/agents/analysts/*.py` | 4 个分析师(市场/社媒/新闻/基本面) | +| `tradingagents/agents/researchers/*.py` | Bull/Bear 研究员 + Research Manager | +| `tradingagents/agents/risk_mgmt/*.py` | 激进/保守/中性风控辩论者 | +| `tradingagents/agents/trader/trader.py` | 交易员 | +| `tradingagents/agents/utils/agent_states.py` | TypedDict 状态定义 | +| `tradingagents/agents/utils/memory.py` | BM25 记忆系统 | +| `tradingagents/dataflows/interface.py` | 数据供应商路由 + 降级策略 | +| `tradingagents/dataflows/y_finance.py` | yfinance 数据实现 | +| `tradingagents/graph/reflection.py` | 交易后复盘,更新记忆 | +| `tradingagents/graph/signal_processing.py` | 从冗长输出提取 BUY/SELL/HOLD | + +--- + +## 分析师团队(并行执行) + +### Market Analyst +- 技术分析:SMA, EMA, MACD, RSI, Bollinger Bands, ATR, VWMA +- 工具:`get_stock_data`, `get_indicators` +- 数据源:yfinance + stockstats + +### Social Media Analyst +- 公司新闻 + 情感分析 +- 工具:`get_news` + +### News Analyst +- 宏观经济 + 世界大事 +- 工具:`get_news`, `get_global_news` + +### Fundamentals Analyst +- 财务报表 + 公司指标 +- 工具:`get_fundamentals`, `get_balance_sheet`, `get_cashflow`, `get_income_statement` + +--- + +## 辩论机制 + +### 投资辩论(Bull vs Bear) + +1. Bull Researcher 阅读所有报告 + 检索历史相似情况 → 提出看多论点 +2. Bear Researcher 阅读报告 + 历史 → 反驳 +3. 循环 `max_debate_rounds` 轮(默认 1 轮) +4. Research Manager(裁判)读完整辩论历史 + 过去的裁决记忆 → 输出投资方案 + +### 风控辩论(三方) + +1. Aggressive Analyst:高风险高回报 +2. Conservative Analyst:稳健保守 +3. Neutral Analyst:平衡两方 +4. 循环 `max_risk_discuss_rounds` 轮(默认 1 轮 × 3 人 = 3 turns) +5. Risk Manager(裁判)修正交易方案 → 最终决策 + +### 辩论路由逻辑 + +```python +# conditional_logic.py +def should_continue_debate(state): + # 辩论历史长度 >= max_debate_rounds * 2 → 结束 + # 否则交替 Bull → Bear → Bull → Bear + +def should_continue_risk_analysis(state): + # 长度 >= max_risk_discuss_rounds * 3 → 结束 + # 循环 Aggressive → Conservative → Neutral +``` + +--- + +## BM25 记忆系统 + +### 结构 + +```python +class FinancialSituationMemory: + # 存储: (market_situation_description, recommendation) 元组列表 + # 检索: BM25 相似度,取 top-n 最相似历史情况 + # 无需 API,完全离线 +``` + +### 5 个独立记忆库 + +1. Bull Researcher Memory +2. Bear Researcher Memory +3. Research Manager Memory +4. Trader Memory +5. Risk Manager Memory + +### 复盘机制 + +```python +# reflection.py +class Reflector: + def reflect_and_remember(self, returns_losses): + # 分析交易结果(盈亏) + # 生成教训总结 + # 更新各角色的记忆库 +``` + +--- + +## LangGraph 状态定义 + +```python +class AgentState(TypedDict): + company_of_interest: str # 股票代码 + trade_date: str # 交易日期 + market_report: str # 市场分析报告 + sentiment_report: str # 情感分析报告 + news_report: str # 新闻分析报告 + fundamentals_report: str # 基本面报告 + invest_debate_state: dict # 多空辩论状态 + risk_debate_state: dict # 风控辩论状态 + final_trade_decision: str # 最终决策 +``` + +--- + +## 数据供应商抽象层 + +```python +# interface.py - 供应商路由 +def route_to_vendor(tool_name, category, params): + vendor = config["data_vendors"].get(category, "yfinance") + try: + return vendors[vendor][tool_name](params) + except RateLimit: + return vendors["yfinance"][tool_name](params) # 降级 +``` + +支持的供应商: +- yfinance(默认,免费) +- Alpha Vantage(需 API key) +- 按 category 级别配置,支持 tool 级别覆盖 + +--- + +## 调用方式 + +```python +ta = TradingAgentsGraph(config={ + "llm_provider": "openai", + "deep_think_llm": "gpt-5.2", + "quick_think_llm": "gpt-5-mini", + "max_debate_rounds": 1, + "max_risk_discuss_rounds": 1, +}) +final_state, decision = ta.propagate("NVDA", "2024-05-10") +# decision = "BUY" | "SELL" | "HOLD" + +# 复盘 +ta.reflect_and_remember(returns_losses=1500) +``` + +--- + +## Related + +- [[Trading Agents 混合架构方案]] +- [[openbb-invest-api]]