119 lines
3.8 KiB
Python
119 lines
3.8 KiB
Python
"""
|
||
美股分析技能
|
||
"""
|
||
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):
|
||
"""美股分析技能"""
|
||
|
||
def __init__(self):
|
||
super().__init__()
|
||
self.name = "us_stock_analysis"
|
||
self.description = "分析美股(如 AAPL, TSLA, MSFT 等),获取实时行情、技术指标、基本面数据"
|
||
self.parameters = [
|
||
SkillParameter(
|
||
name="symbol",
|
||
type="string",
|
||
description="美股代码(如 AAPL, TSLA, MSFT)",
|
||
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()
|