Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -69,12 +69,13 @@ except Exception as e:
|
|
| 69 |
|
| 70 |
|
| 71 |
# ---------------------- 2. 定义交易决策函数 ----------------------
|
|
|
|
| 72 |
def generate_trading_decision(ticker, analysis_date, progress=gr.Progress()):
|
| 73 |
-
"""核心函数:生成交易决策,
|
| 74 |
logger.info(f"收到分析请求 - 股票代码: {ticker}, 分析日期: {analysis_date}")
|
| 75 |
|
| 76 |
try:
|
| 77 |
-
# 1. 验证输入
|
| 78 |
if not ticker.strip():
|
| 79 |
error_msg = "错误:股票代码不能为空!请输入如 AAPL、SPY 的代码。"
|
| 80 |
logger.warning(error_msg)
|
|
@@ -85,7 +86,6 @@ def generate_trading_decision(ticker, analysis_date, progress=gr.Progress()):
|
|
| 85 |
logger.warning(error_msg)
|
| 86 |
return error_msg
|
| 87 |
|
| 88 |
-
# 验证日期格式
|
| 89 |
try:
|
| 90 |
time.strptime(analysis_date.strip(), "%Y-%m-%d")
|
| 91 |
except ValueError:
|
|
@@ -97,35 +97,64 @@ def generate_trading_decision(ticker, analysis_date, progress=gr.Progress()):
|
|
| 97 |
|
| 98 |
# 2. 显示进度
|
| 99 |
progress(0, desc="开始初始化分析...")
|
| 100 |
-
logger.info("分析流程启动")
|
| 101 |
time.sleep(1)
|
| 102 |
|
| 103 |
progress(0.2, desc=f"获取 {ticker} 的金融数据(FinnHub)...")
|
| 104 |
-
logger.info(f"正在获取 {ticker} 的金融数据")
|
| 105 |
time.sleep(2)
|
| 106 |
|
| 107 |
progress(0.5, desc="分析师团队分析(财务+情绪+技术指标)...")
|
| 108 |
-
logger.info("分析师团队开始分析(财务+情绪+技术指标)")
|
| 109 |
time.sleep(3)
|
| 110 |
|
| 111 |
progress(0.8, desc="研究团队辩论+交易员决策+风险管理评估...")
|
| 112 |
-
logger.info("进入研究团队辩论和风险管理评估阶段")
|
| 113 |
|
| 114 |
-
# 3. 调用框架核心方法
|
| 115 |
logger.info(f"调用 propagate 方法 - company_name={ticker.strip()}, trade_date={analysis_date.strip()}")
|
| 116 |
start_time = time.time()
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 121 |
end_time = time.time()
|
| 122 |
logger.info(f"分析完成,耗时 {end_time - start_time:.2f} 秒")
|
| 123 |
|
| 124 |
-
# 4. 添加免责声明
|
| 125 |
-
disclaimer = "\n\n【免责声明】本结果仅用于研究目的,不构成任何财务、投资或交易建议。交易风险自负。"
|
| 126 |
-
final_result = f"# {ticker} 交易决策报告(分析日期:{analysis_date})\n\n{decision}{disclaimer}"
|
| 127 |
-
logger.info(f"生成 {ticker} 的交易决策报告完成")
|
| 128 |
-
|
| 129 |
progress(1.0, desc="分析完成!")
|
| 130 |
return final_result
|
| 131 |
|
|
@@ -141,6 +170,7 @@ def generate_trading_decision(ticker, analysis_date, progress=gr.Progress()):
|
|
| 141 |
return error_msg
|
| 142 |
|
| 143 |
|
|
|
|
| 144 |
# ---------------------- 3. 构建 Gradio 界面 ----------------------
|
| 145 |
logger.info("开始构建 Gradio 界面...")
|
| 146 |
with gr.Blocks(title="TradingAgents 金融交易决策工具") as demo:
|
|
|
|
| 69 |
|
| 70 |
|
| 71 |
# ---------------------- 2. 定义交易决策函数 ----------------------
|
| 72 |
+
|
| 73 |
def generate_trading_decision(ticker, analysis_date, progress=gr.Progress()):
|
| 74 |
+
"""核心函数:生成交易决策,显示中间分析过程"""
|
| 75 |
logger.info(f"收到分析请求 - 股票代码: {ticker}, 分析日期: {analysis_date}")
|
| 76 |
|
| 77 |
try:
|
| 78 |
+
# 1. 验证输入(与之前逻辑一致)
|
| 79 |
if not ticker.strip():
|
| 80 |
error_msg = "错误:股票代码不能为空!请输入如 AAPL、SPY 的代码。"
|
| 81 |
logger.warning(error_msg)
|
|
|
|
| 86 |
logger.warning(error_msg)
|
| 87 |
return error_msg
|
| 88 |
|
|
|
|
| 89 |
try:
|
| 90 |
time.strptime(analysis_date.strip(), "%Y-%m-%d")
|
| 91 |
except ValueError:
|
|
|
|
| 97 |
|
| 98 |
# 2. 显示进度
|
| 99 |
progress(0, desc="开始初始化分析...")
|
|
|
|
| 100 |
time.sleep(1)
|
| 101 |
|
| 102 |
progress(0.2, desc=f"获取 {ticker} 的金融数据(FinnHub)...")
|
|
|
|
| 103 |
time.sleep(2)
|
| 104 |
|
| 105 |
progress(0.5, desc="分析师团队分析(财务+情绪+技术指标)...")
|
|
|
|
| 106 |
time.sleep(3)
|
| 107 |
|
| 108 |
progress(0.8, desc="研究团队辩论+交易员决策+风险管理评估...")
|
|
|
|
| 109 |
|
| 110 |
+
# 3. 调用框架核心方法,捕获中间结果
|
| 111 |
logger.info(f"调用 propagate 方法 - company_name={ticker.strip()}, trade_date={analysis_date.strip()}")
|
| 112 |
start_time = time.time()
|
| 113 |
+
|
| 114 |
+
# ---- 关键修改:调试模式下捕获流式中间结果 ----
|
| 115 |
+
all_outputs = [] # 存储所有中间输出
|
| 116 |
+
final_state = None
|
| 117 |
+
processed_signal = None
|
| 118 |
+
|
| 119 |
+
# 若处于调试模式(debug=True),使用 stream 获取中间结果
|
| 120 |
+
if ta.debug:
|
| 121 |
+
# 获取 graph.invoke 所需的参数
|
| 122 |
+
args = ta.propagator.get_graph_args()
|
| 123 |
+
init_state = ta.propagator.create_initial_state(ticker.strip(), analysis_date.strip())
|
| 124 |
+
|
| 125 |
+
# 遍历流式结果
|
| 126 |
+
for i, chunk in enumerate(ta.graph.stream(init_state, **args)):
|
| 127 |
+
# 提取并格式化中间消息
|
| 128 |
+
if chunk.get("messages") and len(chunk["messages"]) > 0:
|
| 129 |
+
msg = chunk["messages"][-1].content # 假设消息内容在 .content 中
|
| 130 |
+
all_outputs.append(f"## 中间步骤 {i+1}\n{msg}\n\n")
|
| 131 |
+
logger.info(f"中间结果 {i+1}: {msg[:50]}...") # 日志简略显示
|
| 132 |
+
|
| 133 |
+
# 模拟进度(根据实际步骤数调整,这里简化)
|
| 134 |
+
progress(0.8 + 0.2 * i / 10, desc=f"处理中间步骤 {i+1}/10")
|
| 135 |
+
|
| 136 |
+
# 流式结束后,最终状态为最后一个 chunk
|
| 137 |
+
final_state = chunk
|
| 138 |
+
else:
|
| 139 |
+
# 非调试模式,直接调用(无中间结果)
|
| 140 |
+
final_state, processed_signal = ta.propagate(
|
| 141 |
+
company_name=ticker.strip(),
|
| 142 |
+
trade_date=analysis_date.strip()
|
| 143 |
+
)
|
| 144 |
+
all_outputs.append("(非调试模式,无中间步骤显示)\n\n")
|
| 145 |
+
|
| 146 |
+
# 处理最终结果
|
| 147 |
+
if final_state:
|
| 148 |
+
decision = final_state.get("final_trade_decision", "未获取到最终交易决策")
|
| 149 |
+
all_outputs.append(f"# 最终交易决策\n{decision}\n\n")
|
| 150 |
+
|
| 151 |
+
# 添加免责声明
|
| 152 |
+
disclaimer = "\n\n【免责声明】本结果仅用于研究目的,不构成任何财务、投资或交易建议。交易风险自负。"
|
| 153 |
+
final_result = f"# {ticker} 交易决策报告(分析日期:{analysis_date})\n\n" + "".join(all_outputs) + disclaimer
|
| 154 |
+
|
| 155 |
end_time = time.time()
|
| 156 |
logger.info(f"分析完成,耗时 {end_time - start_time:.2f} 秒")
|
| 157 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 158 |
progress(1.0, desc="分析完成!")
|
| 159 |
return final_result
|
| 160 |
|
|
|
|
| 170 |
return error_msg
|
| 171 |
|
| 172 |
|
| 173 |
+
|
| 174 |
# ---------------------- 3. 构建 Gradio 界面 ----------------------
|
| 175 |
logger.info("开始构建 Gradio 界面...")
|
| 176 |
with gr.Blocks(title="TradingAgents 金融交易决策工具") as demo:
|