diff --git a/backend/service_implementation/qihuo_analyzer/modules/__pycache__/deepseek_agent.cpython-311.pyc b/backend/service_implementation/qihuo_analyzer/modules/__pycache__/deepseek_agent.cpython-311.pyc index ceddb98..a8977f6 100644 Binary files a/backend/service_implementation/qihuo_analyzer/modules/__pycache__/deepseek_agent.cpython-311.pyc and b/backend/service_implementation/qihuo_analyzer/modules/__pycache__/deepseek_agent.cpython-311.pyc differ diff --git a/backend/service_implementation/qihuo_analyzer/modules/deepseek_agent.py b/backend/service_implementation/qihuo_analyzer/modules/deepseek_agent.py index 6231d3f..2b1e2a9 100644 --- a/backend/service_implementation/qihuo_analyzer/modules/deepseek_agent.py +++ b/backend/service_implementation/qihuo_analyzer/modules/deepseek_agent.py @@ -430,7 +430,7 @@ class DeepseekAgent: """ # 调用API - response = self._call_deepseek_api(prompt) + response = self._call_ai_api(prompt) # 解析结果 fused_result = self._parse_analysis_result(response) @@ -466,7 +466,7 @@ class DeepseekAgent: """ # 调用API - response = self._call_deepseek_api(prompt) + response = self._call_ai_api(prompt) # 解析结果 insights = self._parse_analysis_result(response) diff --git a/backend/service_implementation/qihuo_analyzer/utils/__pycache__/config_manager.cpython-311.pyc b/backend/service_implementation/qihuo_analyzer/utils/__pycache__/config_manager.cpython-311.pyc index 6f57ee1..1dba690 100644 Binary files a/backend/service_implementation/qihuo_analyzer/utils/__pycache__/config_manager.cpython-311.pyc and b/backend/service_implementation/qihuo_analyzer/utils/__pycache__/config_manager.cpython-311.pyc differ diff --git a/backend/service_implementation/qihuo_analyzer/utils/config_manager.py b/backend/service_implementation/qihuo_analyzer/utils/config_manager.py index ef816ff..9f916fc 100644 --- a/backend/service_implementation/qihuo_analyzer/utils/config_manager.py +++ b/backend/service_implementation/qihuo_analyzer/utils/config_manager.py @@ -1,6 +1,6 @@ # 配置管理工具 import os -from dotenv import load_dotenv +import json from typing import Dict, Optional @@ -17,31 +17,62 @@ class ConfigManager: def _load_config(self): """加载配置""" - # 加载.env文件 - load_dotenv() - - # API配置 - self.openai_api_key = os.getenv('OPENAI_API_KEY', '') - self.deepseek_api_key = os.getenv('DEEPSEEK_API_KEY', '') - self.deepseek_api_url = os.getenv('DEEPSEEK_API_URL', 'https://api.deepseek.com/v1/chat/completions') - - # 数据库配置 - self.db_path = os.getenv('DB_PATH', './data/futures_analysis.db') - - # 天勤TQSDK配置 - self.tqserver_host = os.getenv('TQSERVER_HOST', 'api.shinnytech.com') - self.tqserver_port = int(os.getenv('TQSERVER_PORT', '7777')) + # 配置文件路径 + config_path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))), 'config.json') + print(f"[ConfigManager]尝试加载配置文件: {config_path}") + # 默认配置 + default_config = { + 'openai_api_key': '', + 'deepseek_api_key': '', + 'deepseek_api_url': 'https://api.deepseek.com/v1/chat/completions', + 'db_path': './data/futures_analysis.db', + 'tqserver_host': 'api.shinnytech.com', + 'tqserver_port': 7777, + 'max_risk_percent': 0.02, + 'min_profit_loss_ratio': 1.5, + 'default_atr_multiplier': 2.0, + 'default_adx_threshold': 20, + 'review_times': '09:00,12:30,15:30'.split(',') + } - # 风险配置 - self.max_risk_percent = float(os.getenv('MAX_RISK_PERCENT', '0.02')) - self.min_profit_loss_ratio = float(os.getenv('MIN_PROFIT_LOSS_RATIO', '1.5')) + # 从config.json加载配置 + if os.path.exists(config_path): + try: + with open(config_path, 'r', encoding='utf-8') as f: + config_data = json.load(f) + + # 从aiModel部分获取API配置 + if 'aiModel' in config_data and 'models' in config_data['aiModel']: + # 查找启用的模型 + enabled_models = [model for model in config_data['aiModel']['models'] if model.get('enabled', False)] + + # 优先使用DeepSeek模型的配置 + deepseek_model = next((model for model in config_data['aiModel']['models'] if model.get('name') == 'DeepSeek'), None) + if deepseek_model: + default_config['deepseek_api_key'] = deepseek_model.get('apiKey', '') + default_config['deepseek_api_url'] = deepseek_model.get('apiBaseUrl', 'https://api.deepseek.com/v1/chat/completions') + + # 查找GPT-4模型的配置 + gpt4_model = next((model for model in config_data['aiModel']['models'] if model.get('name') == 'GPT-4'), None) + if gpt4_model: + default_config['openai_api_key'] = gpt4_model.get('apiKey', '') - # 策略配置 - self.default_atr_multiplier = float(os.getenv('DEFAULT_ATR_MULTIPLIER', '2.0')) - self.default_adx_threshold = float(os.getenv('DEFAULT_ADX_THRESHOLD', '20')) + except Exception as e: + print(f"加载config.json失败: {e}") + # 使用默认配置 - # 定时任务配置 - self.review_times = os.getenv('REVIEW_TIMES', '09:00,12:30,15:30').split(',') + # 设置配置值 + self.openai_api_key = default_config['openai_api_key'] + self.deepseek_api_key = default_config['deepseek_api_key'] + self.deepseek_api_url = default_config['deepseek_api_url'] + self.db_path = default_config['db_path'] + self.tqserver_host = default_config['tqserver_host'] + self.tqserver_port = default_config['tqserver_port'] + self.max_risk_percent = default_config['max_risk_percent'] + self.min_profit_loss_ratio = default_config['min_profit_loss_ratio'] + self.default_atr_multiplier = default_config['default_atr_multiplier'] + self.default_adx_threshold = default_config['default_adx_threshold'] + self.review_times = default_config['review_times'] def get_config(self) -> Dict: """获取所有配置""" diff --git a/backend/service_implementation/service/data/futures_analysis.db b/backend/service_implementation/service/data/futures_analysis.db index 3fb3941..357fc6b 100644 Binary files a/backend/service_implementation/service/data/futures_analysis.db and b/backend/service_implementation/service/data/futures_analysis.db differ diff --git a/config.json b/config.json index e19bd93..f33025e 100644 --- a/config.json +++ b/config.json @@ -89,5 +89,164 @@ "refreshInterval": 60000 }, "defaultDataSource": "tqsdk" + }, + "aiModel": { + "models": [ + { + "id": 1, + "name": "DeepSeek", + "accuracy": "85%", + "responseTime": "250ms", + "enabled": true, + "apiKey": "sk-49dccf9e8a754d3abb36ce396cb8f189", + "apiBaseUrl": "https://api.deepseek.com/v1/chat/completions", + "temperature": 0.3, + "maxTokens": 1000, + "timeout": 30000, + "retries": 3, + "predictionPeriods": [ + "1H", + "4H", + "1D" + ], + "confidenceThreshold": 70, + "historyDataDays": 90 + }, + { + "id": 2, + "name": "GPT-4", + "accuracy": "88%", + "responseTime": "350ms", + "enabled": false, + "apiKey": "", + "apiBaseUrl": "https://api.openai.com/v1/chat/completions", + "temperature": 0.3, + "maxTokens": 1000, + "timeout": 30000, + "retries": 3, + "predictionPeriods": [ + "1H", + "4H", + "1D" + ], + "confidenceThreshold": 70, + "historyDataDays": 90, + "technicalIndicators": { + "enabled": true, + "indicators": [ + "MACD", + "RSI", + "KDJ", + "MA", + "BOLL" + ] + }, + "fundamentalAnalysis": { + "enabled": true, + "factors": [ + "资金流向", + "持仓分析", + "现货价格", + "库存变化" + ] + }, + "riskAssessment": { + "enabled": true, + "riskLevel": "medium" + } + }, + { + "id": 3, + "name": "Claude", + "accuracy": "82%", + "responseTime": "200ms", + "enabled": false, + "apiKey": "", + "apiBaseUrl": "", + "temperature": 0.3, + "maxTokens": 1000, + "timeout": 30000, + "retries": 3, + "predictionPeriods": [ + "1H", + "4H", + "1D" + ], + "confidenceThreshold": 70, + "historyDataDays": 90, + "technicalIndicators": { + "enabled": true, + "indicators": [ + "MACD", + "RSI", + "KDJ", + "MA", + "BOLL" + ] + }, + "fundamentalAnalysis": { + "enabled": true, + "factors": [ + "资金流向", + "持仓分析", + "现货价格", + "库存变化" + ] + }, + "riskAssessment": { + "enabled": true, + "riskLevel": "medium" + } + }, + { + "id": 4, + "name": "自定义模型", + "accuracy": "78%", + "responseTime": "150ms", + "enabled": false, + "apiKey": "", + "apiBaseUrl": "", + "temperature": 0.3, + "maxTokens": 1000, + "timeout": 30000, + "retries": 3, + "predictionPeriods": [ + "1H", + "4H", + "1D" + ], + "confidenceThreshold": 70, + "historyDataDays": 90, + "technicalIndicators": { + "enabled": true, + "indicators": [ + "MACD", + "RSI", + "KDJ", + "MA", + "BOLL" + ] + }, + "fundamentalAnalysis": { + "enabled": true, + "factors": [ + "资金流向", + "持仓分析", + "现货价格", + "库存变化" + ] + }, + "riskAssessment": { + "enabled": true, + "riskLevel": "medium" + } + } + ], + "defaultModel": "DeepSeek", + "predictionConfig": { + "defaultPeriod": "1D", + "defaultConfidenceThreshold": 70, + "defaultHistoryDataDays": 90 + } } } \ No newline at end of file diff --git a/src/pages/admin/AdminConfig.jsx b/src/pages/admin/AdminConfig.jsx index 7e38db7..fffebe6 100644 --- a/src/pages/admin/AdminConfig.jsx +++ b/src/pages/admin/AdminConfig.jsx @@ -132,7 +132,129 @@ const AdminConfig = () => { database: databaseConfig, server: serverConfig, security: securityConfig, - dataSource: dataSourceConfig + dataSource: dataSourceConfig, + aiModel: { + models: [ + { + id: 1, + name: "DeepSeek", + accuracy: "85%", + responseTime: "250ms", + enabled: true, + apiKey: "", + apiBaseUrl: "https://api.deepseek.com/v1/chat/completions", + temperature: 0.3, + maxTokens: 1000, + timeout: 30000, + retries: 3, + predictionPeriods: ["1H", "4H", "1D"], + confidenceThreshold: 70, + historyDataDays: 90, + technicalIndicators: { + enabled: true, + indicators: ["MACD", "RSI", "KDJ", "MA", "BOLL"] + }, + fundamentalAnalysis: { + enabled: true, + factors: ["资金流向", "持仓分析", "现货价格", "库存变化"] + }, + riskAssessment: { + enabled: true, + riskLevel: "medium" + } + }, + { + id: 2, + name: "GPT-4", + accuracy: "88%", + responseTime: "350ms", + enabled: false, + apiKey: "", + apiBaseUrl: "https://api.openai.com/v1/chat/completions", + temperature: 0.3, + maxTokens: 1000, + timeout: 30000, + retries: 3, + predictionPeriods: ["1H", "4H", "1D"], + confidenceThreshold: 70, + historyDataDays: 90, + technicalIndicators: { + enabled: true, + indicators: ["MACD", "RSI", "KDJ", "MA", "BOLL"] + }, + fundamentalAnalysis: { + enabled: true, + factors: ["资金流向", "持仓分析", "现货价格", "库存变化"] + }, + riskAssessment: { + enabled: true, + riskLevel: "medium" + } + }, + { + id: 3, + name: "Claude", + accuracy: "82%", + responseTime: "200ms", + enabled: false, + apiKey: "", + apiBaseUrl: "", + temperature: 0.3, + maxTokens: 1000, + timeout: 30000, + retries: 3, + predictionPeriods: ["1H", "4H", "1D"], + confidenceThreshold: 70, + historyDataDays: 90, + technicalIndicators: { + enabled: true, + indicators: ["MACD", "RSI", "KDJ", "MA", "BOLL"] + }, + fundamentalAnalysis: { + enabled: true, + factors: ["资金流向", "持仓分析", "现货价格", "库存变化"] + }, + riskAssessment: { + enabled: true, + riskLevel: "medium" + } + }, + { + id: 4, + name: "自定义模型", + accuracy: "78%", + responseTime: "150ms", + enabled: false, + apiKey: "", + apiBaseUrl: "", + temperature: 0.3, + maxTokens: 1000, + timeout: 30000, + retries: 3, + predictionPeriods: ["1H", "4H", "1D"], + confidenceThreshold: 70, + historyDataDays: 90, + technicalIndicators: { + enabled: true, + indicators: ["MACD", "RSI", "KDJ", "MA", "BOLL"] + }, + fundamentalAnalysis: { + enabled: true, + factors: ["资金流向", "持仓分析", "现货价格", "库存变化"] + }, + riskAssessment: { + enabled: true, + riskLevel: "medium" + } + } + ], + defaultModel: "DeepSeek", + predictionConfig: { + defaultPeriod: "1D", + defaultConfidenceThreshold: 70, + defaultHistoryDataDays: 90 + } + } }); // 处理配置变更 @@ -146,6 +268,38 @@ const AdminConfig = () => { })); }; + // 处理AI模型配置变更 + const handleAiModelConfigChange = (modelId, key, value) => { + setConfig(prev => ({ + ...prev, + aiModel: { + ...prev.aiModel, + models: prev.aiModel.models.map(model => + model.id === modelId ? { ...model, [key]: value } : model + ) + } + })); + }; + + // 处理AI模型详细配置变更 + const handleAiModelDetailConfigChange = (modelId, section, key, value) => { + setConfig(prev => ({ + ...prev, + aiModel: { + ...prev.aiModel, + models: prev.aiModel.models.map(model => + model.id === modelId ? { + ...model, + [section]: { + ...model[section], + [key]: value + } + } : model + ) + } + })); + }; + // 处理数据库配置变更 const handleDatabaseConfigChange = (dbType, key, value) => { setConfig(prev => ({ @@ -205,6 +359,128 @@ const AdminConfig = () => { wind: { enabled: false, apiKey: '', apiSecret: '', url: 'https://api.wind.com.cn', timeout: 30000, retries: 3 }, sina: { enabled: false, url: 'https://finance.sina.com.cn', timeout: 10000, retries: 3, refreshInterval: 60000 }, defaultDataSource: 'tqsdk' + }, + aiModel: newConfig.aiModel || { + models: [ + { + id: 1, + name: "DeepSeek", + accuracy: "85%", + responseTime: "250ms", + enabled: true, + apiKey: "", + apiBaseUrl: "https://api.deepseek.com/v1/chat/completions", + temperature: 0.3, + maxTokens: 1000, + timeout: 30000, + retries: 3, + predictionPeriods: ["1H", "4H", "1D"], + confidenceThreshold: 70, + historyDataDays: 90, + technicalIndicators: { + enabled: true, + indicators: ["MACD", "RSI", "KDJ", "MA", "BOLL"] + }, + fundamentalAnalysis: { + enabled: true, + factors: ["资金流向", "持仓分析", "现货价格", "库存变化"] + }, + riskAssessment: { + enabled: true, + riskLevel: "medium" + } + }, + { + id: 2, + name: "GPT-4", + accuracy: "88%", + responseTime: "350ms", + enabled: false, + apiKey: "", + apiBaseUrl: "https://api.openai.com/v1/chat/completions", + temperature: 0.3, + maxTokens: 1000, + timeout: 30000, + retries: 3, + predictionPeriods: ["1H", "4H", "1D"], + confidenceThreshold: 70, + historyDataDays: 90, + technicalIndicators: { + enabled: true, + indicators: ["MACD", "RSI", "KDJ", "MA", "BOLL"] + }, + fundamentalAnalysis: { + enabled: true, + factors: ["资金流向", "持仓分析", "现货价格", "库存变化"] + }, + riskAssessment: { + enabled: true, + riskLevel: "medium" + } + }, + { + id: 3, + name: "Claude", + accuracy: "82%", + responseTime: "200ms", + enabled: false, + apiKey: "", + apiBaseUrl: "", + temperature: 0.3, + maxTokens: 1000, + timeout: 30000, + retries: 3, + predictionPeriods: ["1H", "4H", "1D"], + confidenceThreshold: 70, + historyDataDays: 90, + technicalIndicators: { + enabled: true, + indicators: ["MACD", "RSI", "KDJ", "MA", "BOLL"] + }, + fundamentalAnalysis: { + enabled: true, + factors: ["资金流向", "持仓分析", "现货价格", "库存变化"] + }, + riskAssessment: { + enabled: true, + riskLevel: "medium" + } + }, + { + id: 4, + name: "自定义模型", + accuracy: "78%", + responseTime: "150ms", + enabled: false, + apiKey: "", + apiBaseUrl: "", + temperature: 0.3, + maxTokens: 1000, + timeout: 30000, + retries: 3, + predictionPeriods: ["1H", "4H", "1D"], + confidenceThreshold: 70, + historyDataDays: 90, + technicalIndicators: { + enabled: true, + indicators: ["MACD", "RSI", "KDJ", "MA", "BOLL"] + }, + fundamentalAnalysis: { + enabled: true, + factors: ["资金流向", "持仓分析", "现货价格", "库存变化"] + }, + riskAssessment: { + enabled: true, + riskLevel: "medium" + } + } + ], + defaultModel: "DeepSeek", + predictionConfig: { + defaultPeriod: "1D", + defaultConfidenceThreshold: 70, + defaultHistoryDataDays: 90 + } } }; @@ -392,27 +668,29 @@ const AdminConfig = () => { // 打开AI模型配置模态框 const openAiModelConfig = (model) => { setCurrentAiModel(model); + // 从配置中获取模型数据 + const modelConfig = config.aiModel.models.find(m => m.id === model.id) || model; // 初始化表单数据 aiModelForm.setFieldsValue({ - modelName: model.name, - apiKey: '', - apiBaseUrl: '', - temperature: 0.3, - maxTokens: 1000, - timeout: 30000, - retries: 3, - predictionPeriods: ['1H', '4H', '1D'], - confidenceThreshold: 70, - historyDataDays: 90, - technicalIndicators: { + modelName: modelConfig.name, + apiKey: modelConfig.apiKey || '', + apiBaseUrl: modelConfig.apiBaseUrl || '', + temperature: modelConfig.temperature || 0.3, + maxTokens: modelConfig.maxTokens || 1000, + timeout: modelConfig.timeout || 30000, + retries: modelConfig.retries || 3, + predictionPeriods: modelConfig.predictionPeriods || ['1H', '4H', '1D'], + confidenceThreshold: modelConfig.confidenceThreshold || 70, + historyDataDays: modelConfig.historyDataDays || 90, + technicalIndicators: modelConfig.technicalIndicators || { enabled: true, indicators: ['MACD', 'RSI', 'KDJ', 'MA', 'BOLL'] }, - fundamentalAnalysis: { + fundamentalAnalysis: modelConfig.fundamentalAnalysis || { enabled: true, factors: ['资金流向', '持仓分析', '现货价格', '库存变化'] }, - riskAssessment: { + riskAssessment: modelConfig.riskAssessment || { enabled: true, riskLevel: 'medium' } @@ -423,7 +701,30 @@ const AdminConfig = () => { // 保存AI模型配置 const saveAiModelConfig = (values) => { console.log('AI模型配置保存:', values); - // 模拟保存操作 + // 更新配置中的模型数据 + setConfig(prev => ({ + ...prev, + aiModel: { + ...prev.aiModel, + models: prev.aiModel.models.map(model => + model.id === currentAiModel.id ? { + ...model, + apiKey: values.apiKey, + apiBaseUrl: values.apiBaseUrl, + temperature: values.temperature, + maxTokens: values.maxTokens, + timeout: values.timeout, + retries: values.retries, + predictionPeriods: values.predictionPeriods, + confidenceThreshold: values.confidenceThreshold, + historyDataDays: values.historyDataDays, + technicalIndicators: values.technicalIndicators, + fundamentalAnalysis: values.fundamentalAnalysis, + riskAssessment: values.riskAssessment + } : model + ) + } + })); setAiModelModalVisible(false); messageApi.success('AI模型配置已保存'); }; @@ -1289,12 +1590,7 @@ const AdminConfig = () => { {/* AI模型配置 */} { title: '默认模型', dataIndex: 'enabled', key: 'enabled', - render: (enabled) => ( - {}} /> + render: (enabled, record) => ( + handleAiModelConfigChange(record.id, 'enabled', checked)} + /> ) }, { @@ -1338,8 +1637,14 @@ const AdminConfig = () => {
- - handleConfigChange('aiModel', 'predictionConfig', { + ...config.aiModel.predictionConfig, + defaultPeriod: value + })} + > @@ -1348,17 +1653,56 @@ const AdminConfig = () => { - - + + handleConfigChange('aiModel', 'predictionConfig', { + ...config.aiModel.predictionConfig, + defaultConfidenceThreshold: parseInt(e.target.value) || 70 + })} + /> - - + + handleConfigChange('aiModel', 'predictionConfig', { + ...config.aiModel.predictionConfig, + defaultHistoryDataDays: parseInt(e.target.value) || 90 + })} + /> -