8.9 KiB
8.9 KiB
TradingAgents 输入输出检查指南
📍 快速定位
1. 状态定义位置 (输入/输出的数据结构)
文件: tradingagents/agents/utils/agent_states.py
这是所有输入输出的数据结构定义,包含三个阶段的所有字段:
class AgentState:
# 输入
company_of_interest: str # 公司名称
trade_date: str # 交易日期
messages: List[Message] # 消息历史
# 阶段1输出: 分析师报告
market_report: str # 市场分析师报告
sentiment_report: str # 社交媒体分析师报告
news_report: str # 新闻分析师报告
fundamentals_report: str # 基本面分析师报告
# 阶段2输出: 投资辩论
investment_debate_state: InvestDebateState # 包含 bull_history, bear_history, judge_decision
investment_plan: str # 研究经理的投资计划
trader_investment_plan: str # 交易员的投资计划
# 阶段3输出: 风险分析
risk_debate_state: RiskDebateState # 包含 risky/safe/neutral 历史
final_trade_decision: str # 最终交易决策
🔍 各阶段输入输出检查位置
阶段 1: 分析师阶段 (Analyst Phase)
输入检查:
- 初始状态:
tradingagents/graph/propagation.py第 18-42 行init_state = { "company_of_interest": company_name, "trade_date": trade_date, "market_report": "", # 初始为空 "sentiment_report": "", # 初始为空 "news_report": "", # 初始为空 "fundamentals_report": "", # 初始为空 ... }
输出检查:
-
运行时 (Debug模式):
tradingagents/graph/trading_graph.py第 171-179 行for chunk in self.graph.stream(init_agent_state, **args): # chunk 包含每个节点的输出 if "market_report" in chunk: print(chunk["market_report"]) -
最终状态:
tradingagents/graph/trading_graph.py第 184 行final_state = self.graph.invoke(init_agent_state, **args) # 访问各报告: final_state["market_report"] final_state["sentiment_report"] final_state["news_report"] final_state["fundamentals_report"] -
日志文件:
tradingagents/graph/trading_graph.py第 195-225 行- 保存位置:
eval_results/{ticker}/TradingAgentsStrategy_logs/full_states_log_{date}.json - 包含所有报告字段
- 保存位置:
-
Agent实现: 查看各分析师如何写入报告
- Market:
tradingagents/agents/analysts/market_analyst.py第 80-83 行 - Social:
tradingagents/agents/analysts/social_media_analyst.py - News:
tradingagents/agents/analysts/news_analyst.py - Fundamentals:
tradingagents/agents/analysts/fundamentals_analyst.py
- Market:
阶段 2: 研究辩论阶段 (Research Debate Phase)
输入检查:
- 从阶段1接收:
final_state["market_report"],final_state["sentiment_report"], etc. - 初始辩论状态:
tradingagents/graph/propagation.py第 26-28 行"investment_debate_state": { "history": "", "current_response": "", "count": 0 }
输出检查:
-
运行时: 在
graph.stream()的 chunk 中检查if "investment_debate_state" in chunk: debate_state = chunk["investment_debate_state"] print(f"Bull history: {debate_state['bull_history']}") print(f"Bear history: {debate_state['bear_history']}") print(f"Judge decision: {debate_state['judge_decision']}") -
最终状态:
final_state["investment_debate_state"]["bull_history"] final_state["investment_debate_state"]["bear_history"] final_state["investment_debate_state"]["judge_decision"] final_state["investment_plan"] # Research Manager 的输出 final_state["trader_investment_plan"] # Trader 的输出 -
日志文件:
tradingagents/graph/trading_graph.py第 204-214 行{ "investment_debate_state": { "bull_history": "...", "bear_history": "...", "history": "...", "current_response": "...", "judge_decision": "..." }, "trader_investment_decision": "..." } -
Agent实现:
- Bull Researcher:
tradingagents/agents/researchers/bull_researcher.py - Bear Researcher:
tradingagents/agents/researchers/bear_researcher.py - Research Manager:
tradingagents/agents/managers/research_manager.py - Trader:
tradingagents/agents/trader/trader.py
- Bull Researcher:
阶段 3: 风险分析阶段 (Risk Analysis Phase)
输入检查:
- 从阶段2接收:
final_state["trader_investment_plan"] - 初始风险状态:
tradingagents/graph/propagation.py第 29-37 行"risk_debate_state": { "history": "", "current_risky_response": "", "current_safe_response": "", "current_neutral_response": "", "count": 0 }
输出检查:
-
运行时: 在
graph.stream()的 chunk 中检查if "risk_debate_state" in chunk: risk_state = chunk["risk_debate_state"] print(f"Risky history: {risk_state['risky_history']}") print(f"Safe history: {risk_state['safe_history']}") print(f"Neutral history: {risk_state['neutral_history']}") print(f"Judge decision: {risk_state['judge_decision']}") -
最终状态:
final_state["risk_debate_state"]["risky_history"] final_state["risk_debate_state"]["safe_history"] final_state["risk_debate_state"]["neutral_history"] final_state["risk_debate_state"]["judge_decision"] final_state["final_trade_decision"] # 最终交易决策 -
日志文件:
tradingagents/graph/trading_graph.py第 216-222 行{ "risk_debate_state": { "risky_history": "...", "safe_history": "...", "neutral_history": "...", "history": "...", "judge_decision": "..." }, "final_trade_decision": "..." } -
Agent实现:
- Risky Analyst:
tradingagents/agents/risk_mgmt/aggresive_debator.py - Safe Analyst:
tradingagents/agents/risk_mgmt/conservative_debator.py - Neutral Analyst:
tradingagents/agents/risk_mgmt/neutral_debator.py - Risk Manager:
tradingagents/agents/managers/risk_manager.py
- Risky Analyst:
🛠️ 实际使用示例
方法 1: 在代码中检查 (推荐用于调试)
from tradingagents.graph.trading_graph import TradingAgentsGraph
from tradingagents.default_config import DEFAULT_CONFIG
ta = TradingAgentsGraph(debug=True, config=DEFAULT_CONFIG.copy())
# 运行分析
final_state, decision = ta.propagate("NVDA", "2024-05-10")
# 检查阶段1输出
print("=== 阶段1: 分析师报告 ===")
print(f"Market Report: {final_state['market_report']}")
print(f"Sentiment Report: {final_state['sentiment_report']}")
print(f"News Report: {final_state['news_report']}")
print(f"Fundamentals Report: {final_state['fundamentals_report']}")
# 检查阶段2输出
print("\n=== 阶段2: 投资辩论 ===")
debate = final_state['investment_debate_state']
print(f"Bull History: {debate['bull_history']}")
print(f"Bear History: {debate['bear_history']}")
print(f"Judge Decision: {debate['judge_decision']}")
print(f"Investment Plan: {final_state['investment_plan']}")
print(f"Trader Plan: {final_state['trader_investment_plan']}")
# 检查阶段3输出
print("\n=== 阶段3: 风险分析 ===")
risk = final_state['risk_debate_state']
print(f"Risky History: {risk['risky_history']}")
print(f"Safe History: {risk['safe_history']}")
print(f"Neutral History: {risk['neutral_history']}")
print(f"Risk Judge Decision: {risk['judge_decision']}")
print(f"Final Trade Decision: {final_state['final_trade_decision']}")
方法 2: 查看日志文件
运行后,检查 JSON 日志文件:
cat eval_results/NVDA/TradingAgentsStrategy_logs/full_states_log_2024-05-10.json
方法 3: 使用 Debug 模式实时查看
在 trading_graph.py 第 171-179 行,debug 模式会打印每个节点的输出:
for chunk in self.graph.stream(init_agent_state, **args):
if len(chunk["messages"]) == 0:
pass
else:
chunk["messages"][-1].pretty_print() # 打印消息
# 可以在这里检查 chunk 中的其他字段
方法 4: 使用 CLI 界面
运行 CLI 可以看到实时输出:
python -m cli.main
CLI 会显示每个阶段的进度和输出 (cli/main.py 第 888-923 行处理各阶段的输出显示)
📊 数据流总结
输入 → 阶段1 → 阶段2 → 阶段3 → 输出
↓ ↓ ↓
reports debate risk final_decision
- 输入:
propagation.py的create_initial_state() - 阶段1输出:
AgentState中的*_report字段 - 阶段2输出:
AgentState中的investment_debate_state和trader_investment_plan - 阶段3输出:
AgentState中的risk_debate_state和final_trade_decision - 最终日志:
eval_results/{ticker}/TradingAgentsStrategy_logs/full_states_log_{date}.json