# 从 PandaAI Infra 到自进化因子 Agent：量化研究工作流的一次工程化实践

> 能写出因子公式的 LLM 不等于可用的量化研究 Agent。Factor-Agent 把 PandaAI 的数据、因子计算、回测和 QuantSkills 接入一个可验证、可追踪、可迭代的研究闭环：LLM 只负责提出假设，是否入池由回测、样本外和过拟合门禁的证据决定。

EN: From PandaAI Infra to a Self-Evolving Factor Agent: Engineering a Quant Research Workflow

> An LLM that can write factor formulas is not a usable quant research agent. Factor-Agent wires PandaAI's data, factor computation, backtesting and QuantSkills into a verifiable, traceable, iterative research loop: the LLM only proposes hypotheses; evidence from backtests, out-of-sample tests and overfitting gates decides what gets promoted.

作者：yanglaiyang（Vega二向箔）｜日期：2026-07-27｜分类：AI 量化
原文：https://mp.weixin.qq.com/s/_BQrMjamenYZwZ-bsw1KEg

> 先给结论：一个能写出因子公式的 LLM，并不等于一个可用的量化研究 Agent。真正决定系统能否持续运行的，是数据、计算、回测、验证、版本、记忆和审计这些基础设施。PandaAI 把底座搭好，Agent 才能把研究流程真正接过去。

量化研究里，“让 Agent 自动挖因子”听起来很自然：给它数据、给它一个模型，再让它不断试公式就行。

实际做下来，事情并没有这么简单。

如果底层没有稳定的字段接口、因子计算引擎、回测约束和结果存储，Agent 最终只是一个会生成代码的文本系统。它能不断提出想法，但无法稳定回答几个更重要的问题：

- 这个因子到底读了什么真实数据？
- 因子计算和回测是否可以重复？
- 这次结果与上次结果是否是同一个版本？
- 高分是有效信号，还是多次尝试后的偶然？
- 下一轮探索到底从上一轮学到了什么？

这也是 Factor-Agent 这个项目的出发点：不试图让大模型替代量化基础设施，而是把 PandaAI 的数据、计算、回测和 QuantSkills 方法技能接入一个可验证、可追踪、可迭代的 Agent 研究闭环。

## 一、先把“自进化”说清楚

这里的“自进化”不是模型参数自训练，也不是让模型自由执行任意代码。

它指的是一个受约束的研究闭环：系统把每次实验的候选定义、计算结果、回测结果、失败原因和门禁结论写入知识库；下一代 Agent 在提出新候选前，先读取这些历史证据，再决定应该加深哪个方向、避开什么错误、是否尝试组合或复杂 Python 结构。

换句话说，**进化的是研究状态和决策依据，而不是把一次回测结果直接“训练进模型”。**

这个循环有两个刻意保守的设计：

- **LLM 只负责研究假设。**它提出公式、Python 结构或组合方案，但不直接决定一个因子能否入池。
- **是否晋级由证据决定。**正式回测、样本外检验、过拟合检验和 promotion gate 缺一不可；任何一项失败或证据缺失，都不能把候选写入可用因子池。

这使得 Agent 的创造性被保留，但研究流程的纪律性不交给语言模型。

## 二、PandaAI 到底提供了什么

从系统分层看，PandaAI 的价值不是“提供一个数据接口”这么简单，而是提供了 Agent 可以可靠调用的量化研究基础设施。这里的基础设施既包括 panda_data、因子引擎和回测能力，也包括 QuantSkills 中被封装为标准技能的研究方法。

### 统一的数据层

Factor-Agent 通过 `panda_data.get_factor` 和 `panda_data.get_stock_daily` 读取本地 Parquet 数据。对于 Agent 来说，这意味着不必理解底层文件分区、字段布局和索引对齐细节；它只需要在受控字段集合中提出研究假设。

项目还会把 PandaData 的官方字段清单与本地可路由的 Parquet schema 做交叉校验，形成候选字段池。能被当前环境真实读取的字段才会进入默认候选池，避免模型凭空编造字段名。

### 因子表达与计算层

底层因子构建复用 PandaAI 的 `factor_api.build_factor` 能力。上层向它提交的是一个明确的 FactorSpec：名称、代码、代码类型和市场。支持两种研究表达：

- **公式模式**：适合基线和可由 DSL 表达的截面/时序算子，例如 `RANK(close / DELAY(close, 20) - 1)`。
- **Python 模式**：适合状态切换、条件掩码、非线性关系、多窗口交互与滚动结构。Python 因子必须实现 `calculate(self, factors)`，并按照多标的时间序列的索引规则计算。

这很重要。Agent 不是只在字符串里排列算子，而是可以在既定执行边界内探索更接近真实研究工作的因子结构。

### QuantSkills：把量化方法变成 Agent 能力

QuantSkills 是 PandaAI 量化生态基础设施中很关键的一层。数据和计算引擎解决“怎么算”，Skill 则把过拟合检验、因子回测等研究方法封装成 Agent 可以发现、调用和组合的标准能力。当前项目中：

- `skill-backtest-overfit` 已实际接入主验证链路，提供 Deflated Sharpe Ratio、PBO、Haircut Sharpe、MinTRL 等过拟合与多重检验诊断；
- `factor-backtest` 已作为独立的截面回测对照工具接入，用于与 Factor-Agent 主事件回测流程进行交叉检查；
- promotion gate 不读取模型对结果的文字评价，而是读取这些 Skill 返回的结构化证据，再作 PASS / REJECT / BLOCK 决策。

这让 Agent 的能力扩展不再依赖继续堆提示词。新的量化方法可以先被封装成可测试、有输入输出契约的 Skill，再挂到调度与门禁层中。

### 正式回测与研究产物

因子通过快速评估后，还要进入事件驱动的 T+1 回测流程。系统记录持仓、交易、收益、回撤等回测产物，并将因子值、定义哈希、评估和回测结果关联保存。

默认 local 模式使用本地事件模拟器读取长表 Parquet；切换到 panda 模式时可以接入 PandaAI 的回测服务。二者的结果结构兼容，但本地模拟器不应被表述为与生产级撮合、风控或公司行动语义完全等价。

### 可替换而不被绕过的底座

一个好的 Agent 架构不应该重造数据层和因子计算层。Factor-Agent 把 PandaAI 封装在 Data / Engine / Operators 三层之下：未来替换数据源或接入不同市场时，应该替换的是这些适配层，而不是让 Agent 重新学习“如何读数据”。

## 三、系统框架：基础设施负责确定性，Agent 负责探索性

核心思想并不复杂：**PandaAI 是确定性研究能力的底座；Agent 是在这个底座上做假设生成、路径选择和经验复用的调度者。**

人、单任务 Agent 和多代 Evolve 入口最终都调用同一个 `research.mine_one()`。这比“在旧系统外再套一个聊天框”更接近 AI-Native：人和 Agent 的差异只在于谁提出下一步研究动作，底层的计算、验证和入库代码保持一致。

## 四、一次真实 Alpha101 测试：系统有没有真的用到 PandaData

为了避免“模型写了一段带 alpha 名称的代码，就宣称使用了 Alpha101”，项目增加了强制来源门禁。当用户在控制台选择 PandaData · Alpha101（强制真实字段）后：

- 每个候选必须直接引用 alpha001 到 alpha101 中至少一个精确字段；
- Python 候选会通过 AST 解析确认存在实际的 `factors['alpha014']` 这类字典取值，而不是只在注释或字符串里写一个字段名；
- 不满足来源约束的候选会在构建前标记为 invalid，留下公开拒绝记录，不能进入回测。

最近一次真实运行 panda-alpha101-enforced-20260727 的结果如下。

| 项目 | 结果 |
|---|---|
| proposer | DeepSeek |
| 强制来源 | PandaData WorldQuant Alpha101 |
| 通过来源门禁的候选 | alpha014_turnover_divergence |
| 实际读取字段 | alpha014、turnover、close |
| 实际读取数据量 | 998,894 行 × 5 列 |
| 数据区间 | 2023-09-02 至 2024-06-28 |
| 构建与正式回测 | 已完成，生成因子版本与回测产物 |
| Promotion 结论 | 拒绝，不进入候选池 |

该因子的核心形式是：用 alpha014 与收益方向、换手率相对自身衰减均值的偏离做交互，再进行截面排序。

```
import numpy as np

class Alpha014TurnoverDivergence(Factor):
    def calculate(self, factors):
        close = factors['close'].series
        turnover = factors['turnover'].series
        alpha014 = factors['alpha014'].series
        ret = close.groupby(level=0).pct_change(1)
        turn_decay = turnover.groupby(level=0).ewm(
            span=20, min_periods=10
        ).mean().droplevel(0)
        turn_div = turnover / (turn_decay + 1e-8) - 1
        factor = np.sign(ret) * turn_div * alpha014
        return factor.groupby(level=1).rank(pct=True)
```

它的快速研究指标并不理想：rank IC 为 -0.00049，诊断 Sharpe 为 0.1997。正式本地事件回测的年化收益为 -61.26%，Sharpe 为 -3.4447，最大回撤为 -35.61%。虽然数据读取、因子构建、正式回测和 OOS 流程已完成，过拟合门禁中的 DSR 为 0.0，低于要求，因此 promotion gate 给出拒绝结论。

另一个组合候选没有直接引用 Alpha101 字段，直接被来源门禁拒绝。

这其实比“跑出一个漂亮数字”更值得展示：**系统证明了它确实调到了底层 PandaData，也证明了它不会因为 Agent 写出了一个像样的故事就让因子晋级。**

控制台的“真实数据证据”卡会展示来源约束、实际引用字段、`panda_data.get_factor` 调用参数和返回行列数；公开事件轨迹会展示阶段、工具、指标和门禁结论，但不保存 prompt、completion、凭据或模型隐藏推理。

## 五、Agent 的“思考过程”应该如何被看见

在研究系统里，我们并不应该要求展示完整 CoT。它既不可稳定验证，也可能暴露不该持久化的上下文。更有用的做法是把 Agent 的可审计决策外化为结构化证据：

| 阶段 | 对外展示什么 | 不展示什么 |
|---|---|---|
| 读取证据 | 使用了哪些历史经验、榜单、字段目录 | 原始 prompt 与私有上下文 |
| 提出假设 | 候选名称、类型、简要假设、引用字段 | provider completion 全文 |
| 执行验证 | 调用的数据字段、评估指标、回测状态 | 密钥、绝对路径、内部消息 |
| 门禁决策 | 通过、拒绝或阻断的理由与证据 | 隐藏链式推理 |
| 写回记忆 | 因子版本、经验摘要、下轮可用信息 | 未脱敏的会话记录 |

这样做的好处是，使用者可以真正回答“系统现在运行到哪里、为什么停在这里、下一代会从哪里继续”，而不是面对一段无法验证的思维链。

## 六、这套组合真正降低了什么成本

PandaAI + Agent 的价值，不是让量化研究从此没有研究员，而是把研究员最容易重复消耗的部分变成可编排能力。

- **数据接入成本下降**：Agent 不需要理解底层 Parquet 结构，字段池和接口已经收口。
- **实验成本下降**：公式、Python 因子和多因子组合进入同一条构建、缓存、评估和回测链路。
- **研究交接成本下降**：定义、版本、指标、失败原因和回测产物都可追溯，不依赖某个人的 notebook 状态。
- **模型替换成本下降**：DeepSeek 只是 proposer 的当前实现；只要兼容 function calling 或结构化输出，模型可以替换。
- **治理成本下降**：来源约束、去重、版本哈希、OOS、过拟合检查与 promotion gate 让“能跑”与“能入池”分离。

对团队而言，最值得沉淀的不是某一个短期高分因子，而是这套能持续产生、淘汰和解释因子的研究工厂。

## 结语

我越来越相信，量化 Agent 最好的形态不是一个无所不能的“交易大脑”，而是一套有能力、也有边界的研究操作系统。

PandaAI 解决的是量化研究中最难被大模型替代的确定性部分：数据、因子计算、回测，以及 QuantSkills 所承载的标准研究方法。Factor-Agent 做的，是把这些能力组织成一个可以由人或 Agent 驱动、可以积累经验、可以拒绝坏结果、可以回放证据的研究闭环。

当 Agent 能真实读取数据、真实构建因子、真实完成回测，并且在结果不合格时明确拒绝晋级时，我们才开始接近“自主进化挖因子”的正确打开方式。

**不是让 Agent 替你相信一个因子，而是让它替你更快地证伪、保留和迭代研究假设。**
