stock-ai-agent/backend/app/skills/us_stock_skill.py
2026-02-05 18:23:22 +08:00

119 lines
3.8 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.

"""
美股/港股分析技能
"""
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()