TradingAgents/tradingagents/agents/risk_mgmt/aggresive_debator.py

127 lines
5.6 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
def create_risky_debator(llm):
"""
建立一個激進的風險辯論員節點。
這個節點在風險評估辯論中扮演激進派的角色。
其目標是積極倡導高回報、高風險的機會,強調大膽的策略和競爭優勢。
它會專注於潛在的上升空間,並挑戰保守和中立的觀點。
Args:
llm: 用於生成回應的語言模型。
Returns:
function: 一個代表激進辯論員節點的函式,可在 langgraph 中使用。
"""
def risky_node(state) -> dict:
"""
激進辯論員節點的執行函式。
Args:
state (dict): 當前的圖狀態。
Returns:
dict: 更新後的狀態,包含新的風險辯論狀態。
"""
# 從狀態中獲取風險辯論的相關資訊
risk_debate_state = state["risk_debate_state"]
history = risk_debate_state.get("history", "")
risky_history = risk_debate_state.get("risky_history", "")
# 獲取其他辯論者的最新回應
current_safe_response = risk_debate_state.get("current_safe_response", "")
current_neutral_response = risk_debate_state.get("current_neutral_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"]
# 定義文本截斷函數以避免超過 token 限制
def truncate_text(text, max_chars):
"""截斷文本到指定字符數"""
if len(text) <= max_chars:
return text
return text[:max_chars] + "\n...(內容已截斷)"
# 截斷各類輸入以控制 token 使用量
# 模型限制: 8192 tokens目標: < 3500 字符
market_research_report = truncate_text(market_research_report, 500)
sentiment_report = truncate_text(sentiment_report, 500)
news_report = truncate_text(news_report, 600)
fundamentals_report = truncate_text(fundamentals_report, 600)
trader_decision = truncate_text(trader_decision, 800)
history = truncate_text(history, 400)
current_safe_response = truncate_text(current_safe_response, 300)
current_neutral_response = truncate_text(current_neutral_response, 300)
# 建立提示 (prompt)
prompt = f"""**重要您必須使用繁體中文Traditional Chinese回覆所有內容。請勿使用英文、簡體中文或其他語言。**
【專業身份】
您是一位高收益投資策略專家專長於Alpha generation與積極成長投資
• CFA + 高收益債券與成長股投資專業認證
• 15年對沖基金積極策略經驗
• 專注於高風險高報酬投資機會
• 擅長識別被低估的成長潛力與催化劑
• 追求超額報酬,願意承擔適度風險
【投資哲學】
• **進取為先**:優先考慮上檔空間而非下檔保護
• **機會導向**:聚焦於潛在報酬,管理好風險即可
• **催化劑驅動**:尋找能帶來超額報酬的關鍵事件
• **逆向思維**:在市場悲觀時發現價值
【論證重點】
1. 強調上檔潛力:量化最佳情境的報酬空間
2. 催化劑識別:近期可能推動股價的正面事件
3. 成長加速:營收/盈利成長提速的跡象
4. 估值折扣:相對內在價值的折價幅度
5. 反駁過度保守:指出保守觀點忽略的機會
交易員計畫:
{trader_decision}
請提出積極進取的投資論證,強調高報酬機會!為交易員的決策建立一個令人信服的案例,以證明您的高回報視角為何能提供最佳的前進道路。將以下來源的見解融入您的論點中:
市場研究報告:{market_research_report}
社群媒體情緒報告:{sentiment_report}
最新世界事務報告:{news_report}
公司基本面報告:{fundamentals_report}
這是當前的對話歷史:{history} 這是保守分析師的最新論點:{current_safe_response} 這是中立分析師的最新論點:{current_neutral_response}。如果其他觀點沒有回應,請不要憑空捏造,只需陳述您的觀點。
積極參與,解決提出的任何具體問題,反駁他們邏輯上的弱點,並主張冒險的好處以超越市場常規。保持專注於辯論和說服,而不僅僅是呈現數據。挑戰每一個反駁觀點,以強調為何高風險方法是最佳選擇。請以對話方式輸出,就像您在說話一樣,不帶任何特殊格式。"""
# 呼叫 LLM 生成回應
response = llm.invoke(prompt)
# 格式化論點
argument = f"激進分析師:{response.content}"
# 更新風險辯論狀態
new_risk_debate_state = {
"history": history + "\n" + argument,
"risky_history": risky_history + "\n" + argument,
"safe_history": risk_debate_state.get("safe_history", ""),
"neutral_history": risk_debate_state.get("neutral_history", ""),
"latest_speaker": "Risky", # 記錄最新的發言者
"current_risky_response": argument,
"current_safe_response": risk_debate_state.get("current_safe_response", ""),
"current_neutral_response": risk_debate_state.get(
"current_neutral_response", ""
),
"count": risk_debate_state["count"] + 1,
}
return {"risk_debate_state": new_risk_debate_state}
return risky_node