stock-ai-agent/scripts/analyze_stock_simple.py
2026-02-19 21:20:20 +08:00

101 lines
2.9 KiB
Python

#!/usr/bin/env python3
"""
美股快速分析脚本(简化版)
用法:
cd backend && python3 ../scripts/analyze_stock_simple.py AAPL
cd backend && python3 ../scripts/analyze_stock_simple.py AAPL TSLA NVDA
"""
import sys
import os
import asyncio
# 添加项目路径
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'backend'))
from app.services.yfinance_service import get_yfinance_service
from app.crypto_agent.llm_signal_analyzer import LLMSignalAnalyzer
from app.utils.logger import logger
async def analyze(symbol: str):
"""分析单只股票"""
print(f"\n{'='*60}")
print(f"📊 分析 {symbol}")
print(f"{'='*60}")
try:
# 获取服务和数据
yf_service = get_yfinance_service()
llm = LLMSignalAnalyzer()
# 获取行情
ticker = yf_service.get_ticker(symbol)
if not ticker:
print(f"❌ 无法获取行情")
return
price = ticker['lastPrice']
change = ticker['priceChangePercent']
print(f"价格: ${price:,.2f} ({change:+.2f}%)")
# 获取K线数据
data = yf_service.get_multi_timeframe_data(symbol)
print(f"K线: {list(data.keys())}")
# LLM分析
print(f"\n🤖 LLM分析中...")
result = await llm.analyze(symbol, data, symbols=[symbol], position_info=None)
# 输出结果
summary = result.get('analysis_summary', '')
signals = result.get('signals', [])
print(f"\n状态: {summary}")
if signals:
print(f"\n🎯 发现 {len(signals)} 个信号:")
for sig in signals:
action = sig.get('action', 'wait')
grade = sig.get('grade', 'D')
conf = sig.get('confidence', 0)
action_text = {'buy': '🟢 做多', 'sell': '🔴 做空'}.get(action, action)
grade_icon = {'A': '⭐⭐⭐', 'B': '⭐⭐', 'C': ''}.get(grade, '')
print(f"\n {action_text} [{grade}{grade_icon}] {conf}%")
entry = sig.get('entry_price')
sl = sig.get('stop_loss')
tp = sig.get('take_profit')
if entry and sl and tp:
print(f" 入场: ${entry:,.2f}")
print(f" 止损: ${sl:,.2f}")
print(f" 止盈: ${tp:,.2f}")
reason = sig.get('reason', '')
if reason:
print(f" 理由: {reason[:100]}...")
else:
print(f"\n⏸️ 无交易信号")
except Exception as e:
print(f"❌ 错误: {e}")
async def main():
symbols = sys.argv[1:] if len(sys.argv) > 1 else ['AAPL']
print(f"🤖 美股快速分析")
print(f"股票: {', '.join(symbols)}")
for symbol in symbols:
await analyze(symbol.upper())
print(f"\n✅ 完成")
if __name__ == "__main__":
asyncio.run(main())