TradingAgents/tradingagents/agents/risk_mgmt/neutral_debator.py

123 lines
5.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf-8 -*-
import time
import json
from tradingagents.agents.utils.output_filter import fix_common_llm_errors, validate_and_warn
def create_neutral_debator(llm):
"""
建立一個中立的風險辯論員節點。
這個節點在風險評估辯論中扮演中立派的角色。
其目標是提供一個平衡的視角,權衡交易員決策的潛在利益和風險。
它會挑戰過於樂觀或過於謹慎的觀點,並倡導一個溫和、可持續的策略。
Args:
llm: 用於生成回應的語言模型。
Returns:
function: 一個代表中立辯論員節點的函式,可在 langgraph 中使用。
"""
def neutral_node(state) -> dict:
"""
中立辯論員節點的執行函式。
Args:
state (dict): 當前的圖狀態。
Returns:
dict: 更新後的狀態,包含新的風險辯論狀態。
"""
# 從狀態中獲取風險辯論的相關資訊
risk_debate_state = state["risk_debate_state"]
history = risk_debate_state.get("history", "")
neutral_history = risk_debate_state.get("neutral_history", "")
# 獲取其他辯論者的最新回應
current_risky_response = risk_debate_state.get("current_risky_response", "")
current_safe_response = risk_debate_state.get("current_safe_response", "")
# 從狀態中獲取各類分析報告
market_research_report = state["market_report"]
sentiment_report = state["sentiment_report"]
news_report = state["news_report"]
fundamentals_report = state["fundamentals_report"]
# 獲取交易員的決策
trader_decision = state["trader_investment_plan"]
# 移除截斷邏輯以保留完整報告內容
# 建立提示 (prompt)
prompt = f"""**重要您必須使用繁體中文Traditional Chinese回覆所有內容。**
**嚴格禁止:請勿在回覆中使用任何 emoji 表情符號(如 ✅ ❌ 📊 📈 🚀 等)。**
**請只使用純文字、數字、標點符號和必要的 Unicode 符號(如 ↑ ↓ ★ ●等)。**
【專業身份】
您是平衡型風險策略師,客觀評估風險與報酬,提供折衷方案。**您必須保持嚴格中立觀點,公正評估積極與保守雙方論點,找出雙方的合理性與盲點。**
【論證重點】
1. **平衡視角**:客觀權衡上檔機會與下檔風險,不偏不倚
2. **情境分析**:評估不同市場情境下的策略適用性,提供多種可能
3. **風險調整**:建議部位規模與風險對沖措施,平衡風險與報酬
4. **整合觀點****公正評估積極與保守派的論點,綜合雙方合理之處,指出雙方盲點**
5. **折衷方案**:提供兼顧機會與風控的平衡策略
【可用資訊】
- 交易員計畫:{trader_decision}
- 各類報告:{market_research_report}, {sentiment_report}, {news_report}, {fundamentals_report}
- 辯論歷史:{history}
- 對手觀點:{current_risky_response}, {current_safe_response}
【輸出要求】
**字數要求****800-1500字**
**嚴格遵守字數限制少於800字或超過1500字的報告將被退回**
**內容結構**
1. 核心觀點150字以上清晰陳述平衡策略的理由與價值
2. 風險報酬評估450-500字客觀分析損益比綜合評估雙方論點
3. 評論雙方100字以上**公正指出積極與保守派的合理與盲點,不偏袒任何一方**
4. 操作建議100字以上具體的折衷方案兼顧機會與風控
**撰寫原則**
- **嚴格中立**:不偏向任何一方,客觀分析雙方論點
- **公正評估**:找出積極派的合理性與盲點、保守派的合理性與盲點
- 客觀中立,避免偏頗,但不迴避指出雙方問題
- 提供可執行的平衡策略,兼顧風險與報酬
- 強調風險管理與機會把握的平衡
**結尾提示**
請在報告最後加上以下結尾:
「---
※ 本報告為平衡型風險策略分析,立場客觀中立。建議綜合三方觀點(積極、保守、平衡)後做出決策。投資需平衡風險與報酬,請謹慎評估。」
請提供專業且客觀的平衡策略分析。"""
# 呼叫 LLM 生成回應
response = llm.invoke(prompt)
# CRITICAL FIX: Apply output filtering
response.content = fix_common_llm_errors(response.content)
validate_and_warn(response.content, "Neutral_Debator")
# 格式化論點
argument = f"中立分析師:{response.content}"
# 更新風險辯論狀態
new_risk_debate_state = {
"history": history + "\n" + argument,
"risky_history": risk_debate_state.get("risky_history", ""),
"safe_history": risk_debate_state.get("safe_history", ""),
"neutral_history": neutral_history + "\n" + argument,
"latest_speaker": "Neutral", # 記錄最新的發言者
"current_risky_response": risk_debate_state.get(
"current_risky_response", ""
),
"current_safe_response": risk_debate_state.get("current_safe_response", ""),
"current_neutral_response": argument,
"count": risk_debate_state["count"] + 1,
}
return {"risk_debate_state": new_risk_debate_state}
return neutral_node