yanglaiyang

文章 | 2026.07.27 | AI 量化

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

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

首发于 公众号「Vega二向箔」· AI Quant 系列 · 阅读原文 ↗

先给结论:一个能写出因子公式的 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 的结果如下。

项目结果
proposerDeepSeek
强制来源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 替你相信一个因子,而是让它替你更快地证伪、保留和迭代研究假设。