Quant Agent 完整系统规格
文档状态: Approved Design
版本: 1.0
日期: 2026-07-10
目标市场: A 股
研究频率: 日频横截面选股
自治等级: 受控自治
Alpha 路线: 因子表达式搜索 + 因子组合 + LightGBM/XGBoost
1. 产品定义
Quant Agent 是一个面向 A 股日频横截面选股研究的自治量化研发系统。它以研究目标和约束为输入,自动完成数据获取、数据质检、Alpha 候选生成、模型训练、组合构建、回测、稳健性验证、报告生成以及 Git 提交/PR 创建;Git 合并、生产部署和实盘上线必须由人类审批。
系统定位是"可审计的自动研究工程师",而不是能够绕过风险控制的自动交易员。LLM 负责提出假设、规划实验、选择工具和解释结果;数据清洗、因子计算、模型训练、回测、风险指标及准入门槛由版本化的确定性程序执行。
1.1 目标
- 自动发现具有经济逻辑、统计显著性和样本外稳定性的 Alpha。
- 自动下载并版本化行情、基本面、交易日历和股票状态数据。
- 自动训练、调参、校准和登记机器学习模型。
- 自动执行符合 A 股规则且无前视偏差的回测。
- 自动生成可复现的研究报告、模型卡和部署建议。
- 自动创建独立分支、提交代码和研究产物、创建 PR。
- 经人工批准后自动部署到研究或模拟环境。
- 对每次决策、工具调用、数据和产物提供端到端审计。
1.2 非目标
- V1 不支持分钟级、高频、期权、期货或数字资产研究。
- V1 不自动合并主分支,不自动生产部署,不自动实盘交易。
- 不让 LLM 直接计算收益率、风险指标或回测撮合结果。
- 不以单次最高 Sharpe 作为 Alpha 选择标准。
- 不允许研究代码直接访问生产交易凭证。
1.3 成功标准
系统成功不等于"保证盈利",而是满足以下工程与研究标准:
- 同一代码、配置、数据快照和随机种子可重复得到一致结果。
- 任何报告指标都能追溯到一次不可变的实验运行。
- 自动流水线在单节点失败后可从最近检查点恢复,不重复产生副作用。
- 所有候选策略均经过反泄漏、成本、容量、稳定性和样本外检验。
- 未经人工审批,系统无法合并 Git、生产部署或连接实盘交易。
2. 用户与使用场景
2.1 角色
| 角色 | 权限与职责 |
|---|---|
| Quant Researcher | 提交研究目标、查看实验、否决候选、评论报告 |
| Reviewer | 审阅代码、数据谱系、报告和模型卡,批准或拒绝 Git 合并 |
| Risk Approver | 审核风险、容量、暴露和模拟运行结果,批准生产部署 |
| Platform Admin | 管理工具白名单、MCP Server、密钥、配额和审计策略 |
| Quant Agent | 在授予的研究权限内执行任务,不拥有审批权 |
2.2 典型输入
yaml
research_goal:
universe: CSI800
rebalance_frequency: weekly
prediction_horizon: 5d
objective: maximize_rank_ic_after_cost
benchmark: 000906.SH
constraints:
max_industry_active_weight: 0.03
max_stock_weight: 0.02
max_turnover_one_way: 0.20
exclude_st: true
min_listing_days: 120
min_adv20_cny: 30000000
data_cutoff: "2026-06-30T15:00:00+08:00"
2.3 典型输出
- 可执行的 Alpha 表达式与经济逻辑说明。
- 数据快照 ID、特征集版本、标签定义和训练/验证/测试切分。
- 模型文件、模型卡、参数、随机种子和依赖锁文件。
- 回测结果、交易明细、归因、容量与压力测试。
- HTML/PDF/Markdown 研究报告。
- Git 分支、提交 SHA、PR 链接和审批包。
- 经批准后的部署版本、运行状态和回滚目标。
3. 总体架构
#mermaid-svg-5E2GBXRscPyA8W11{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5E2GBXRscPyA8W11 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5E2GBXRscPyA8W11 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5E2GBXRscPyA8W11 .error-icon{fill:#552222;}#mermaid-svg-5E2GBXRscPyA8W11 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5E2GBXRscPyA8W11 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5E2GBXRscPyA8W11 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5E2GBXRscPyA8W11 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5E2GBXRscPyA8W11 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5E2GBXRscPyA8W11 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5E2GBXRscPyA8W11 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5E2GBXRscPyA8W11 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5E2GBXRscPyA8W11 .marker.cross{stroke:#333333;}#mermaid-svg-5E2GBXRscPyA8W11 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5E2GBXRscPyA8W11 p{margin:0;}#mermaid-svg-5E2GBXRscPyA8W11 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-5E2GBXRscPyA8W11 .cluster-label text{fill:#333;}#mermaid-svg-5E2GBXRscPyA8W11 .cluster-label span{color:#333;}#mermaid-svg-5E2GBXRscPyA8W11 .cluster-label span p{background-color:transparent;}#mermaid-svg-5E2GBXRscPyA8W11 .label text,#mermaid-svg-5E2GBXRscPyA8W11 span{fill:#333;color:#333;}#mermaid-svg-5E2GBXRscPyA8W11 .node rect,#mermaid-svg-5E2GBXRscPyA8W11 .node circle,#mermaid-svg-5E2GBXRscPyA8W11 .node ellipse,#mermaid-svg-5E2GBXRscPyA8W11 .node polygon,#mermaid-svg-5E2GBXRscPyA8W11 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5E2GBXRscPyA8W11 .rough-node .label text,#mermaid-svg-5E2GBXRscPyA8W11 .node .label text,#mermaid-svg-5E2GBXRscPyA8W11 .image-shape .label,#mermaid-svg-5E2GBXRscPyA8W11 .icon-shape .label{text-anchor:middle;}#mermaid-svg-5E2GBXRscPyA8W11 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-5E2GBXRscPyA8W11 .rough-node .label,#mermaid-svg-5E2GBXRscPyA8W11 .node .label,#mermaid-svg-5E2GBXRscPyA8W11 .image-shape .label,#mermaid-svg-5E2GBXRscPyA8W11 .icon-shape .label{text-align:center;}#mermaid-svg-5E2GBXRscPyA8W11 .node.clickable{cursor:pointer;}#mermaid-svg-5E2GBXRscPyA8W11 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-5E2GBXRscPyA8W11 .arrowheadPath{fill:#333333;}#mermaid-svg-5E2GBXRscPyA8W11 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5E2GBXRscPyA8W11 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5E2GBXRscPyA8W11 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5E2GBXRscPyA8W11 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-5E2GBXRscPyA8W11 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5E2GBXRscPyA8W11 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-5E2GBXRscPyA8W11 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5E2GBXRscPyA8W11 .cluster text{fill:#333;}#mermaid-svg-5E2GBXRscPyA8W11 .cluster span{color:#333;}#mermaid-svg-5E2GBXRscPyA8W11 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-5E2GBXRscPyA8W11 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5E2GBXRscPyA8W11 rect.text{fill:none;stroke-width:0;}#mermaid-svg-5E2GBXRscPyA8W11 .icon-shape,#mermaid-svg-5E2GBXRscPyA8W11 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5E2GBXRscPyA8W11 .icon-shape p,#mermaid-svg-5E2GBXRscPyA8W11 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-5E2GBXRscPyA8W11 .icon-shape .label rect,#mermaid-svg-5E2GBXRscPyA8W11 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5E2GBXRscPyA8W11 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-5E2GBXRscPyA8W11 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-5E2GBXRscPyA8W11 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} approval
approval
Researcher / Reviewer
Control Plane API
Workflow Orchestrator
Planner Agent
Memory Service
Policy & Approval Engine
Event Bus
Data Agent
Alpha Discovery Agent
Training Agent
Backtest Agent
Reflection Agent
Report Agent
Git Agent
Deploy Agent
MCP Gateway
Data Lake / Warehouse
Experiment & Model Registry
Isolated Compute Runners
Git Provider
CI/CD Platform
Observability / Audit
3.1 分层原则
- 控制平面: 接收目标、维护状态机、分配任务、预算和权限。
- 推理平面: Planner 和各专业 Agent 进行规划、假设生成与解释。
- 执行平面: 沙箱中的确定性工具运行数据、模型和回测代码。
- 存储平面: 对象存储、元数据仓库、向量索引、实验与模型注册表。
- 治理平面: 审批、策略、密钥、审计、成本与资源配额。
3.2 推荐技术栈
| 能力 | 推荐实现 | 可替代实现 |
|---|---|---|
| API | FastAPI + Pydantic | Go / Spring Boot |
| 工作流 | Temporal | Dagster / Prefect |
| Agent 图 | LangGraph(薄层使用) | 自研状态机 |
| 消息总线 | Kafka / Redpanda | Redis Streams |
| 元数据 | PostgreSQL | MySQL |
| 对象存储 | S3 / MinIO + Parquet | HDFS |
| 特征查询 | DuckDB + Polars | Spark |
| 实验/模型注册 | MLflow | Weights & Biases |
| 训练 | LightGBM、XGBoost、Optuna | CatBoost |
| 回测 | 自研向量化日频引擎或 Qlib 适配层 | Backtrader |
| 报告 | Jinja2 + Plotly + WeasyPrint | Quarto |
| 可观测性 | OpenTelemetry + Prometheus + Grafana | Datadog |
| 密钥 | Vault / 云密钥管理 | Kubernetes Secrets |
| 部署 | Docker + Kubernetes + Argo CD | Nomad |
4. Agent Workflow
4.1 主工作流
#mermaid-svg-DvEnqDlK73mnL9Ll{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DvEnqDlK73mnL9Ll .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DvEnqDlK73mnL9Ll .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DvEnqDlK73mnL9Ll .error-icon{fill:#552222;}#mermaid-svg-DvEnqDlK73mnL9Ll .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DvEnqDlK73mnL9Ll .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DvEnqDlK73mnL9Ll .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DvEnqDlK73mnL9Ll .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DvEnqDlK73mnL9Ll .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DvEnqDlK73mnL9Ll .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DvEnqDlK73mnL9Ll .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DvEnqDlK73mnL9Ll .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DvEnqDlK73mnL9Ll .marker.cross{stroke:#333333;}#mermaid-svg-DvEnqDlK73mnL9Ll svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DvEnqDlK73mnL9Ll p{margin:0;}#mermaid-svg-DvEnqDlK73mnL9Ll .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-DvEnqDlK73mnL9Ll .cluster-label text{fill:#333;}#mermaid-svg-DvEnqDlK73mnL9Ll .cluster-label span{color:#333;}#mermaid-svg-DvEnqDlK73mnL9Ll .cluster-label span p{background-color:transparent;}#mermaid-svg-DvEnqDlK73mnL9Ll .label text,#mermaid-svg-DvEnqDlK73mnL9Ll span{fill:#333;color:#333;}#mermaid-svg-DvEnqDlK73mnL9Ll .node rect,#mermaid-svg-DvEnqDlK73mnL9Ll .node circle,#mermaid-svg-DvEnqDlK73mnL9Ll .node ellipse,#mermaid-svg-DvEnqDlK73mnL9Ll .node polygon,#mermaid-svg-DvEnqDlK73mnL9Ll .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DvEnqDlK73mnL9Ll .rough-node .label text,#mermaid-svg-DvEnqDlK73mnL9Ll .node .label text,#mermaid-svg-DvEnqDlK73mnL9Ll .image-shape .label,#mermaid-svg-DvEnqDlK73mnL9Ll .icon-shape .label{text-anchor:middle;}#mermaid-svg-DvEnqDlK73mnL9Ll .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DvEnqDlK73mnL9Ll .rough-node .label,#mermaid-svg-DvEnqDlK73mnL9Ll .node .label,#mermaid-svg-DvEnqDlK73mnL9Ll .image-shape .label,#mermaid-svg-DvEnqDlK73mnL9Ll .icon-shape .label{text-align:center;}#mermaid-svg-DvEnqDlK73mnL9Ll .node.clickable{cursor:pointer;}#mermaid-svg-DvEnqDlK73mnL9Ll .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-DvEnqDlK73mnL9Ll .arrowheadPath{fill:#333333;}#mermaid-svg-DvEnqDlK73mnL9Ll .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DvEnqDlK73mnL9Ll .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DvEnqDlK73mnL9Ll .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DvEnqDlK73mnL9Ll .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DvEnqDlK73mnL9Ll .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DvEnqDlK73mnL9Ll .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-DvEnqDlK73mnL9Ll .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DvEnqDlK73mnL9Ll .cluster text{fill:#333;}#mermaid-svg-DvEnqDlK73mnL9Ll .cluster span{color:#333;}#mermaid-svg-DvEnqDlK73mnL9Ll div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DvEnqDlK73mnL9Ll .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DvEnqDlK73mnL9Ll rect.text{fill:none;stroke-width:0;}#mermaid-svg-DvEnqDlK73mnL9Ll .icon-shape,#mermaid-svg-DvEnqDlK73mnL9Ll .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DvEnqDlK73mnL9Ll .icon-shape p,#mermaid-svg-DvEnqDlK73mnL9Ll .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-DvEnqDlK73mnL9Ll .icon-shape .label rect,#mermaid-svg-DvEnqDlK73mnL9Ll .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DvEnqDlK73mnL9Ll .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DvEnqDlK73mnL9Ll .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DvEnqDlK73mnL9Ll :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 修订假设
修订数据/特征
修订模型
淘汰
通过
拒绝
批准
拒绝
批准
接收研究目标
策略与权限预检
Planner 生成 Research Plan
数据目录检索与缺口分析
下载 / 更新 / 质检 / 快照
生成 Alpha 假设与候选表达式
反泄漏与表达式静态检查
批量计算因子
单因子检验与去冗余
特征集与标签固化
Walk-forward 训练与调参
组合构建与约束求解
事件驱动回测
稳健性 / 容量 / 压力测试
Reflection Gate
归档失败知识
生成报告与模型卡
创建 Git 分支与提交
创建 PR
人工合并审批
CI 构建研究/模拟制品
生产部署审批
保留候选版本
部署 + 健康检查 + 可回滚
4.2 状态机
text
DRAFT -> PLANNED -> DATA_READY -> DISCOVERING -> TRAINING -> BACKTESTING
-> REFLECTING -> REPORTING -> AWAITING_MERGE_APPROVAL
-> MERGED -> AWAITING_DEPLOY_APPROVAL -> DEPLOYING -> DEPLOYED
任意可执行状态 -> RETRY_WAIT -> 原状态
任意可执行状态 -> PAUSED_BY_POLICY
任意状态 -> CANCELLED
失败且不可恢复 -> FAILED
每个状态变更必须写入 workflow_event,包含 run_id、前后状态、原因、触发者、时间、trace ID 和关联产物。
4.3 Agent 职责
| Agent | 输入 | 核心职责 | 输出 |
|---|---|---|---|
| Planner | 研究目标、预算、历史记忆 | 分解 DAG、定义验收门槛、分配预算 | ResearchPlan |
| Data | 计划、数据目录 | 选择数据源、增量下载、校验、快照 | DatasetSnapshot |
| Alpha Discovery | 数据字典、失败知识 | 生成经济假设、表达式搜索、初筛 | AlphaCandidate\[\] |
| Training | 特征集、标签、切分 | Walk-forward 训练、调参、校准 | ModelVersion |
| Backtest | 信号、组合约束、市场规则 | 撮合、成本、归因、压力测试 | BacktestRun |
| Reflection | 全部证据与门槛 | 诊断失败、决定修订/淘汰/晋级 | ReflectionDecision |
| Report | 实验谱系与指标 | 生成报告、模型卡、审批摘要 | ReportBundle |
| Git | 批准的变更包 | 分支、commit、push、PR;禁止 merge | PullRequest |
| Deploy | 已合并版本、审批令牌 | 构建、发布、健康检查、回滚 | Deployment |
4.4 并发和预算
- 并行只用于彼此独立的候选因子、随机种子、模型配置和压力场景。
- 每个研究运行必须定义 token、CPU、GPU、内存、存储、API 调用和墙钟时间上限。
- 触达软限额时 Planner 缩小搜索空间;触达硬限额时状态转为
PAUSED_BY_POLICY。 - 全局并发、数据源 QPS、训练并发和回测并发由租户及环境配额控制。
5. Memory
5.1 Memory 分层
#mermaid-svg-VUI0exik642eca1A{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-VUI0exik642eca1A .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-VUI0exik642eca1A .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-VUI0exik642eca1A .error-icon{fill:#552222;}#mermaid-svg-VUI0exik642eca1A .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VUI0exik642eca1A .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-VUI0exik642eca1A .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VUI0exik642eca1A .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VUI0exik642eca1A .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-VUI0exik642eca1A .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VUI0exik642eca1A .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VUI0exik642eca1A .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VUI0exik642eca1A .marker.cross{stroke:#333333;}#mermaid-svg-VUI0exik642eca1A svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VUI0exik642eca1A p{margin:0;}#mermaid-svg-VUI0exik642eca1A .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-VUI0exik642eca1A .cluster-label text{fill:#333;}#mermaid-svg-VUI0exik642eca1A .cluster-label span{color:#333;}#mermaid-svg-VUI0exik642eca1A .cluster-label span p{background-color:transparent;}#mermaid-svg-VUI0exik642eca1A .label text,#mermaid-svg-VUI0exik642eca1A span{fill:#333;color:#333;}#mermaid-svg-VUI0exik642eca1A .node rect,#mermaid-svg-VUI0exik642eca1A .node circle,#mermaid-svg-VUI0exik642eca1A .node ellipse,#mermaid-svg-VUI0exik642eca1A .node polygon,#mermaid-svg-VUI0exik642eca1A .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VUI0exik642eca1A .rough-node .label text,#mermaid-svg-VUI0exik642eca1A .node .label text,#mermaid-svg-VUI0exik642eca1A .image-shape .label,#mermaid-svg-VUI0exik642eca1A .icon-shape .label{text-anchor:middle;}#mermaid-svg-VUI0exik642eca1A .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-VUI0exik642eca1A .rough-node .label,#mermaid-svg-VUI0exik642eca1A .node .label,#mermaid-svg-VUI0exik642eca1A .image-shape .label,#mermaid-svg-VUI0exik642eca1A .icon-shape .label{text-align:center;}#mermaid-svg-VUI0exik642eca1A .node.clickable{cursor:pointer;}#mermaid-svg-VUI0exik642eca1A .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-VUI0exik642eca1A .arrowheadPath{fill:#333333;}#mermaid-svg-VUI0exik642eca1A .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-VUI0exik642eca1A .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-VUI0exik642eca1A .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VUI0exik642eca1A .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-VUI0exik642eca1A .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VUI0exik642eca1A .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-VUI0exik642eca1A .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-VUI0exik642eca1A .cluster text{fill:#333;}#mermaid-svg-VUI0exik642eca1A .cluster span{color:#333;}#mermaid-svg-VUI0exik642eca1A div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-VUI0exik642eca1A .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-VUI0exik642eca1A rect.text{fill:none;stroke-width:0;}#mermaid-svg-VUI0exik642eca1A .icon-shape,#mermaid-svg-VUI0exik642eca1A .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VUI0exik642eca1A .icon-shape p,#mermaid-svg-VUI0exik642eca1A .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-VUI0exik642eca1A .icon-shape .label rect,#mermaid-svg-VUI0exik642eca1A .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VUI0exik642eca1A .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-VUI0exik642eca1A .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-VUI0exik642eca1A :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Working Memory
当前运行上下文
Episodic Memory
历史实验与决策
Semantic Memory
领域知识与数据字典
Procedural Memory
流程/工具/策略版本
Artifact Memory
数据/特征/模型/报告
Hybrid Retrieval
Planner / Agents
| 类型 | 内容 | 存储 | 生命周期 |
|---|---|---|---|
| Working | 当前计划、最近工具结果、预算、待办 | Redis/PostgreSQL | 单次运行,结束后摘要 |
| Episodic | 实验、决策、失败原因、反思 | PostgreSQL + 向量索引 | 长期 |
| Semantic | A 股规则、因子定义、数据字段、研究规范 | 文档库 + 向量索引 | 版本化长期 |
| Procedural | Prompt、工具 Schema、工作流、策略规则 | Git / Registry | 版本化长期 |
| Artifact | Parquet、模型、图表、报告、日志 | 对象存储 | 按保留策略 |
5.2 Memory Record
json
{
"memory_id": "mem_01J...",
"tenant_id": "team_quant",
"type": "episodic",
"scope": "alpha_discovery",
"summary": "20 日反转在小盘股有效,但成本后衰减明显",
"evidence_refs": ["exp_01J...", "bt_01J..."],
"tags": ["reversal", "CSI800", "turnover"],
"valid_from": "2026-07-10T00:00:00Z",
"knowledge_cutoff": "2026-06-30T07:00:00Z",
"confidence": 0.78,
"created_by": "reflection-agent@1.0",
"policy": {"ttl_days": 730, "contains_secret": false}
}
5.3 检索规则
- 使用结构化过滤 + BM25 + 向量相似度的混合检索。
- 必须按租户、项目、市场、频率和
knowledge_cutoff过滤。 - 优先检索失败实验和近似候选,防止重复探索。
- Memory 只提供建议;关键事实必须回到证据产物验证。
- 报告、网页或工具输出均视为不可信内容,不得覆盖系统策略或工具权限。
5.4 写入规则
- 工具原始输出不直接进入长期记忆,只保存引用和经过验证的摘要。
- Reflection Agent 只能提出记忆写入建议,由 Memory Policy 校验后落库。
- 冲突事实并存并标记版本、证据和置信度,不做静默覆盖。
- 支持按运行、用户或数据源执行删除和保留策略。
6. Planning
6.1 分层计划
- Mission Plan: 研究目标、宇宙、预测周期、基准、风险约束和预算。
- Research Plan: 数据、假设族、标签、切分、检验、模型和晋级门槛。
- Execution DAG: 可重试的工具任务、依赖、输入输出和幂等键。
- Next Action: Agent 每轮只能选择一个有明确 Schema 的动作。
6.2 ResearchPlan Schema
json
{
"plan_id": "plan_01J...",
"objective": "发现 CSI800 中预测未来 5 日超额收益的稳健信号",
"as_of": "2026-06-30T15:00:00+08:00",
"universe": "CSI800_POINT_IN_TIME",
"hypothesis_families": ["reversal", "quality", "liquidity", "interaction"],
"label": "next_5d_vwap_to_vwap_excess_return",
"validation": {
"scheme": "purged_walk_forward",
"train_years": 5,
"validation_months": 12,
"test_months": 12,
"embargo_days": 5
},
"gates": {
"min_oos_rank_ic": 0.02,
"min_icir": 0.5,
"min_net_sharpe": 1.0,
"max_drawdown": 0.20,
"max_one_way_turnover": 0.20
},
"budget": {
"max_candidates": 500,
"max_training_jobs": 80,
"max_wall_clock_hours": 8,
"max_cost_cny": 500
}
}
6.3 Planner 约束
- 计划必须在任何数据下载或训练前冻结
as_of和数据可得时间规则。 - 每个任务声明前置条件、预期产物、验证器、超时、重试和补偿动作。
- 修改标签、宇宙、数据切分或主要回测假设会生成新的
plan_revision。 - Planner 无权降低组织级硬门槛;只能提高门槛或请求人工例外。
- 计划变化必须说明新证据、影响范围和已消耗预算。
7. Alpha 自动发现
7.1 搜索空间
- 原子字段: OHLCV、成交额、换手率、市值、估值、财务质量、分析师一致预期(若有可靠 PIT 数据)。
- 时间算子: delay、delta、rolling mean/std/min/max/rank/corr、decay。
- 横截面算子: rank、zscore、winsorize、neutralize、group rank。
- 组合算子: 加减乘除、条件、截断;限制表达式深度和复杂度。
- 模型: 线性基线、LightGBM、XGBoost;深度模型不进入 V1。
7.2 候选生成
- 从经济假设模板、历史失败知识和数据字典生成候选。
- 符号搜索使用语法树而非任意 Python 代码。
- 候选先经过类型、单位、可得时间、复杂度和重复性静态检查。
- 以多目标优化选择候选:样本外 IC、稳定性、换手、复杂度、与已有因子相关性。
7.3 防止数据窥探
- 研究运行开始前登记候选生成空间和最大试验次数。
- 记录全部候选,包括失败候选,估计多重检验压力。
- 使用 Deflated Sharpe Ratio、Probability of Backtest Overfitting 或等价方法。
- 最终锁箱测试集只能在候选冻结后运行;同一研究任务默认只允许解锁一次。
- 任何读取测试期结果后发生的修改都创建新研究世代,不能沿用原测试结论。
8. 数据系统
8.1 数据源
V1 推荐优先使用 Tushare Pro 或合规商业数据源,并为交易所公开数据提供校验适配器。必须确认数据许可允许自动下载、缓存和内部衍生使用。
必需数据集:
- 交易日历、股票主数据、上市/退市日期、名称与状态变更。
- 日线未复权行情、复权因子、停牌、涨跌停价格。
- 指数成分及权重的历史时点版本,禁止使用当前成分回填历史。
- 财务数据及公告日期,采用 point-in-time 可得性。
- ST/*ST、风险警示、行业分类的历史变化。
8.2 数据分层
text
RAW 原始响应,不修改,可校验 checksum
CURATED 类型统一、去重、主键和质量规则通过
PIT 按实际可得时间对齐的时点数据
FEATURE 版本化特征和标签
SERVING 研究/模拟环境读取的发布快照
8.3 快照与谱系
每个 dataset_snapshot_id 固定以下内容:数据源版本、请求参数、下载时间、覆盖区间、对象 checksum、Schema、质量报告、可得时间规则和上游快照。任何训练、回测或报告只引用快照 ID,不引用可变的"最新表"。
8.4 数据质量门槛
- 主键唯一性、Schema、空值率、覆盖率、数值范围和跨源一致性。
- 交易日缺口、复权连续性、价格/成交量异常跳变。
- 公告日在报告期之前、未来成分泄漏、退市样本缺失等专门检查。
- 质量硬失败阻断流水线;软异常进入报告并降低置信度。
9. 模型训练
9.1 标签与切分
- 默认标签:未来 5 个交易日 VWAP-to-VWAP 相对基准或行业的收益。
- 特征必须滞后到决策时刻真实可得;财务字段以公告日对齐。
- 使用 Purged Walk-forward,purge/embargo 至少覆盖标签持有期。
- 预处理器只在训练窗口拟合,并与模型一同版本化。
9.2 训练流程
- 训练线性或简单排序基线。
- LightGBM/XGBoost 使用受限搜索空间进行 Optuna 调参。
- 优化目标综合 Rank IC、ICIR、稳定性和预估换手,而非训练损失单指标。
- 多随机种子训练并报告均值、方差和最差结果。
- 用 SHAP、置换重要性和单调性检查解释模型。
- 登记模型、依赖、特征、数据、代码 SHA、参数和指标。
9.3 模型准入
- 必须优于简单基线,并在多数 walk-forward 窗口保持方向一致。
- 不允许任何单特征支配模型且缺乏经济解释。
- 训练/验证性能差距超过策略阈值时标记过拟合并阻断晋级。
- 模型文件必须来自隔离训练任务并通过恶意反序列化安全策略;优先使用安全格式。
10. 回测规格
10.1 时间语义
默认信号在 T 日收盘数据完整后生成,订单最早在 T+1 执行。报告必须明确决策时刻、下单时刻、成交价格假设和持有周期。
10.2 A 股市场规则
- 股票交易遵循 T+1 卖出约束。
- 停牌期间不能成交。
- 涨停时买单不得假设成交,跌停时卖单不得假设成交;可配置更保守的成交概率模型。
- 使用历史 ST 状态、上市天数、退市和指数成分。
- 佣金、印花税、过户费按交易方向和历史生效日期配置。
- 滑点使用成交额参与率、ADV 和冲击函数建模。
- 禁止用后复权价格直接模拟现金交易;收益计算和公司行动需保持一致。
10.3 组合构建
- 模型分数经行业/市值中性化与异常值处理后进入优化器。
- 约束包括单股权重、行业主动权重、风格暴露、换手、流动性和持仓数。
- 优化失败时使用确定性降级策略,并在报告中标记。
- 目标组合到实际成交之间保留未成交订单和现金状态。
10.4 指标
- 收益:年化收益、超额收益、胜率、月度/年度分布。
- 风险:波动率、Sharpe、Sortino、最大回撤、Calmar、VaR/ES。
- 信号:Pearson/Spearman IC、ICIR、分层收益、单调性、衰减。
- 交易:换手、成本、滑点、成交率、容量、平均持有期。
- 暴露:行业、市值、Beta、风格和集中度。
- 稳健性:分时期、牛熊市、行业、规模、参数扰动、成本倍增。
10.5 建议晋级门槛
这些是组织可配置的初始值,不是收益承诺:
| 维度 | 建议门槛 |
|---|---|
| 样本外 Rank IC | >= 0.02 |
| 样本外 ICIR | >= 0.5 |
| 成本后 Sharpe | >= 1.0 |
| 最大回撤 | <= 20% |
| 年化单边换手 | 与策略约束一致且成本后仍通过 |
| 窗口稳定性 | 至少 70% OOS 窗口 IC 为正 |
| 成本压力 | 2 倍基准成本下不出现结论性崩溃 |
| 容量 | 目标资金规模下参与率不超限 |
| 泄漏测试 | 100% 通过 |
11. Reflection
11.1 Reflection Loop
#mermaid-svg-drZGuLtKnVEKjzMA{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-drZGuLtKnVEKjzMA .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-drZGuLtKnVEKjzMA .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-drZGuLtKnVEKjzMA .error-icon{fill:#552222;}#mermaid-svg-drZGuLtKnVEKjzMA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-drZGuLtKnVEKjzMA .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-drZGuLtKnVEKjzMA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-drZGuLtKnVEKjzMA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-drZGuLtKnVEKjzMA .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-drZGuLtKnVEKjzMA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-drZGuLtKnVEKjzMA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-drZGuLtKnVEKjzMA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-drZGuLtKnVEKjzMA .marker.cross{stroke:#333333;}#mermaid-svg-drZGuLtKnVEKjzMA svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-drZGuLtKnVEKjzMA p{margin:0;}#mermaid-svg-drZGuLtKnVEKjzMA .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-drZGuLtKnVEKjzMA .cluster-label text{fill:#333;}#mermaid-svg-drZGuLtKnVEKjzMA .cluster-label span{color:#333;}#mermaid-svg-drZGuLtKnVEKjzMA .cluster-label span p{background-color:transparent;}#mermaid-svg-drZGuLtKnVEKjzMA .label text,#mermaid-svg-drZGuLtKnVEKjzMA span{fill:#333;color:#333;}#mermaid-svg-drZGuLtKnVEKjzMA .node rect,#mermaid-svg-drZGuLtKnVEKjzMA .node circle,#mermaid-svg-drZGuLtKnVEKjzMA .node ellipse,#mermaid-svg-drZGuLtKnVEKjzMA .node polygon,#mermaid-svg-drZGuLtKnVEKjzMA .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-drZGuLtKnVEKjzMA .rough-node .label text,#mermaid-svg-drZGuLtKnVEKjzMA .node .label text,#mermaid-svg-drZGuLtKnVEKjzMA .image-shape .label,#mermaid-svg-drZGuLtKnVEKjzMA .icon-shape .label{text-anchor:middle;}#mermaid-svg-drZGuLtKnVEKjzMA .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-drZGuLtKnVEKjzMA .rough-node .label,#mermaid-svg-drZGuLtKnVEKjzMA .node .label,#mermaid-svg-drZGuLtKnVEKjzMA .image-shape .label,#mermaid-svg-drZGuLtKnVEKjzMA .icon-shape .label{text-align:center;}#mermaid-svg-drZGuLtKnVEKjzMA .node.clickable{cursor:pointer;}#mermaid-svg-drZGuLtKnVEKjzMA .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-drZGuLtKnVEKjzMA .arrowheadPath{fill:#333333;}#mermaid-svg-drZGuLtKnVEKjzMA .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-drZGuLtKnVEKjzMA .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-drZGuLtKnVEKjzMA .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-drZGuLtKnVEKjzMA .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-drZGuLtKnVEKjzMA .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-drZGuLtKnVEKjzMA .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-drZGuLtKnVEKjzMA .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-drZGuLtKnVEKjzMA .cluster text{fill:#333;}#mermaid-svg-drZGuLtKnVEKjzMA .cluster span{color:#333;}#mermaid-svg-drZGuLtKnVEKjzMA div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-drZGuLtKnVEKjzMA .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-drZGuLtKnVEKjzMA rect.text{fill:none;stroke-width:0;}#mermaid-svg-drZGuLtKnVEKjzMA .icon-shape,#mermaid-svg-drZGuLtKnVEKjzMA .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-drZGuLtKnVEKjzMA .icon-shape p,#mermaid-svg-drZGuLtKnVEKjzMA .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-drZGuLtKnVEKjzMA .icon-shape .label rect,#mermaid-svg-drZGuLtKnVEKjzMA .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-drZGuLtKnVEKjzMA .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-drZGuLtKnVEKjzMA .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-drZGuLtKnVEKjzMA :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Revise Data
Revise Alpha
Revise Model
Reject
Promote
Evidence Bundle
Critic: 检查证据完整性
Diagnoser: 定位失败类型
Judge
数据修订
假设修订
训练修订
归档失败知识
生成审批包
11.2 反思输入
- 计划与所有 revision。
- 数据质量和可得时间报告。
- 候选全集、试验次数和多重检验统计。
- 训练、验证、测试、回测、归因和压力测试结果。
- 工具错误、重试、资源消耗和策略违规。
- 与历史相似实验及失败记忆的对比。
11.3 决策分类
| 决策 | 条件 | 后续动作 |
|---|---|---|
| RETRY | 临时性工具/资源故障 | 使用同一幂等键重试 |
| REVISE_DATA | 缺失、漂移、PIT 或质量问题 | 回到数据阶段,增加 plan revision |
| REVISE_ALPHA | 逻辑弱、冗余、衰减、成本过高 | 修改候选族,不得读取锁箱后继续微调 |
| REVISE_MODEL | 过拟合、不稳定、解释异常 | 缩小复杂度或改变训练方案 |
| REJECT | 硬门槛失败或预算耗尽 | 归档证据和可复用失败结论 |
| PROMOTE | 全部门槛通过且证据完整 | 生成报告和审批包 |
11.4 防止无限循环
- 每个阶段设最大 revision 次数和总预算。
- 同类失败连续两次后必须改变假设或终止,不能只换随机种子。
- Reflection 不能自行修改硬门槛或扩大预算。
- 所有晋级结论必须引用机器可验证的 Gate Result。
12. Tool Calling
12.1 调用链
Audit Store Worker MCP Server Policy Engine Tool Gateway Agent Audit Store Worker MCP Server Policy Engine Tool Gateway Agent #mermaid-svg-Yx2gQ9SWa1iGY2CI{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Yx2gQ9SWa1iGY2CI .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .error-icon{fill:#552222;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .marker.cross{stroke:#333333;}#mermaid-svg-Yx2gQ9SWa1iGY2CI svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Yx2gQ9SWa1iGY2CI p{margin:0;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Yx2gQ9SWa1iGY2CI text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-Yx2gQ9SWa1iGY2CI .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-Yx2gQ9SWa1iGY2CI #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .sequenceNumber{fill:white;}#mermaid-svg-Yx2gQ9SWa1iGY2CI #sequencenumber{fill:#333;}#mermaid-svg-Yx2gQ9SWa1iGY2CI #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .messageText{fill:#333;stroke:none;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .labelText,#mermaid-svg-Yx2gQ9SWa1iGY2CI .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .loopText,#mermaid-svg-Yx2gQ9SWa1iGY2CI .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-Yx2gQ9SWa1iGY2CI .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .noteText,#mermaid-svg-Yx2gQ9SWa1iGY2CI .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .actorPopupMenu{position:absolute;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-Yx2gQ9SWa1iGY2CI .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Yx2gQ9SWa1iGY2CI .actor-man circle,#mermaid-svg-Yx2gQ9SWa1iGY2CI line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-Yx2gQ9SWa1iGY2CI :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} tool_call(name, args, context) Schema 校验 + 幂等键 authorize(subject, action, resource) allow / deny / approval_required MCP tools/call 隔离任务 result + artifact refs structured result append audit event verified result / typed error
12.2 工具规范
每个工具必须声明:
- 名称、版本、描述和 JSON Schema。
read、compute、write、external_side_effect风险级别。- 所需 scope、资源上限、超时和最大返回大小。
- 是否幂等、幂等键组成、重试策略和补偿动作。
- 输入/输出中的敏感字段和日志脱敏策略。
- 可验证器,例如 checksum、行数、指标范围或签名。
12.3 通用调用信封
json
{
"request_id": "req_01J...",
"run_id": "run_01J...",
"plan_id": "plan_01J...",
"agent": "data-agent@1.0",
"tool": "market_data.fetch_daily@1.0",
"arguments": {},
"idempotency_key": "sha256(...) ",
"deadline": "2026-07-10T10:30:00Z",
"scopes": ["data:read", "artifact:write"],
"trace_id": "00-..."
}
12.4 错误模型
json
{
"ok": false,
"error": {
"code": "DATA_RATE_LIMITED",
"category": "transient",
"message": "Provider quota exceeded",
"retry_after_seconds": 60,
"details_ref": "artifact://logs/..."
}
}
错误分类为 validation、policy、transient、permanent、data_quality 和 internal。仅 transient 可自动指数退避重试;具有外部副作用的工具在重试前必须查询幂等状态。
12.5 沙箱
- 代码执行使用无生产凭证的临时容器,默认禁网、只读基础镜像和非 root 用户。
- 数据访问通过受控工具或短期签名 URL,不挂载完整密钥。
- 限制 CPU、内存、磁盘、进程数、执行时间和输出大小。
- 依赖只能来自锁定仓库和 allowlist;生成 SBOM 并扫描漏洞。
13. MCP 接口
13.1 MCP 拓扑
Agent 只连接内部 MCP Gateway。Gateway 根据工具命名空间路由到独立 Server,并统一执行认证、授权、限流、Schema 校验、审计和结果截断。
text
mcp-gateway
├── market-data-mcp
├── feature-store-mcp
├── experiment-mcp
├── backtest-mcp
├── artifact-mcp
├── git-mcp
├── deploy-mcp
└── observability-mcp
13.2 Resources
| URI 模板 | 含义 |
|---|---|
dataset://catalog/{dataset} |
数据集 Schema、覆盖、许可和新鲜度 |
dataset://snapshot/{snapshot_id} |
不可变数据快照元数据 |
feature://definition/{feature_id} |
因子表达式、依赖和版本 |
experiment://run/{run_id} |
实验参数、指标和谱系 |
model://version/{model_id} |
模型卡、签名和阶段 |
backtest://run/{backtest_id} |
回测配置、指标和交易产物 |
artifact://sha256/{digest} |
内容寻址产物元数据 |
policy://gate/{gate_name} |
当前门槛和策略版本 |
git://repo/{repo}/pr/{number} |
PR 状态和检查结果 |
deploy://environment/{env} |
环境版本与健康状态 |
13.3 Prompts
| Prompt | 用途 |
|---|---|
plan_quant_research |
将研究目标转换为 ResearchPlan 草案 |
generate_alpha_hypotheses |
基于字段、约束和失败知识生成候选假设 |
critique_experiment |
对证据包执行结构化批评,不计算指标 |
summarize_approval_package |
为 Reviewer 生成带证据引用的摘要 |
Prompt 只是版本化模板,不授予额外工具权限。
13.4 核心 Tools
market-data-mcp
text
market_data.catalog(query) -> DatasetDescriptor[]
market_data.fetch_daily(symbols, start, end, fields, as_of) -> JobRef
market_data.fetch_fundamentals(table, periods, as_of) -> JobRef
market_data.validate(snapshot_id, ruleset) -> DataQualityReport
market_data.create_snapshot(job_refs, schema_version) -> DatasetSnapshot
fetch_daily 输入 Schema 示例:
json
{
"type": "object",
"required": ["symbols", "start", "end", "fields", "as_of"],
"properties": {
"symbols": {"type": "array", "items": {"type": "string"}, "maxItems": 5000},
"start": {"type": "string", "format": "date"},
"end": {"type": "string", "format": "date"},
"fields": {"type": "array", "items": {"enum": ["open", "high", "low", "close", "volume", "amount", "adj_factor"]}},
"as_of": {"type": "string", "format": "date-time"},
"adjustment": {"enum": ["none", "forward", "backward"], "default": "none"}
},
"additionalProperties": false
}
feature-store-mcp
text
feature.validate_expression(ast, availability_policy) -> ValidationReport
feature.compute(snapshot_id, expressions, date_range) -> FeatureJob
feature.profile(feature_set_id) -> FeatureProfile
feature.register(definitions, evidence_refs) -> FeatureSetVersion
experiment-mcp
text
experiment.create(plan_id, lineage) -> ExperimentRun
experiment.train(feature_set_id, label_id, split, model_spec) -> TrainingJob
experiment.get_metrics(job_id) -> MetricBundle
model.register(training_job_id, stage="candidate") -> ModelVersion
model.compare(model_ids, gates) -> ComparisonResult
backtest-mcp
text
backtest.validate_config(config) -> ValidationReport
backtest.run(model_id, snapshot_id, portfolio_spec, execution_spec) -> BacktestJob
backtest.stress(backtest_id, scenarios) -> StressTestBundle
backtest.get_gate_results(backtest_id, policy_version) -> GateResult[]
backtest.run 必须要求显式传入:信号可得时间、成交价格、费用版本、涨跌停规则、停牌规则、T+1、基准、组合约束和随机种子(如适用)。
artifact-mcp
text
artifact.put(content_type, checksum, payload_or_upload_ref) -> ArtifactRef
artifact.get_metadata(uri) -> ArtifactMetadata
artifact.sign_manifest(artifact_refs, lineage) -> SignedManifest
report.render(template_version, evidence_bundle) -> ReportBundle
git-mcp
text
git.create_branch(repo, base_sha, branch_name) -> BranchRef
git.apply_patch(repo, branch, patch, expected_tree_sha) -> ChangeSet
git.run_checks(repo, branch, check_suite) -> CheckRun
git.commit(repo, branch, message, signed_manifest) -> CommitRef
git.push(repo, branch) -> PushResult
git.create_pull_request(repo, branch, base, title, body) -> PullRequest
git.get_pull_request(repo, number) -> PullRequest
V1 不向 Agent 暴露 merge_pull_request、force_push、删除分支、修改保护规则等工具。
deploy-mcp
text
deploy.build(commit_sha, target, sbom=true) -> BuildArtifact
deploy.plan(artifact_id, environment) -> DeploymentPlan
deploy.request_approval(plan_id) -> ApprovalRequest
deploy.execute(plan_id, approval_token) -> Deployment
deploy.health(deployment_id) -> HealthReport
deploy.rollback(deployment_id, approval_token) -> Deployment
deploy.execute 必须验证短期、单次、绑定 plan_id + artifact_digest + environment 的审批令牌。Agent 不能签发审批令牌。
observability-mcp
text
audit.append(event) -> EventRef
trace.get(trace_id) -> Trace
workflow.get_status(run_id) -> WorkflowStatus
workflow.cancel(run_id, reason) -> WorkflowStatus
cost.get(run_id) -> CostReport
13.5 MCP 安全要求
- 使用 OAuth 2.1 或工作负载身份,短期 token 和细粒度 scope。
- Server 端执行授权,不能信任 Agent 声称的权限。
- 对外部内容做 prompt injection 隔离;资源内容不能成为系统指令。
- 工具输入输出全量审计,但密钥、token、个人信息必须脱敏。
- MCP Server 版本、工具 Schema 和策略版本进入每次运行清单。
14. Git 自动化
14.1 分支与提交
- 分支名:
agent/{run_id}/{slug}。 - 仅允许修改策略白名单目录,例如
research/、configs/、reports/和生成的测试。 - 禁止修改 CI 权限、分支保护、密钥、审批规则和生产基础设施所有权文件。
- commit 必须签名,并包含
run_id、实验 ID、数据快照 ID 和报告链接。 - 所有自动生成文件经过格式化、静态检查、单元测试、泄漏测试和依赖扫描。
14.2 PR 模板
markdown
## Research objective
## Economic hypothesis
## Data and point-in-time assumptions
## Experiment lineage
## Out-of-sample results
## Costs, capacity and stress tests
## Known limitations
## Reproduction command
## Approval checklist
14.3 审批门
- Reviewer 必须是 Agent 之外的人类身份。
- CODEOWNERS 至少要求 Quant Reviewer;涉及部署配置时额外要求 Risk/Platform Reviewer。
- PR 检查未通过、提交 SHA 变化或报告清单不匹配会使已有批准失效。
15. 部署
15.1 环境
text
research -> simulation -> paper -> production
V1 可自动部署到隔离 research/simulation 环境;paper/production 必须人工批准。实盘交易接口不在 V1 工具集合中。
15.2 发布流程
- 基于已合并 commit 构建不可变镜像。
- 生成 SBOM、漏洞扫描、镜像签名和 provenance。
- 验证模型、特征、配置与报告清单的一致性。
- 在 simulation 执行 smoke test 和历史重放。
- 创建部署计划和差异摘要。
- 人工审批生产计划。
- 灰度发布、健康检查和数据新鲜度检查。
- 异常时自动停止并回滚到已批准版本。
15.3 运行时监控
- 数据新鲜度、Schema 漂移、缺失率和异常值。
- 特征分布 PSI、模型分数漂移、预测覆盖率。
- 模拟收益、换手、成本、暴露和约束违规。
- 服务延迟、错误率、资源和费用。
- 漂移触发重新研究请求,但不能自动越过审批上线新模型。
16. 安全、权限与治理
16.1 权限矩阵
| 动作 | Agent 自动 | 人工批准后 | 禁止 |
|---|---|---|---|
| 读取已授权研究数据 | 是 | ||
| 下载并缓存合规数据 | 是 | ||
| 运行沙箱代码/训练/回测 | 是 | ||
| 写研究产物和候选模型 | 是 | ||
| 创建分支、commit、push、PR | 是 | ||
| 合并受保护分支 | 是 | ||
| 部署 research/simulation | 是(策略可配置) | ||
| 部署 paper/production | 是 | ||
| 发出实盘订单 | V1 禁止 | ||
| 修改审批/分支保护/密钥策略 | Agent 禁止 |
16.2 威胁控制
- Prompt injection:外部数据标记为 untrusted,工具输出不能修改系统策略。
- 数据投毒:来源白名单、checksum、跨源校验、异常检测和数据快照签名。
- 供应链:依赖锁定、SBOM、签名镜像、禁止运行未知 pickle。
- 凭证泄漏:Vault 动态凭证、最小权限、日志脱敏、禁止凭证进入上下文。
- 越权:策略引擎在工具网关和 MCP Server 双重执行。
- 审计篡改:append-only 审计存储、哈希链、定期归档。
17. 可观测性与审计
每次运行必须关联统一的 trace_id,并记录:
- 输入目标、计划版本、Agent/Prompt/模型版本。
- 每次工具调用的参数摘要、授权结果、耗时、费用和结果引用。
- 数据、特征、模型、回测、报告、代码和部署的完整谱系。
- Reflection 决策、Gate Result、人工批准者和批准对象摘要。
- token、API、计算、存储和数据源费用。
关键 SLO:
- 控制平面月可用性 >= 99.5%。
- 工作流状态事件不丢失,恢复点目标 RPO 近零。
- 95% 可重试失败在策略时限内自动恢复。
- 100% 生产部署可追溯到人工批准和不可变制品摘要。
18. 核心数据模型
#mermaid-svg-btJAe7SsOHIf6I1a{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-btJAe7SsOHIf6I1a .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-btJAe7SsOHIf6I1a .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-btJAe7SsOHIf6I1a .error-icon{fill:#552222;}#mermaid-svg-btJAe7SsOHIf6I1a .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-btJAe7SsOHIf6I1a .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-btJAe7SsOHIf6I1a .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-btJAe7SsOHIf6I1a .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-btJAe7SsOHIf6I1a .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-btJAe7SsOHIf6I1a .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-btJAe7SsOHIf6I1a .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-btJAe7SsOHIf6I1a .marker{fill:#333333;stroke:#333333;}#mermaid-svg-btJAe7SsOHIf6I1a .marker.cross{stroke:#333333;}#mermaid-svg-btJAe7SsOHIf6I1a svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-btJAe7SsOHIf6I1a p{margin:0;}#mermaid-svg-btJAe7SsOHIf6I1a .entityBox{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-btJAe7SsOHIf6I1a .relationshipLabelBox{fill:hsl(80, 100%, 96.2745098039%);opacity:0.7;background-color:hsl(80, 100%, 96.2745098039%);}#mermaid-svg-btJAe7SsOHIf6I1a .relationshipLabelBox rect{opacity:0.5;}#mermaid-svg-btJAe7SsOHIf6I1a .labelBkg{background-color:rgba(248.6666666666, 255, 235.9999999999, 0.5);}#mermaid-svg-btJAe7SsOHIf6I1a .edgeLabel .label{fill:#9370DB;font-size:14px;}#mermaid-svg-btJAe7SsOHIf6I1a .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-btJAe7SsOHIf6I1a .edge-pattern-dashed{stroke-dasharray:8,8;}#mermaid-svg-btJAe7SsOHIf6I1a .node rect,#mermaid-svg-btJAe7SsOHIf6I1a .node circle,#mermaid-svg-btJAe7SsOHIf6I1a .node ellipse,#mermaid-svg-btJAe7SsOHIf6I1a .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-btJAe7SsOHIf6I1a .relationshipLine{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-btJAe7SsOHIf6I1a .marker{fill:none!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-btJAe7SsOHIf6I1a .edgeLabel{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-btJAe7SsOHIf6I1a .edgeLabel .label rect{fill:rgba(232,232,232, 0.8);}#mermaid-svg-btJAe7SsOHIf6I1a .edgeLabel .label text{fill:#333;}#mermaid-svg-btJAe7SsOHIf6I1a :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} has
executes
contains
feeds
trains
produces
evaluated_by
yields
records
produces
supports
releases
RESEARCH_RUN
PLAN_REVISION
TOOL_CALL
EXPERIMENT_RUN
DATASET_SNAPSHOT
FEATURE_SET
MODEL_VERSION
BACKTEST_RUN
GATE_RESULT
REFLECTION
REPORT_BUNDLE
PULL_REQUEST
DEPLOYMENT
所有实体采用不可变 ID;修订通过新版本和父引用表达,不在原记录上静默覆盖。
19. API 草案
text
POST /v1/research-runs 创建研究运行
GET /v1/research-runs/{run_id} 查询状态与当前计划
POST /v1/research-runs/{run_id}/pause 暂停
POST /v1/research-runs/{run_id}/resume 恢复
POST /v1/research-runs/{run_id}/cancel 取消
GET /v1/research-runs/{run_id}/lineage 获取谱系
GET /v1/research-runs/{run_id}/report 获取报告
POST /v1/approvals 提交人类审批决定
GET /v1/approvals/{approval_id} 查询审批
GET /v1/artifacts/{artifact_id} 查询产物元数据
所有写请求支持幂等键;API 返回操作引用,长任务异步执行。
20. 测试与验收
20.1 测试层级
- 单元测试:因子算子、时间对齐、费用、撮合、指标、策略规则。
- 属性测试:未来数据变化不得影响过去信号;现金和持仓守恒。
- Golden Test:固定小数据集上的信号、交易和净值结果固定。
- 集成测试:各 MCP Server 的 Schema、权限、幂等和错误模型。
- 端到端测试:从研究目标到 PR,以及审批后的 simulation 部署。
- 安全测试:越权、prompt injection、恶意数据、依赖和密钥泄漏。
- 故障测试:数据源限流、Worker 中断、消息重复、部署健康失败。
20.2 关键验收场景
- 修改 T+5 的数据不会改变 T 日信号或 T+1 订单。
- 当股票 T+1 涨停时,买单不产生不现实成交。
- 当数据源返回重复或缺失交易日时,流水线被质量门阻断。
- 同一幂等键重复下载、提交或部署不会产生重复副作用。
- Agent 调用 Git merge 或 production deploy(无审批令牌)必须被拒绝并审计。
- 报告中的任一数字能定位到回测产物、配置、代码和数据快照。
- Worker 中断后恢复不会改变实验 ID 或重复登记模型。
- Prompt injection 文本无法改变工具白名单或审批策略。
- PR 的 commit SHA 变化后原审批失效。
- 部署健康检查失败时回滚到明确的上一批准版本。
20.3 Definition of Done
- 所有验收场景自动化并通过。
- 完成端到端数据与实验谱系演示。
- 完成威胁模型、权限审计和恢复演练。
- 在固定基准任务上成功生成可复现报告和 PR。
- 未经人工审批的生产部署通过技术手段不可达。
21. 交付阶段
Phase 0:基础治理
定义数据许可、研究模板、回测假设、门槛、权限、审批和审计格式。
Phase 1:可复现研究底座
完成数据快照、特征表达式、训练、A 股回测、实验注册和报告,不引入 Agent 自主规划。
Phase 2:单 Agent 编排
引入 Planner、工具网关、Memory 和 Reflection,自动完成一次受限研究任务。
Phase 3:专业 Agent 与 MCP
拆分 Data/Alpha/Training/Backtest/Report Agent,部署 MCP Gateway 和专业 Server。
Phase 4:Git 与部署自动化
自动创建 commit/PR,接入人工审批,支持 simulation 自动部署和 production 审批发布。
Phase 5:规模化与治理
增加并行搜索、成本控制、漂移监控、多团队隔离和审计报表。
22. 待组织确认的配置项
以下内容不阻塞架构,但在实施前必须由业务和合规共同确认:
- 合规数据供应商、许可范围、历史深度和预算。
- 目标股票池、基准、资金规模和换手/容量约束。
- 费用和滑点模型的组织标准。
- 研究晋级门槛及例外审批流程。
- Git Provider、CI/CD、云环境和身份系统。
- 报告保留期限、审计保留期限和模型风险分级。
23. 设计决策摘要
- 采用分层 Agent + 确定性工作流,而不是自由多 Agent 对话。
- 采用受控自治:研究自动化,合并、生产部署和实盘必须人审。
- V1 聚焦 A 股日频横截面,避免同时支持多市场和高频。
- Alpha 使用可解释因子搜索与树模型组合,不引入深度模型。
- 所有结论由版本化证据支撑,LLM 不作为指标计算器或审批者。
- MCP 是受策略保护的工具边界,不是绕过权限的通道。
- 数据时点、失败实验和多重检验被视为一等公民。