|
|
| """
|
| 智能分析系统(股票) - 股票市场数据分析系统
|
| 开发者:熊猫大侠
|
| 版本:v2.1.0
|
| 许可证:MIT License
|
| """
|
|
|
| import os
|
| import openai
|
|
|
| class StockQA:
|
| def __init__(self, analyzer, openai_api_key=None, openai_model=None):
|
| self.analyzer = analyzer
|
| self.openai_api_key = os.getenv('OPENAI_API_KEY', os.getenv('OPENAI_API_KEY'))
|
| self.openai_api_url = os.getenv('OPENAI_API_URL', 'https://api.openai.com/v1')
|
| self.openai_model = os.getenv('OPENAI_API_MODEL', 'gemini-2.0-pro-exp-02-05')
|
|
|
| def answer_question(self, stock_code, question, market_type='A'):
|
| """回答关于股票的问题"""
|
| try:
|
| if not self.openai_api_key:
|
| return {"error": "未配置API密钥,无法使用智能问答功能"}
|
|
|
|
|
| stock_info = self.analyzer.get_stock_info(stock_code)
|
|
|
|
|
| df = self.analyzer.get_stock_data(stock_code, market_type)
|
| df = self.analyzer.calculate_indicators(df)
|
|
|
|
|
| latest = df.iloc[-1]
|
|
|
|
|
| score = self.analyzer.calculate_score(df)
|
|
|
|
|
| sr_levels = self.analyzer.identify_support_resistance(df)
|
|
|
|
|
| context = f"""股票信息:
|
| - 代码: {stock_code}
|
| - 名称: {stock_info.get('股票名称', '未知')}
|
| - 行业: {stock_info.get('行业', '未知')}
|
|
|
| 技术指标(最新数据):
|
| - 价格: {latest['close']}
|
| - 5日均线: {latest['MA5']}
|
| - 20日均线: {latest['MA20']}
|
| - 60日均线: {latest['MA60']}
|
| - RSI: {latest['RSI']}
|
| - MACD: {latest['MACD']}
|
| - MACD信号线: {latest['Signal']}
|
| - 布林带上轨: {latest['BB_upper']}
|
| - 布林带中轨: {latest['BB_middle']}
|
| - 布林带下轨: {latest['BB_lower']}
|
| - 波动率: {latest['Volatility']}%
|
|
|
| 技术评分: {score}分
|
|
|
| 支撑位:
|
| - 短期: {', '.join([str(level) for level in sr_levels['support_levels']['short_term']])}
|
| - 中期: {', '.join([str(level) for level in sr_levels['support_levels']['medium_term']])}
|
|
|
| 压力位:
|
| - 短期: {', '.join([str(level) for level in sr_levels['resistance_levels']['short_term']])}
|
| - 中期: {', '.join([str(level) for level in sr_levels['resistance_levels']['medium_term']])}"""
|
|
|
|
|
| if '基本面' in question or '财务' in question or '估值' in question:
|
| try:
|
|
|
| from fundamental_analyzer import FundamentalAnalyzer
|
| fundamental = FundamentalAnalyzer()
|
|
|
|
|
| indicators = fundamental.get_financial_indicators(stock_code)
|
|
|
|
|
| context += f"""
|
|
|
| 基本面指标:
|
| - PE(TTM): {indicators.get('pe_ttm', '未知')}
|
| - PB: {indicators.get('pb', '未知')}
|
| - ROE: {indicators.get('roe', '未知')}%
|
| - 毛利率: {indicators.get('gross_margin', '未知')}%
|
| - 净利率: {indicators.get('net_profit_margin', '未知')}%"""
|
| except:
|
| context += "\n\n注意:未能获取基本面数据"
|
|
|
|
|
| openai.api_key = self.openai_api_key
|
| openai.api_base = self.openai_api_url
|
|
|
| system_content = """你是专业的股票分析师助手,基于'时空共振交易体系'提供分析。
|
| 请基于技术指标和市场数据进行客观分析。
|
| """
|
|
|
| response = openai.ChatCompletion.create(
|
| model=self.openai_model,
|
| messages=[
|
| {"role": "system", "content": system_content},
|
| {"role": "user",
|
| "content": f"请回答关于股票的问题,并参考以下股票数据:\n\n{context}\n\n问题:{question}"}
|
| ],
|
| temperature=0.7
|
| )
|
|
|
| answer = response.choices[0].message.content
|
|
|
| return {
|
| "question": question,
|
| "answer": answer,
|
| "stock_code": stock_code,
|
| "stock_name": stock_info.get('股票名称', '未知')
|
| }
|
|
|
| except Exception as e:
|
| print(f"智能问答出错: {str(e)}")
|
| return {
|
| "question": question,
|
| "answer": f"抱歉,回答问题时出错: {str(e)}",
|
| "stock_code": stock_code
|
| } |