""" 美股/港股分析技能 """ from typing import Dict, Any from app.skills.base import BaseSkill, SkillParameter from app.services.us_stock_service import us_stock_service from app.utils.logger import logger class USStockSkill(BaseSkill): """美股/港股分析技能(使用 yfinance)""" def __init__(self): super().__init__() self.name = "us_stock_analysis" self.description = "分析美股(如 AAPL, TSLA)和港股(如 0700.HK, 9988.HK),获取实时行情、技术指标、基本面数据" self.parameters = [ SkillParameter( name="symbol", type="string", description="股票代码(美股如 AAPL, TSLA;港股如 0700.HK, 9988.HK)", required=True ), SkillParameter( name="analysis_type", type="string", description="分析类型:basic(基本信息)、technical(技术分析)、fundamental(基本面)、comprehensive(综合分析)", required=False, default="comprehensive" ) ] async def execute(self, **kwargs) -> Dict[str, Any]: """ 执行美股分析 Args: symbol: 美股代码 analysis_type: 分析类型 Returns: 分析结果字典 """ try: symbol = kwargs.get("symbol", "").upper() analysis_type = kwargs.get("analysis_type", "comprehensive") if not symbol: return { "success": False, "error": "请提供美股代码" } logger.info(f"开始分析股票: {symbol}, 类型: {analysis_type}") if analysis_type == "basic": # 基本信息 info = us_stock_service.get_stock_info(symbol) if not info: return { "success": False, "error": f"未找到股票 {symbol}" } return { "success": True, "data": info } elif analysis_type == "technical": # 技术分析 hist = us_stock_service.get_historical_data(symbol, period="6mo") if hist is None or hist.empty: return { "success": False, "error": "无法获取历史数据" } technical = us_stock_service.calculate_technical_indicators(hist) latest = hist.iloc[-1] return { "success": True, "data": { "symbol": symbol, "current_price": float(latest['Close']), "volume": int(latest['Volume']), "technical_indicators": technical } } elif analysis_type == "fundamental": # 基本面分析 financial = us_stock_service.get_financial_data(symbol) if not financial: return { "success": False, "error": "无法获取财务数据" } return { "success": True, "data": financial } else: # 综合分析(默认) result = us_stock_service.get_comprehensive_analysis(symbol) return result except Exception as e: logger.error(f"美股分析失败: {e}") return { "success": False, "error": str(e) } # 创建全局实例 us_stock_skill = USStockSkill()