site logo

Marico's space

Qlib 的 Agent 驱动量化研究循环:微软如何将 RD-Agent 接入生产交易基础设施

AI技术与应用 2026-09-03 17:35:01 5

最近折腾了微软的 Qlib,顺手把 RD-Agent 接进了我们的量化研究流程,踩了几个坑,这篇把问题说清楚。

Qlib 不是玩具项目。GitHub 上 48,000+ star,生产环境跑着实盘回测,直接喂单子的那种。RD-Agent 是微软搞的一个自主研究系统,能自动挖掘阿尔法因子、优化模型,不用人盯着。重点是 Qlib 展示了 Agent 驱动的研究循环怎么跟生产数据管道、回测引擎、部署门禁串起来。

大多数 Agent(人工智能)演示做到代码生成就停了。Qlib 直接演示了让 Agent 写交易信号、用历史数据跑回测、决定是否上线的完整链路。中间夹着隔离边界、版本管理、回滚逻辑、还有让人类量化分析师追溯「哪个 Agent 决策导致了某个仓位」的监控能力。

Qlib 能做什么

Qlib 是一个 Python(一种编程语言)量化金融研究和生产部署平台,提供:

  • 数据层:标准化市场数据(价格、成交量、财务数据),带时间点正确性,避免前瞻偏差。
  • 特征工程:基于表达式的因子定义(如 Close / Ref(Close, 5) - 1 计算5日收益率)。
  • 模型库:监督学习(LightGBM、XGBoost)、市场动力学模型(时间卷积网络)、RL(强化学习)智能体。
  • 回测引擎:事件驱动模拟器,含交易成本、滑点、仓位限制。
  • 组合构建:均值方差优化、风险平价、自定义配置策略。

平台把研究(因子发现、模型训练)和生产(实时数据摄入、信号生成、下单执行)分开。RD-Agent 自动化研究侧,生成候选因子、跑回测、提出模型改进建议。

RD-Agent 接入:自主因子挖掘

RD-Agent 是一个多智能体框架,把量化研究当成代码生成和优化问题来处理,包含:

  • 假设智能体:读研报、财务报告、现有因子库,提出新阿尔法信号。
  • 编码智能体:把假设翻译成 Qlib 兼容的 Python(一种编程语言)表达式或模型架构。
  • 评估智能体:跑回测,计算 Sharpe(夏普比率)和 IC(信息系数),决定保留还是丢弃候选。
  • 反馈循环:分析回测日志,迭代调整假设或代码,改进失败的候选。

系统循环运行:

  1. 假设智能体提出一个因子(如「波动率状态调整的动量因子」)。
  2. 编码智能体写一个 Qlib 表达式:(Close / Ref(Close, 20) - 1) / StdDev(Close, 20)
  3. 评估智能体在历史数据上跑回测(如2015-2023,月度再平衡)。
  4. 如果 Sharpe(夏普比率)> 1.5 且 IC(信息系数)> 0.05,因子进入候选池。
  5. 如果失败,反馈智能体分析权益曲线,找出特定市场状态下的失败原因,提出改进。

循环运行直到假设空间耗尽或达到时间预算。

编排流程:研究到生产

从 Agent 生成的因子到实盘交易信号的路径,经过多个门禁:

阶段 职责 失败模式
假设生成 RD-Agent 读论文或报告,提出因子逻辑 虚构的金融概念、不可计算的表达式
代码合成 把假设翻译成 Qlib 表达式或模型类 语法错误、未定义的数据字段、前瞻偏差
沙箱执行 在隔离环境中用历史数据跑回测 内存溢出、死循环、数据泄露
性能评估 计算 Sharpe(夏普比率)、IC(信息系数)、换手率、最大回撤 过度拟合回测周期、生存者偏差
人工审核 量化分析师审核因子逻辑和回测假设 Agent 生成的因子可能缺乏经济直觉
生产部署 因子加入实盘信号管道 模型漂移、市场状态变化、执行滑点

研究和生产之间的隔离边界至关重要。RD-Agent 运行在沙箱化的 Python(一种编程语言)环境中:

  • 只读数据访问:只能访问历史数据,不能写入生产数据库。
  • 执行超时(如每次回测10分钟上限,防止失控循环)。
  • 资源限制(CPU、内存上限,避免抢占生产资源)。
  • 审计日志:每个因子表达式、回测参数、性能指标都存储。

当一个因子通过评估,并不会自动部署。人类量化分析师审核代码,检查前瞻偏差(如是否在信号中用了未来数据),验证经济逻辑。然后因子才能进入生产信号管道。

状态管理和版本控制

Qlib 跟踪研究到生产流程中的每个产物:

  • 因子定义:存储为 Git 管理的仓库中的版本化 Python(一种编程语言)表达式。
  • 模型检查点:序列化时附带元数据(训练日期、超参数、性能指标)。
  • 回测结果:保存为 Parquet 文件,含权益曲线、交易日志、归因分解。
  • 生产信号:实盘模型的时间戳输出,关联到生成它的因子版本。

当 Agent 优化的模型在实盘中表现不佳,回滚流程是:

  1. 从生产日志中识别模型版本和部署时间戳。
  2. 对比实盘性能(Sharpe(夏普比率)、IC(信息系数))与回测预期。
  3. 如果实盘 Sharpe(夏普比率)< 0.5 持续30天,触发回滚到上一个稳定模型。
  4. RD-Agent 在最近数据上重新评估失败模型,诊断问题(如市场状态变化、数据质量问题)。

版本系统使用内容寻址存储(类似 Git),每个模型和因子都可以追溯到生成它的确切代码、数据和超参数。

可观测性:审计 Agent 决策

人类量化分析师需要理解为什么 Agent 推广了某个特定因子或模型。Qlib 提供:

  • 因子归因:按因子贡献拆分组合收益(如动量贡献+2%,价值贡献-1%)。
  • 回测回放:用相同数据和参数重新运行历史回测,验证可复现性。
  • 决策日志:记录每个 Agent 动作(提出的假设、生成的代码、回测结果、推广决策)。
  • 可解释性钩子:对于机器学习模型,SHAP 值或特征重要性分数展示哪些输入特征驱动了预测。

可观测性层不只是为了调试,也是合规要求。监管机构和风控人员需要审计交易系统为何做出特定配置。如果某个 Agent 生成的因子导致重大损失,审计追踪必须展示因子逻辑、回测假设和人工审批步骤。

代码示例:定义一个 Agent 生成的因子

RD-Agent 如何生成因子并注册到 Qlib 的示例:

from qlib.data import D
from qlib.data.dataset import DatasetH
from qlib.data.dataset.handler import DataHandlerLP # Agent-generated factor expression
factor_expr = "(Close / Ref(Close, 20) - 1) / StdDev(Close, 20)" # Register factor in Qlib's expression engine
fields = [factor_expr]
names = ["momentum_vol_adjusted"] # Load data with the new factor
data_handler = DataHandlerLP( instruments="csi300", start_time="2015-01-01", end_time="2023-12-31", fields=fields, names=names
) # Run backtest
from qlib.contrib.strategy import TopkDropoutStrategy
from qlib.contrib.evaluate import backtest strategy = TopkDropoutStrategy( model=trained_model, dataset=data_handler, topk=50, n_drop=5
) report, positions = backtest(strategy, verbose=True)
print(report["sharpe"], report["information_coefficient"])

关键细节:因子表达式是一个字符串,Qlib 懒解析和懒求值。这允许 RD-Agent 生成数千个候选表达式,而不用把所有数据加载到内存。只有通过初筛的因子才会被物化,进行完整回测。

安全边界

让 Agent 在金融系统中写代码和执行是有风险的。Qlib 的缓解措施:

  • 表达式沙箱:因子表达式在执行前被解析和验证。只允许白名单函数(如 RefStdDevMean)。不允许任意 Python(一种编程语言)代码。
  • 数据访问控制:Agent 不能访问实盘交易数据或生产数据库。只能看到历史快照。
  • 执行隔离:回测在独立进程中运行,有资源限制。回测崩溃不影响生产系统。
  • 人工介入:Agent 生成的因子上线前必须经过人工审核。审批步骤被记录且可审计。

威胁模型假设 Agent 可能生成恶意或错误的代码(如泄露未来数据的因子、过度拟合的模型)。沙箱防止执行层面的攻击,但无法阻止逻辑错误。这就是为什么人工审核是强制性的。

部署形态

带 RD-Agent 的典型 Qlib 部署:

  • 研究集群:CPU(中央处理器)密集型机器,运行 RD-Agent 的假设生成、代码合成和回测循环。与生产隔离。
  • 数据管道:摄入实盘市场数据(价格、成交量、新闻),存储到时序数据库(如 InfluxDB、TimescaleDB)。
  • 信号生成:生产模型(人工审批通过)读取实盘数据,每分钟或每小时输出交易信号。
  • 下单执行:信号喂给组合优化器和执行引擎,路由订单到券商。
  • 监控:Prometheus 指标追踪实盘模型性能(Sharpe(夏普比率)、IC(信息系数)、换手率)。性能下降时触发告警。

研究集群和生产系统共享零运行时状态。通过版本化产物存储(如阿里云OSS、Azure Blob Storage)通信,发布审批通过的模型和因子。

常见失败模式

失败 原因 缓解措施
过度拟合 Agent 针对回测周期优化,实盘失效 滚动前向验证、样本外测试
前瞻偏差 Agent 在因子定义中使用了未来数据 自动检查 Ref 负偏移
市场状态变化 市场动态变化,历史模式失效 监控实盘 IC(信息系数),触发再训练或回滚
执行滑点 回测假设零滑点,实盘交易产生成本 回测中建模交易成本,使用现实的成交假设
数据质量问题 实盘管道中数据缺失或错误 数据验证检查,回退到上一个模型

最隐蔽的失败是过度拟合。Agent 可以在历史数据上生成 Sharpe(夏普比率)2.0 的因子,实盘跌到 0.5。滚动前向验证(2015-2020训练,2021-2023测试)有帮助,但不是万无一失。

技术结论

适合用 Qlib + RD-Agent 的场景:

  • 你有量化研究团队,想自动化因子发现和模型优化。
  • 你需要带时间点正确性和真实交易成本的生产级回测引擎。
  • 你能接受 Agent 生成的因子需要人工审批这一环节。
  • 你有基础设施能力运行与实盘交易系统隔离的研究负载。

不适合的场景:

  • 你需要零人工监督的完全自主交易(监管和风控约束使这不现实)。
  • 你缺乏数据工程资源来维护干净、带版本的历史数据集。
  • 你的交易策略依赖高频执行(Qlib 优化的是日频或日内换仓,不是微秒级延迟)。
  • 你想要开箱即用的 SaaS(软件即服务)方案(Qlib 需要自托管和 Python(一种编程语言)专业能力)。

这个平台不是黑盒。你需要理解数据管道、回测假设和 Agent 编排流程。但如果你的目标是构建量化交易系统并想自动化研究循环,Qlib + RD-Agent 是少数几个开源选项之一,暴露了从假设生成到生产部署的完整技术栈。