diff --git a/mem/backen.sh b/mem/backen.sh new file mode 100644 index 0000000..077b770 --- /dev/null +++ b/mem/backen.sh @@ -0,0 +1,53 @@ +# 创建项目根目录 +mkdir quant-trading-backend + +# 进入项目根目录 +cd quant-trading-backend + +# 创建应用目录和子目录 +mkdir -p app/routes app/services app/utils + +# 创建测试目录和测试文件 +mkdir tests +touch tests/__init__.py +touch tests/test_config.py +touch tests/test_data.py +touch tests/test_evaluation.py +touch tests/test_model.py + +# 创建应用的 __init__.py 文件 +touch app/__init__.py + +# 创建路由文件 +touch app/routes/__init__.py +touch app/routes/config_routes.py +touch app/routes/data_routes.py +touch app/routes/evaluation_routes.py +touch app/routes/model_routes.py + +# 创建服务文件 +touch app/services/__init__.py +touch app/services/config_service.py +touch app/services/data_service.py +touch app/services/evaluation_service.py +touch app/services/model_service.py + +# 创建工具文件 +touch app/utils/__init__.py +touch app/utils/db_utils.py + +# 创建 requirements.txt 文件用于指定依赖 +touch requirements.txt + +# 创建环境变量文件 +touch .env +touch .flaskenv + +# 创建 Flask 配置文件 +touch config.py + +# 创建 Flask 启动文件 +touch run.py + +# 输出目录结构 +tree \ No newline at end of file diff --git a/mem/platform.sh b/mem/platform.sh new file mode 100644 index 0000000..fa069e9 --- /dev/null +++ b/mem/platform.sh @@ -0,0 +1,60 @@ +# 创建项目目录 +mkdir quant-trading-platform + +# 进入项目目录 +cd quant-trading-platform + +# 创建组件目录和子目录 +mkdir -p components/ConfigEditor components/DataManagement components/ModelManagement components/Evaluation + +# 创建页面目录 +mkdir pages + +# 创建公共资源目录 +mkdir public + +# 创建样式目录 +mkdir styles + +# 创建工具函数目录 +mkdir utils + +# 创建配置Schema目录 +mkdir schemas + +# 创建组件文件 +touch components/ConfigEditor/ConfigEditor.js +touch components/ConfigEditor/ConfigForm.js +touch components/DataManagement/DataInitiator.js +touch components/DataManagement/DataStatus.js +touch components/ModelManagement/ModelTraining.js +touch components/ModelManagement/TrainingStatus.js +touch components/Evaluation/EvaluationResults.js +touch components/Evaluation/PerformanceCharts.js + +# 创建页面文件 +touch pages/index.js +touch pages/config.js +touch pages/data.js +touch pages/model.js +touch pages/evaluation.js + +# 创建样式文件 +touch styles/globals.css + +# 创建工具函数文件 +touch utils/api.js + +# 创建配置Schema文件 +touch schemas/config-schema.json + +# 创建环境变量文件和配置文件 +touch .env +touch next.config.js + +# 创建 package.json 和 README.md +touch package.json +touch README.md + +# 输出目录结构 +tree \ No newline at end of file diff --git a/mem/quant-trading-backend/.env b/mem/quant-trading-backend/.env new file mode 100644 index 0000000..1f4f5be --- /dev/null +++ b/mem/quant-trading-backend/.env @@ -0,0 +1 @@ +DATABASE_URI=mysql+pymysql://user:password@localhost/dbname \ No newline at end of file diff --git a/mem/quant-trading-backend/.flaskenv b/mem/quant-trading-backend/.flaskenv new file mode 100644 index 0000000..ee822ef --- /dev/null +++ b/mem/quant-trading-backend/.flaskenv @@ -0,0 +1,2 @@ +FLASK_APP=run.py +FLASK_ENV=development \ No newline at end of file diff --git a/mem/quant-trading-backend/app/__init__.py b/mem/quant-trading-backend/app/__init__.py new file mode 100644 index 0000000..6155a24 --- /dev/null +++ b/mem/quant-trading-backend/app/__init__.py @@ -0,0 +1,14 @@ +# app/__init__.py +from flask import Flask +from .routes import config_routes, data_routes, evaluation_routes, model_routes + +def create_app(): + app = Flask(__name__) + app.config.from_pyfile('config.py') + + app.register_blueprint(config_routes.bp) + app.register_blueprint(data_routes.bp) + app.register_blueprint(evaluation_routes.bp) + app.register_blueprint(model_routes.bp) + + return app \ No newline at end of file diff --git a/mem/quant-trading-backend/app/routes/__init__.py b/mem/quant-trading-backend/app/routes/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mem/quant-trading-backend/app/routes/config_routes.py b/mem/quant-trading-backend/app/routes/config_routes.py new file mode 100644 index 0000000..24412bf --- /dev/null +++ b/mem/quant-trading-backend/app/routes/config_routes.py @@ -0,0 +1,18 @@ +# app/routes/config_routes.py +from flask import Blueprint, request, jsonify +from ..services.config_service import get_config, save_config + +bp = Blueprint('config', __name__, url_prefix='/api/config') + +@bp.route('/', methods=['GET']) +def get_configuration(): + # 获取配置信息 + config = get_config() + return jsonify(config), 200 + +@bp.route('/', methods=['POST']) +def update_configuration(): + # 更新配置信息 + config_data = request.get_json() + save_config(config_data) + return jsonify({"message": "Configuration updated successfully"}), 200 diff --git a/mem/quant-trading-backend/app/routes/data_routes.py b/mem/quant-trading-backend/app/routes/data_routes.py new file mode 100644 index 0000000..6db9646 --- /dev/null +++ b/mem/quant-trading-backend/app/routes/data_routes.py @@ -0,0 +1,17 @@ +# app/routes/data_routes.py +from flask import Blueprint, jsonify +from ..services.data_service import initiate_data_process, get_data_history + +bp = Blueprint('data', __name__, url_prefix='/api/data') + +@bp.route('/initiate', methods=['POST']) +def initiate_data(): + # 启动数据处理流程 + initiate_data_process() + return jsonify({"message": "Data process initiated"}), 200 + +@bp.route('/history', methods=['GET']) +def data_history(): + # 获取数据处理历史 + history = get_data_history() + return jsonify(history), 200 diff --git a/mem/quant-trading-backend/app/routes/evaluation_routes.py b/mem/quant-trading-backend/app/routes/evaluation_routes.py new file mode 100644 index 0000000..fa0995c --- /dev/null +++ b/mem/quant-trading-backend/app/routes/evaluation_routes.py @@ -0,0 +1,11 @@ +# app/routes/evaluation_routes.py +from flask import Blueprint, jsonify +from ..services.evaluation_service import get_evaluation_results + +bp = Blueprint('evaluation', __name__, url_prefix='/api/evaluation') + +@bp.route('/results', methods=['GET']) +def evaluation_results(): + # 获取评估结果 + results = get_evaluation_results() + return jsonify(results), 200 diff --git a/mem/quant-trading-backend/app/routes/model_routes.py b/mem/quant-trading-backend/app/routes/model_routes.py new file mode 100644 index 0000000..e97ab42 --- /dev/null +++ b/mem/quant-trading-backend/app/routes/model_routes.py @@ -0,0 +1,17 @@ +# app/routes/model_routes.py +from flask import Blueprint, jsonify +from ..services.model_service import start_model_training, get_training_status + +bp = Blueprint('model', __name__, url_prefix='/api/model') + +@bp.route('/train', methods=['POST']) +def train_model(): + # 启动模型训练 + start_model_training() + return jsonify({"message": "Model training started"}), 200 + +@bp.route('/status', methods=['GET']) +def training_status(): + # 获取模型训练状态 + status = get_training_status() + return jsonify(status), 200 diff --git a/mem/quant-trading-backend/app/services/__init__.py b/mem/quant-trading-backend/app/services/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mem/quant-trading-backend/app/services/config_service.py b/mem/quant-trading-backend/app/services/config_service.py new file mode 100644 index 0000000..6a816d7 --- /dev/null +++ b/mem/quant-trading-backend/app/services/config_service.py @@ -0,0 +1,9 @@ +# app/services/config_service.py + +def get_config(): + # 这里应该是获取配置的逻辑 + return {"tradingStrategy": "meanReversion"} + +def save_config(config_data): + # 这里应该是保存配置的逻辑 + pass diff --git a/mem/quant-trading-backend/app/services/data_service.py b/mem/quant-trading-backend/app/services/data_service.py new file mode 100644 index 0000000..295a32d --- /dev/null +++ b/mem/quant-trading-backend/app/services/data_service.py @@ -0,0 +1,9 @@ +# app/services/data_service.py + +def initiate_data_process(): + # 这里应该是启动数据处理流程的逻辑 + pass + +def get_data_history(): + # 这里应该是获取数据处理历史的逻辑 + return [{"timestamp": "2021-01-01T00:00:00", "status": "Completed"}] diff --git a/mem/quant-trading-backend/app/services/evaluation_service.py b/mem/quant-trading-backend/app/services/evaluation_service.py new file mode 100644 index 0000000..e9596bc --- /dev/null +++ b/mem/quant-trading-backend/app/services/evaluation_service.py @@ -0,0 +1,5 @@ +# app/services/evaluation_service.py + +def get_evaluation_results(): + # 这里应该是获取评估结果的逻辑 + return [{"metric": "Accuracy", "value": 0.95}] diff --git a/mem/quant-trading-backend/app/services/model_service.py b/mem/quant-trading-backend/app/services/model_service.py new file mode 100644 index 0000000..47d0608 --- /dev/null +++ b/mem/quant-trading-backend/app/services/model_service.py @@ -0,0 +1,9 @@ +# app/services/model_service.py + +def start_model_training(): + # 这里应该是启动模型训练的逻辑 + pass + +def get_training_status(): + # 这里应该是获取模型训练状态的逻辑 + return {"status": "Training", "progress": 50} diff --git a/mem/quant-trading-backend/app/utils/__init__.py b/mem/quant-trading-backend/app/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mem/quant-trading-backend/app/utils/db_utils.py b/mem/quant-trading-backend/app/utils/db_utils.py new file mode 100644 index 0000000..5c5658a --- /dev/null +++ b/mem/quant-trading-backend/app/utils/db_utils.py @@ -0,0 +1,59 @@ +# app/utils/db_utils.py +from flask_sqlalchemy import SQLAlchemy +from flask import current_app + +# 初始化 SQLAlchemy,可以在 app/__init__.py 中完成 +db = SQLAlchemy() + +def get_db(): + """获取当前应用的数据库对象""" + return db + +def init_db(app): + """初始化数据库""" + app.config['SQLALCHEMY_DATABASE_URI'] = current_app.config['DATABASE_URI'] + app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False + db.init_app(app) + +# 示例模型 +class Config(db.Model): + id = db.Column(db.Integer, primary_key=True) + trading_strategy = db.Column(db.String(50), nullable=False) + max_drawdown = db.Column(db.Float, nullable=False) + stop_loss = db.Column(db.Float, nullable=False) + + # 添加更多字段和方法根据需要 + +def create_tables(): + """创建数据库表""" + with current_app.app_context(): + db.create_all() + +def drop_tables(): + """删除数据库表""" + with current_app.app_context(): + db.drop_all() + +# 数据库操作示例 +def get_config_by_id(config_id): + return Config.query.get(config_id) + +def add_new_config(trading_strategy, max_drawdown, stop_loss): + new_config = Config(trading_strategy=trading_strategy, max_drawdown=max_drawdown, stop_loss=stop_loss) + db.session.add(new_config) + db.session.commit() + return new_config + +def update_config(config_id, **kwargs): + config = get_config_by_id(config_id) + if config: + for key, value in kwargs.items(): + setattr(config, key, value) + db.session.commit() + return config + +def delete_config(config_id): + config = get_config_by_id(config_id) + if config: + db.session.delete(config) + db.session.commit() diff --git a/mem/quant-trading-backend/config.py b/mem/quant-trading-backend/config.py new file mode 100644 index 0000000..e69de29 diff --git a/mem/quant-trading-backend/requirements.txt b/mem/quant-trading-backend/requirements.txt new file mode 100644 index 0000000..9b8d815 --- /dev/null +++ b/mem/quant-trading-backend/requirements.txt @@ -0,0 +1 @@ +Flask==2.0.1 \ No newline at end of file diff --git a/mem/quant-trading-backend/run.py b/mem/quant-trading-backend/run.py new file mode 100644 index 0000000..0b491ae --- /dev/null +++ b/mem/quant-trading-backend/run.py @@ -0,0 +1,7 @@ +# run.py +from app import create_app + +app = create_app() + +if __name__ == "__main__": + app.run() \ No newline at end of file diff --git a/mem/quant-trading-backend/tests/__init__.py b/mem/quant-trading-backend/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mem/quant-trading-backend/tests/test_config.py b/mem/quant-trading-backend/tests/test_config.py new file mode 100644 index 0000000..e69de29 diff --git a/mem/quant-trading-backend/tests/test_data.py b/mem/quant-trading-backend/tests/test_data.py new file mode 100644 index 0000000..e69de29 diff --git a/mem/quant-trading-backend/tests/test_evaluation.py b/mem/quant-trading-backend/tests/test_evaluation.py new file mode 100644 index 0000000..e69de29 diff --git a/mem/quant-trading-backend/tests/test_model.py b/mem/quant-trading-backend/tests/test_model.py new file mode 100644 index 0000000..e69de29 diff --git a/mem/quant-trading-platform/.env b/mem/quant-trading-platform/.env new file mode 100644 index 0000000..7b41eda --- /dev/null +++ b/mem/quant-trading-platform/.env @@ -0,0 +1,2 @@ +NEXT_PUBLIC_API_BASE_URL=https://api.example.com +ANOTHER_ENV_VARIABLE=theValue \ No newline at end of file diff --git a/mem/quant-trading-platform/README.md b/mem/quant-trading-platform/README.md new file mode 100644 index 0000000..e69de29 diff --git a/mem/quant-trading-platform/components/ConfigEditor/ConfigEditor.js b/mem/quant-trading-platform/components/ConfigEditor/ConfigEditor.js new file mode 100644 index 0000000..250e22c --- /dev/null +++ b/mem/quant-trading-platform/components/ConfigEditor/ConfigEditor.js @@ -0,0 +1,44 @@ +// components/ConfigEditor/ConfigEditor.js +import React, { useState, useEffect } from 'react'; +import { fetchConfig, saveConfig } from '../../utils/api'; +import ConfigForm from './ConfigForm'; + +const ConfigEditor = () => { + const [configData, setConfigData] = useState(null); + + useEffect(() => { + const loadConfig = async () => { + try { + const data = await fetchConfig(); + setConfigData(data); + } catch (error) { + console.error('Error loading config:', error); + // Handle error appropriately + } + }; + + loadConfig(); + }, []); + + const handleSave = async (updatedConfig) => { + try { + await saveConfig(updatedConfig); + alert('Config saved successfully!'); + } catch (error) { + console.error('Error saving config:', error); + // Handle error appropriately + } + }; + + return ( +
+ {configData ? ( + + ) : ( +

Loading configuration...

+ )} +
+ ); +}; + +export default ConfigEditor; \ No newline at end of file diff --git a/mem/quant-trading-platform/components/ConfigEditor/ConfigForm.js b/mem/quant-trading-platform/components/ConfigEditor/ConfigForm.js new file mode 100644 index 0000000..fe2dad2 --- /dev/null +++ b/mem/quant-trading-platform/components/ConfigEditor/ConfigForm.js @@ -0,0 +1,40 @@ +// components/ConfigEditor/ConfigForm.js +import React, { useState } from 'react'; + +const ConfigForm = ({ configData, onSave }) => { + const [formData, setFormData] = useState(configData); + + const handleChange = (event) => { + const { name, value } = event.target; + setFormData((prevFormData) => ({ + ...prevFormData, + [name]: value, + })); + }; + + const handleSubmit = (event) => { + event.preventDefault(); + onSave(formData); + }; + + return ( +
+ {/* Iterate over formData keys and generate input fields */} + {Object.keys(formData).map((key) => ( +
+ + +
+ ))} + +
+ ); +}; + +export default ConfigForm; \ No newline at end of file diff --git a/mem/quant-trading-platform/components/DataManagement/DataInitiator.js b/mem/quant-trading-platform/components/DataManagement/DataInitiator.js new file mode 100644 index 0000000..033f6f3 --- /dev/null +++ b/mem/quant-trading-platform/components/DataManagement/DataInitiator.js @@ -0,0 +1,21 @@ +// components/DataManagement/DataInitiator.js +import React from 'react'; +import { Button } from 'element-react'; + +const DataInitiator = ({ onStart }) => { + return ( +
+ + + {/* Optionally, you can add more information or controls related to the data initiation process here */} + + +
+ ); +}; + +export default DataInitiator; \ No newline at end of file diff --git a/mem/quant-trading-platform/components/DataManagement/DataStatus.js b/mem/quant-trading-platform/components/DataManagement/DataStatus.js new file mode 100644 index 0000000..a8ae032 --- /dev/null +++ b/mem/quant-trading-platform/components/DataManagement/DataStatus.js @@ -0,0 +1,23 @@ +// components/DataManagement/DataStatus.js +import React from 'react'; + +const DataStatus = ({ status }) => { + return ( +
+

Current Data Status: {status}

+ + {/* Optionally, you can add more details about the data status here */} + + +
+ ); +}; + +export default DataStatus; \ No newline at end of file diff --git a/mem/quant-trading-platform/components/Evaluation/EvaluationResults.js b/mem/quant-trading-platform/components/Evaluation/EvaluationResults.js new file mode 100644 index 0000000..a4601aa --- /dev/null +++ b/mem/quant-trading-platform/components/Evaluation/EvaluationResults.js @@ -0,0 +1,33 @@ +// components/Evaluation/EvaluationResults.js +import React from 'react'; + +const EvaluationResults = ({ results }) => { + return ( +
+

Evaluation Results

+ {/* Render results as a list or table */} + + + {/* Optionally, you can add more sophisticated rendering of the results here */} + + +
+ ); +}; + +export default EvaluationResults; \ No newline at end of file diff --git a/mem/quant-trading-platform/components/Evaluation/PerformanceCharts.js b/mem/quant-trading-platform/components/Evaluation/PerformanceCharts.js new file mode 100644 index 0000000..105b5ea --- /dev/null +++ b/mem/quant-trading-platform/components/Evaluation/PerformanceCharts.js @@ -0,0 +1,43 @@ +// components/Evaluation/PerformanceCharts.js +import React from 'react'; +import ReactECharts from 'echarts-for-react'; // Make sure to install echarts and echarts-for-react + +const PerformanceCharts = ({ data }) => { + // This is a placeholder for chart options + const getChartOptions = (data) => { + return { + tooltip: { + trigger: 'axis' + }, + xAxis: { + type: 'category', + data: data.map(d => d.x) + }, + yAxis: { + type: 'value' + }, + series: [ + { + data: data.map(d => d.y), + type: 'line' + } + ] + }; + }; + + return ( +
+ + + {/* Optionally, you can add more charts or customize the existing one further here */} + + +
+ ); +}; + +export default PerformanceCharts; \ No newline at end of file diff --git a/mem/quant-trading-platform/components/ModelManagement/ModelTraining.js b/mem/quant-trading-platform/components/ModelManagement/ModelTraining.js new file mode 100644 index 0000000..66006b2 --- /dev/null +++ b/mem/quant-trading-platform/components/ModelManagement/ModelTraining.js @@ -0,0 +1,21 @@ +// components/ModelManagement/ModelTraining.js +import React from 'react'; +import { Button } from 'element-react'; + +const ModelTraining = ({ onTrain }) => { + return ( +
+ + + {/* Optionally, you can add more controls or information related to the model training here */} + + +
+ ); +}; + +export default ModelTraining; \ No newline at end of file diff --git a/mem/quant-trading-platform/components/ModelManagement/TrainingStatus.js b/mem/quant-trading-platform/components/ModelManagement/TrainingStatus.js new file mode 100644 index 0000000..5e8f0a9 --- /dev/null +++ b/mem/quant-trading-platform/components/ModelManagement/TrainingStatus.js @@ -0,0 +1,23 @@ +// components/ModelManagement/TrainingStatus.js +import React from 'react'; + +const TrainingStatus = ({ status }) => { + return ( +
+

Training Status: {status}

+ + {/* Optionally, you can add more details or visual indicators of training status here */} + + +
+ ); +}; + +export default TrainingStatus; \ No newline at end of file diff --git a/mem/quant-trading-platform/next.config.js b/mem/quant-trading-platform/next.config.js new file mode 100644 index 0000000..2311a46 --- /dev/null +++ b/mem/quant-trading-platform/next.config.js @@ -0,0 +1,28 @@ +// next.config.js +const path = require('path'); + +module.exports = { + reactStrictMode: true, // 开启严格模式 + env: { + // 在这里可以添加环境变量 + NEXT_PUBLIC_API_BASE_URL: process.env.NEXT_PUBLIC_API_BASE_URL, + }, + sassOptions: { + // 如果你使用Sass,可以在这里配置Sass选项 + includePaths: [path.join(__dirname, 'styles')], + }, + images: { + // 如果你使用next/image,可以在这里配置图像域 + domains: ['example.com'], + }, + // 如果你需要重写webpack配置 + webpack: (config, { buildId, dev, isServer, defaultLoaders, webpack }) => { + // 注意:不要修改输入参数的引用,例如 `config` + // 举个例子,添加一个别名 + config.resolve.alias['@'] = path.join(__dirname, '.'); + + // 重要:返回修改后的配置 + return config; + }, + // 其他 Next.js 配置选项... +}; \ No newline at end of file diff --git a/mem/quant-trading-platform/package.json b/mem/quant-trading-platform/package.json new file mode 100644 index 0000000..e69de29 diff --git a/mem/quant-trading-platform/pages/_app.js b/mem/quant-trading-platform/pages/_app.js new file mode 100644 index 0000000..9eae6e9 --- /dev/null +++ b/mem/quant-trading-platform/pages/_app.js @@ -0,0 +1,2 @@ +// pages/_app.js +import 'element-theme-default'; \ No newline at end of file diff --git a/mem/quant-trading-platform/pages/config.js b/mem/quant-trading-platform/pages/config.js new file mode 100644 index 0000000..3c5f2ac --- /dev/null +++ b/mem/quant-trading-platform/pages/config.js @@ -0,0 +1,69 @@ +// pages/config.js +import { useState, useEffect } from 'react'; +import Head from 'next/head'; +import ConfigForm from '../components/ConfigEditor/ConfigForm'; +import axios from 'axios'; + +export default function ConfigPage() { + const [configData, setConfigData] = useState(null); + const [schema, setSchema] = useState(null); + + useEffect(() => { + // 加载配置的 JSON Schema + const fetchSchema = async () => { + try { + const response = await axios.get('/api/schema/config'); + setSchema(response.data); + } catch (error) { + console.error('Failed to fetch config schema:', error); + } + }; + + // 加载当前配置 + const fetchConfig = async () => { + try { + const response = await axios.get('/api/config'); + setConfigData(response.data); + } catch (error) { + console.error('Failed to fetch config:', error); + } + }; + + fetchSchema(); + fetchConfig(); + }, []); + + const handleSave = async (updatedConfig) => { + try { + // 保存更新后的配置 + await axios.post('/api/config', updatedConfig); + alert('Config saved successfully!'); + } catch (error) { + console.error('Failed to save config:', error); + alert('Failed to save config.'); + } + }; + + return ( +
+ + Configuration Management + + +
+

Configuration Management

+ {schema && configData ? ( + + ) : ( +

Loading configuration...

+ )} +
+ + +
+ ); +} \ No newline at end of file diff --git a/mem/quant-trading-platform/pages/data.js b/mem/quant-trading-platform/pages/data.js new file mode 100644 index 0000000..609c42f --- /dev/null +++ b/mem/quant-trading-platform/pages/data.js @@ -0,0 +1,78 @@ +// pages/data.js +import { useState, useEffect } from 'react'; +import Head from 'next/head'; +import axios from 'axios'; +import { Button } from 'element-react'; + +export default function DataPage() { + const [dataStatus, setDataStatus] = useState('Idle'); // Idle, Processing, Completed, Error + const [history, setHistory] = useState([]); + + useEffect(() => { + // 获取数据初始化的历史记录 + const fetchDataHistory = async () => { + try { + const response = await axios.get('/api/data/history'); + setHistory(response.data); + } catch (error) { + console.error('Failed to fetch data history:', error); + } + }; + + fetchDataHistory(); + }, []); + + const initiateDataProcess = async () => { + setDataStatus('Processing'); + try { + const response = await axios.post('/api/data/initiate'); + setDataStatus('Completed'); + // 更新历史记录 + setHistory(prevHistory => [...prevHistory, response.data]); + } catch (error) { + console.error('Failed to initiate data process:', error); + setDataStatus('Error'); + } + }; + + return ( +
+ + Data Management + + +
+

Data Management

+
+ +
+
+

Current Status: {dataStatus}

+
+
+

History

+
    + {history.map((entry, index) => ( +
  • {entry}
  • // 假设历史记录条目是字符串 + ))} +
+
+
+ + +
+ ); +} \ No newline at end of file diff --git a/mem/quant-trading-platform/pages/evaluation.js b/mem/quant-trading-platform/pages/evaluation.js new file mode 100644 index 0000000..4aa17cf --- /dev/null +++ b/mem/quant-trading-platform/pages/evaluation.js @@ -0,0 +1,54 @@ +// pages/evaluation.js +import { useState, useEffect } from 'react'; +import Head from 'next/head'; +import axios from 'axios'; +import EvaluationResults from '../components/Evaluation/EvaluationResults'; +import PerformanceCharts from '../components/Evaluation/PerformanceCharts'; + +export default function EvaluationPage() { + const [evaluationResults, setEvaluationResults] = useState([]); + const [loading, setLoading] = useState(true); + + useEffect(() => { + // 获取评估结果 + const fetchEvaluationResults = async () => { + setLoading(true); + try { + const response = await axios.get('/api/evaluation/results'); + setEvaluationResults(response.data); + setLoading(false); + } catch (error) { + console.error('Failed to fetch evaluation results:', error); + setLoading(false); + } + }; + + fetchEvaluationResults(); + }, []); + + return ( +
+ + Evaluation Results + + +
+

Evaluation Results

+ {loading ? ( +

Loading evaluation results...

+ ) : ( +
+ + +
+ )} +
+ + +
+ ); +} \ No newline at end of file diff --git a/mem/quant-trading-platform/pages/index.js b/mem/quant-trading-platform/pages/index.js new file mode 100644 index 0000000..8e9e708 --- /dev/null +++ b/mem/quant-trading-platform/pages/index.js @@ -0,0 +1,70 @@ +// pages/index.js +import Link from 'next/link'; +import Head from 'next/head'; +import { Button } from 'element-react'; +import 'element-theme-default'; + +export default function Home() { + return ( +
+ + Quant Trading Platform + + + + +
+

Welcome to the Quant Trading Platform

+

Start managing your quantitative trading strategies with ease.

+ + +
+ + + + +
+ ); +} \ No newline at end of file diff --git a/mem/quant-trading-platform/pages/model.js b/mem/quant-trading-platform/pages/model.js new file mode 100644 index 0000000..e69de29 diff --git a/mem/quant-trading-platform/schemas/config-schema.json b/mem/quant-trading-platform/schemas/config-schema.json new file mode 100644 index 0000000..7fcf07b --- /dev/null +++ b/mem/quant-trading-platform/schemas/config-schema.json @@ -0,0 +1,35 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Configuration", + "type": "object", + "properties": { + "tradingStrategy": { + "type": "string", + "enum": ["meanReversion", "momentum", "pairTrading"], + "description": "The trading strategy to use" + }, + "riskManagement": { + "type": "object", + "properties": { + "maxDrawdown": { + "type": "number", + "description": "Maximum allowed drawdown percentage" + }, + "stopLoss": { + "type": "number", + "description": "Stop loss percentage" + } + }, + "required": ["maxDrawdown"] + }, + "performanceMetrics": { + "type": "array", + "items": { + "type": "string", + "enum": ["sharpeRatio", "sortinoRatio", "calmarRatio"] + }, + "description": "List of performance metrics to evaluate" + } + }, + "required": ["tradingStrategy", "riskManagement", "performanceMetrics"] + } \ No newline at end of file diff --git a/mem/quant-trading-platform/styles/globals.css b/mem/quant-trading-platform/styles/globals.css new file mode 100644 index 0000000..b99eee6 --- /dev/null +++ b/mem/quant-trading-platform/styles/globals.css @@ -0,0 +1,133 @@ +/* styles/globals.css */ + +/* Reset some basic elements */ +html, +body, +p, +ol, +ul, +li, +h1, +h2, +h3, +h4, +h5, +h6, +pre, +form, +fieldset, +input, +textarea, +button { + margin: 0; + padding: 0; + border: 0; +} + +/* Set up a decent box sizing model */ +*, +*:before, +*:after { + box-sizing: border-box; +} + +/* Define some global variables */ +:root { + --primary-color: #3498db; + --secondary-color: #2ecc71; + --accent-color: #9b59b6; + --text-color: #333; + --background-color: #f8f8f8; + --error-color: #e74c3c; +} + +/* Apply a natural box layout model to all elements */ +html { + font-size: 16px; + line-height: 1.5; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; + color: var(--text-color); + background-color: var(--background-color); +} + +/* Global styles */ +body { + min-height: 100vh; + text-rendering: optimizeLegibility; +} + +a { + color: var(--primary-color); + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +/* Container */ +.container { + width: 90%; + max-width: 1200px; + margin: 0 auto; +} + +/* Typography */ +h1, h2, h3, h4, h5, h6 { + color: var(--text-color); + margin-bottom: 0.5rem; +} + +h1 { + font-size: 2.25rem; +} + +h2 { + font-size: 1.75rem; +} + +/* Buttons */ +button, +.button { + display: inline-block; + padding: 0.5rem 1rem; + font-size: 1rem; + color: #fff; + background-color: var(--primary-color); + border: none; + border-radius: 0.3rem; + cursor: pointer; + transition: background-color 0.3s ease; +} + +button:hover, +.button:hover { + background-color: var(--secondary-color); +} + +/* Forms */ +input, +textarea, +select { + width: 100%; + padding: 0.5rem; + margin-bottom: 1rem; + border: 1px solid #ddd; + border-radius: 0.3rem; +} + +/* Utility Classes */ +.text-center { + text-align: center; +} + +.text-error { + color: var(--error-color); +} + +/* Responsive */ +@media (min-width: 768px) { + .container { + width: 80%; + } +} \ No newline at end of file diff --git a/mem/quant-trading-platform/utils/api.js b/mem/quant-trading-platform/utils/api.js new file mode 100644 index 0000000..f176a15 --- /dev/null +++ b/mem/quant-trading-platform/utils/api.js @@ -0,0 +1,75 @@ +// utils/api.js +import axios from 'axios'; + +// Set up a base URL for axios if you have a common part for all endpoints +const API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL || 'http://localhost:3000/api'; + +// Create an axios instance +const api = axios.create({ + baseURL: API_BASE_URL, + // You can add more default settings here + // headers: { 'X-Custom-Header': 'foobar' }, +}); + +// Example API call to get the configuration schema +export const fetchConfigSchema = async () => { + try { + const response = await api.get('/schema/config'); + return response.data; + } catch (error) { + // Handle the error as you prefer, maybe throw it again or return a default value + throw error; + } +}; + +// Example API call to get the configuration +export const fetchConfig = async () => { + try { + const response = await api.get('/config'); + return response.data; + } catch (error) { + throw error; + } +}; + +// Example API call to save the configuration +export const saveConfig = async (configData) => { + try { + const response = await api.post('/config', configData); + return response.data; + } catch (error) { + throw error; + } +}; + +// Example API call to initiate data processing +export const initiateDataProcessing = async () => { + try { + const response = await api.post('/data/initiate'); + return response.data; + } catch (error) { + throw error; + } +}; + +// Example API call to get data processing history +export const fetchDataHistory = async () => { + try { + const response = await api.get('/data/history'); + return response.data; + } catch (error) { + throw error; + } +}; + +// Example API call to get evaluation results +export const fetchEvaluationResults = async () => { + try { + const response = await api.get('/evaluation/results'); + return response.data; + } catch (error) { + throw error; + } +}; + +export default api; \ No newline at end of file