Skip to main content
Glama
architecture_refactor_v2.md11.5 kB
# ValueCell 混合架构重构设计文档 **版本**: 2.0 **日期**: 2025-11-23 **状态**: 待评审 **核心理念**: Java (大脑/状态/业务) + Python (感知/计算/执行) --- ## 1. 整体架构设计 (System Architecture) ### 1.1 架构概述 本方案采用 **多语言微服务架构 (Polyglot Microservices)**。 * **Java 端 (Spring AI Alibaba)**: 作为系统的核心控制塔。负责策略的生命周期管理、状态持久化、Agent 编排与决策、定时任务调度以及用户接口。 * **Python 端 (MCP Server)**: 作为系统的基础设施与工具层。负责连接外部金融数据源、执行复杂的数学/技术指标计算、以及作为执行网关(如对接交易所 API)。 ### 1.2 架构图 (Mermaid) ```mermaid graph TD User[用户/前端] -->|REST API| JavaGateway[Java API Gateway] subgraph "Java Core (Spring AI Alibaba)" JavaGateway --> StrategyMgr[策略管理服务] Scheduler[任务调度器] -->|Trigger| StrategyMgr StrategyMgr --> AgentCore[Agent 核心编排] AgentCore -->|Prompt| LLM[大模型 (Qwen/DeepSeek)] AgentCore -->|State Read/Write| DB[(MySQL 数据库)] AgentCore -->|MCP Client| MCPClient[MCP 客户端] end subgraph "Python Infrastructure (MCP Server)" MCPClient -->|JSON-RPC| PythonServer[Stock Tool MCP] PythonServer -->|Pandas/TA-Lib| CalcEngine[计算引擎] PythonServer -->|CCXT/SDK| ExecutionGateway[交易执行网关] PythonServer -->|HTTP| DataSources[数据源 (Tushare/Akshare/Yahoo)] end ``` ### 1.3 核心职责划分 | 功能模块 | 负责端 | 关键技术栈 | 说明 | | :--- | :--- | :--- | :--- | | **策略管理** | **Java** | Spring Boot, JPA | 策略的增删改查、启动停止 | | **状态持久化** | **Java** | MySQL | 资金、持仓、交易记录的唯一真理来源 | | **任务调度** | **Java** | Spring Scheduled / Quartz | 决定何时触发策略运行 (如每15分钟) | | **智能决策** | **Java** | Spring AI Alibaba | 组装 Context,调用 LLM,解析结果 | | **数据获取** | **Python** | Akshare, Tushare, YFinance | 屏蔽不同数据源的差异,统一格式 | | **指标计算** | **Python** | Pandas, TA-Lib | 处理 MACD, RSI, 布林带等复杂计算 | | **实盘交易** | **Python** | CCXT, Playwright | (可选) 如果需要实盘,Python SDK 更丰富 | --- ## 2. 数据库设计 (Database Schema) 所有业务数据均存储在 Java 端连接的 MySQL 中。 ### 2.1 策略配置表 (`t_strategy`) ```sql CREATE TABLE t_strategy ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '物理主键', biz_id VARCHAR(64) NOT NULL UNIQUE COMMENT '业务ID (UUID)', user_id VARCHAR(64) NOT NULL COMMENT '用户ID', name VARCHAR(100) NOT NULL COMMENT '策略名称', status VARCHAR(20) NOT NULL DEFAULT 'STOPPED' COMMENT '状态: RUNNING, STOPPED, PAUSED, ERROR', -- 核心配置 initial_capital DECIMAL(20, 8) NOT NULL COMMENT '初始资金', base_currency VARCHAR(10) DEFAULT 'USD' COMMENT '本位币', symbols TEXT COMMENT '标的列表 (JSON Array): ["BTC-USD", "ETH-USD"]', interval_period VARCHAR(10) DEFAULT '1h' COMMENT '执行周期: 15m, 1h, 4h', -- 运行时元数据 agent_model VARCHAR(64) COMMENT '使用的模型: qwen-max, deepseek-v3', risk_level VARCHAR(20) DEFAULT 'MEDIUM' COMMENT '风险偏好', created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_user (user_id) ) COMMENT '策略实例配置表'; ``` ### 2.2 策略持仓快照表 (`t_strategy_holding`) 用于记录每次决策后的持仓状态,形成时间序列数据。 ```sql CREATE TABLE t_strategy_holding ( id BIGINT AUTO_INCREMENT PRIMARY KEY, strategy_biz_id VARCHAR(64) NOT NULL COMMENT '关联策略ID', snapshot_time DATETIME NOT NULL COMMENT '快照时间', symbol VARCHAR(32) NOT NULL COMMENT '标的代码', direction VARCHAR(10) NOT NULL COMMENT '方向: LONG, SHORT', quantity DECIMAL(20, 8) NOT NULL COMMENT '持仓数量', avg_entry_price DECIMAL(20, 8) COMMENT '平均持仓成本', -- 动态数据 (来自 Python 查询时的最新价) last_price DECIMAL(20, 8) COMMENT '快照时的市价', unrealized_pnl DECIMAL(20, 8) COMMENT '未实现盈亏', created_at DATETIME DEFAULT CURRENT_TIMESTAMP, INDEX idx_strategy_time (strategy_biz_id, snapshot_time) ) COMMENT '策略持仓快照表'; ``` ### 2.3 策略资产净值表 (`t_strategy_portfolio`) 记录账户整体的资金曲线。 ```sql CREATE TABLE t_strategy_portfolio ( id BIGINT AUTO_INCREMENT PRIMARY KEY, strategy_biz_id VARCHAR(64) NOT NULL, snapshot_time DATETIME NOT NULL, total_equity DECIMAL(20, 8) NOT NULL COMMENT '总权益 (现金 + 持仓市值)', available_cash DECIMAL(20, 8) NOT NULL COMMENT '可用现金', frozen_cash DECIMAL(20, 8) DEFAULT 0 COMMENT '冻结资金', total_pnl DECIMAL(20, 8) COMMENT '累计盈亏', created_at DATETIME DEFAULT CURRENT_TIMESTAMP, INDEX idx_strategy_time (strategy_biz_id, snapshot_time) ) COMMENT '策略资产净值表'; ``` ### 2.4 交易执行记录表 (`t_strategy_trade`) 记录每一次 AI 做出的交易决策。 ```sql CREATE TABLE t_strategy_trade ( id BIGINT AUTO_INCREMENT PRIMARY KEY, trade_biz_id VARCHAR(64) NOT NULL UNIQUE COMMENT '交易流水号', strategy_biz_id VARCHAR(64) NOT NULL, symbol VARCHAR(32) NOT NULL, action VARCHAR(10) NOT NULL COMMENT 'BUY, SELL', trade_type VARCHAR(10) NOT NULL COMMENT 'LONG, SHORT', price DECIMAL(20, 8) NOT NULL COMMENT '成交/委托价格', quantity DECIMAL(20, 8) NOT NULL COMMENT '数量', total_amount DECIMAL(20, 8) NOT NULL COMMENT '成交总额', fee DECIMAL(20, 8) DEFAULT 0 COMMENT '手续费', trade_time DATETIME NOT NULL COMMENT '交易时间', -- AI 思考过程 reasoning TEXT COMMENT 'AI 决策理由', ai_confidence DECIMAL(5, 2) COMMENT 'AI 置信度 (0-100)', created_at DATETIME DEFAULT CURRENT_TIMESTAMP, INDEX idx_strategy (strategy_biz_id) ) COMMENT '策略交易记录表'; ``` --- ## 3. 接口与数据结构设计 (Protocol Design) ### 3.1 Python MCP Tools 定义 Python 端通过 `@mcp.tool` 暴露以下标准接口供 Java 调用。 #### Tool 1: `get_market_technical_analysis` * **描述**: 获取指定标的的技术面分析数据。 * **输入 (Input)**: ```json { "symbol": "BTC-USD", "interval": "1h", "indicators": ["MACD", "RSI", "BOLL", "EMA"] } ``` * **输出 (Output)**: ```json { "symbol": "BTC-USD", "timestamp": "2025-11-23T10:00:00Z", "current_price": 98500.50, "volume_24h": 1500000000, "indicators": { "macd": {"diff": 120.5, "dea": 100.2, "hist": 20.3, "trend": "BULLISH"}, "rsi": {"value": 65.4, "status": "NEUTRAL"}, "boll": {"upper": 99000, "middle": 97000, "lower": 95000, "status": "WITHIN_BAND"} } } ``` #### Tool 2: `get_assets_snapshot` (批量) * **描述**: 批量获取一组标的的最新价格,用于 Java 端计算持仓市值。 * **输入**: `{"symbols": ["BTC-USD", "ETH-USD"]}` * **输出**: `{"BTC-USD": 98500.0, "ETH-USD": 3400.0}` #### Tool 3: `execute_market_order` (可选,实盘用) * **描述**: 发送实盘交易指令。 * **输入**: `{"symbol": "...", "side": "BUY", "quantity": 0.1}` * **输出**: `{"order_id": "...", "status": "FILLED", "avg_price": ...}` ### 3.2 Java 内部领域对象 (Domain Objects) #### `StrategyContext` 用于传递给 LLM 的上下文对象。 ```java public class StrategyContext { // 静态配置 private String strategyName; private String riskProfile; // 动态状态 (来自 DB) private BigDecimal availableCash; private List<PositionSummary> currentPositions; // 市场感知 (来自 Python Tool) private MarketAnalysisData marketData; } ``` #### `AgentDecision` LLM 返回的决策结构(通过 Structured Output Parser 解析)。 ```java public record AgentDecision( String action, // BUY, SELL, HOLD String symbol, BigDecimal quantity, String reasoning, // 思考过程 Double confidence // 置信度 ) {} ``` --- ## 4. Java 端系统设计 (Brain) ### 4.1 核心服务: `StrategyDomainService` * **`runStrategyCycle(Long strategyId)`**: 核心驱动方法。 1. **Load**: 从 DB 加载策略配置和当前持仓。 2. **Sense**: 调用 MCP Client (`get_market_technical_analysis`) 获取数据。 3. **Update State**: 根据最新价格更新持仓的浮动盈亏 (Mark-to-Market)。 4. **Think**: * 构建 Prompt (包含 System Prompt + Context)。 * 调用 `ChatClient` (Spring AI)。 5. **Decide**: 解析 LLM 返回的 JSON。 6. **Act**: * 如果是 Paper Trading: 直接更新 DB 中的资金和持仓表。 * 如果是 Live Trading: 调用 MCP Tool (`execute_market_order`),根据返回结果更新 DB。 7. **Persist**: 保存 `t_strategy_trade` 和 `t_strategy_portfolio`。 ### 4.2 调度模块 * 使用 Spring `@Scheduled` 或 Quartz。 * 扫描 `t_strategy` 表中 `status = 'RUNNING'` 的策略。 * 根据 `interval_period` 判断是否到达执行时间点。 --- ## 5. Python 端系统设计 (Hands) ### 5.1 适配器层 (`adapters/`) * **保持现状**: 继续使用现有的 `AdapterManager` 架构。 * **增强**: 确保 `get_historical_prices` 和 `get_current_price` 对所有数据源(A股/美股/Crypto)都能稳定返回。 ### 5.2 计算层 (`services/technical_service.py`) * **纯函数式设计**: 输入 DataFrame,输出指标 Dict。 * **库**: 强依赖 `pandas`, `ta-lib` (或 `pandas-ta`)。 * **职责**: * 计算移动平均线 (SMA/EMA)。 * 计算动量指标 (RSI, MACD)。 * 计算波动率指标 (ATR, Bollinger Bands)。 * **关键**: 将复杂的数学计算封装在这里,不要让 Java 做数学题。 ### 5.3 MCP 工具层 (`mcp/tools/`) * **清理**: 移除所有与 `Agent`、`Conversation`、`User` 相关的代码。 * **专注**: 只保留 `Market`, `Technical`, `Asset` 相关的 Tools。 * **格式化**: 确保所有 Tool 返回的都是标准的 JSON 格式,方便 Java Jackson 库解析。 --- ## 6. 迁移路线图 (Migration Roadmap) 1. **Phase 1: Python 瘦身** * 在 Python 项目中,标记并废弃 `agents/` 目录。 * 完善 `technical_tools.py`,确保能返回 Java 所需的所有指标数据。 * 验证 Python MCP Server 的独立运行能力。 2. **Phase 2: Java 基础设施搭建** * 创建 Spring Boot 项目 (或在现有项目中新增模块)。 * 集成 `spring-ai-alibaba-starter`。 * 创建上述 MySQL 表结构。 * 生成 POJO 和 Repository 代码。 3. **Phase 3: 核心逻辑迁移** * 在 Java 中实现 `StrategyDomainService`。 * 实现 MCP Client 调用 Python 接口。 * 调试 "Java 触发 -> Python 获取数据 -> Java LLM 决策 -> Java 落库" 的全链路。 4. **Phase 4: 完善与测试** * 实现定时任务调度。 * 添加 API 接口供前端展示策略详情和收益曲线。

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/huweihua123/stock-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server