AI Agent 正逐渐从通用问答和代码生成,走向更加专业的业务场景。对于量化投研而言,Agent 的价值不仅在于生成策略代码,更在于能否理解投研人员的策略描述,并调用数据、计算和回测能力完成完整的研究流程。
为探索 Agent 在专业投研场景中的应用,我们基于 Trae,结合 DolphinX Skill、DolphinMind RAG 和系统提示词,搭建了一套 CTA 投研 Agent 工作流。该 Agent 可以根据用户输入的策略描述,自动完成指标计算、主力合约合成和策略回测,并将中间脚本与最终结果进行持久化。
本文将以这一实践为例,介绍如何从工作区、系统提示词、数据模型和任务工作流四个层面构建 CTA 投研 Agent,并展示其在简单策略和复杂截面 CTA 策略中的实际执行效果。
一、任务目标
本项目希望开发一套能够完成 CTA 因子信号计算与策略回测的 Agent 工作流,主要包括以下能力:
- 多种策略类型:支持时序 CTA、截面 CTA 等多种期货策略类型。
- 脚本持久化可复用:因子信号计算脚本、主力合约合成脚本、策略回测脚本、回测结果持久化可追溯。
- 指标数据可复用:支持自动解析 Prompt 中对应因子/信号计算与主力合约逻辑,并复用已有因子/信号 + 主力合约合成规则,避免重复计算。
- Prompt 描述简化:支持使用股指期货等模糊表述代替具体的标的池表述,并配置不同类型期货回测下的预设参数,如股指期货默认最后交易日前 1 天平仓,以简化整体策略描述。
这一设计的核心并不是让 Agent 简单地"写出一段回测代码",而是让 Agent 能够理解一套相对完整的 CTA 投研工作流,并在数据、代码和计算环境之间建立稳定的执行链路。
二、如何构建一个 CTA 投研 Agent?
目前 DolphinX 各 Skills + DolphinMind + 系统提示词(如 AGENTS.md/)这三板斧能够解决绝大部分 Agent 编写 DolphinDB 业务代码时遇到的问题。三者的设计理念如下所示:
- DolphinX 各 Skills 能够回答 DolphinDB 有哪些功能函数模块,以及适用于特定场景的任务执行。
- DolphinMind RAG 提供 RAG 文档检索功能,详细回答了 DolphinDB 功能函数模块用法。
- 系统提示词规定了 Skills 如何嵌入至工作流,需要以何种方式解决何种任务。

图 2-1:Skills + RAG 检索 + 系统提示词职责
那么,如何将这三者有机的融合在 Agent 的工作区中呢?需要根据目标任务的工作流进行初步规划。
2.1 如何搭建一个 CTA 投研 Agent?
首先进行 Agent 工作区的设计,以便代码与结果的查看与维护;工作区的设计方式有很多种,这里推荐按照任务流的每个环节建立工作区。通过拆解 CTA 投研回测任务的基本流程,我们可以得到下图的形式,将每个流程得到的脚本文件或结果单独存放在一个文件夹中,最终得到工作区的整体设计。

图 2-2:CTA 回测的基本流程及对应文件夹
由于当前 Agent 都是通过 shell 脚本(Powershell/CMD/Git Bash等)执行命令,DolphinDB .dos 脚本无法在本地编译执行,所以需要通过 DolphinDB SDK 进行封装,使得 Agent 通过 shell 脚本运行 DolphinDB Python/Java/C++ SDK,从而提交脚本至远程 DolphinDB 服务器执行。这里以 DolphinDB Python SDK 作为封装进行开发,并将全部 Python SDK 调度代码存放在同一个文件夹中,方便运维管理。
此外,在 Agent 执行任务的过程中,可能涉及到网络连接、环境检查、debug测试等需要 Agent 额外编写代码调试的场景,这部分调试代码需要单独设置文件夹进行存储,否则 Agent 可能会乱放与主要任务无关的代码,从而破坏原有的代码结构。
因而加入 Python SDK 调度逻辑后的工作流程及文件夹如下所示:

图 2-3:最终 Agent 工作区的整体设计
最终该整体项目文件的设计如下所示:
bash
.agents: # trae Skills文件夹
dolphindb-backtest-skill.zip # dolphindb 回测Skills
dolphindb-daily-factor.zip # dolphindb 日频因子编写 Skills
dolphindb-highfreq-factor.zip # dolphindb 高频因子编写 Skills
dolphindb-ops.zip # dolphindb 运维 Skills
dolphindb-rag.zip # dolphindb RAG Skills
dolphindb-test.zip # dolphindb 测试 Skills
script: # trae Agent工作文件夹
indicator:
testSignal.dos # 供Agent参考的CTA信号计算脚本
testFactor.dos # 供Agent参考的CTA因子计算脚本
mainCont:
default.dos # 供Agent参考的主力合约合成template
result:
# 存放每个策略的回测结果csv文件
strategy:
demo.dos # 供Agent参考的CTA策略template
sysScript: # DolphinDB Python SDK代码, 负责让Agent执行对应 DolphinDB .dos脚本
getIndicator.py
getMainCont.py
getSchema.py
runIndicator.py
runStrategy.py # Agent运行策略
utils.py # 工具函数
usrScript:
# 存放其他Agent生成的脚本(系统调试、环境变量检查等与主要任务无关的脚本)
config.json5: # dolphindb session 配置项
2.2 用 AGENTS.md 定义 Agent 的工作方式
Trae 支持按照 AGENTS.md 以及 CLAUDE.md 作为提示词,因而使用 Codex 与 Claude 的用户可以无缝迁移 Agent 工作项目至 Trae。本项目使用 AGENTS.md 作为系统提示词,系统提示词的设计如下:

图 2-4:系统提示词 AGENTS.md 文件内容结构
以下介绍一些较为简略的提示词,剩余部分在其余章节进行介绍:
角色定义:该部分提示词可结合任务目标自行编写,这里准备了一般粗糙的提示词:
bash
你是一个精通使用DolphinDB函数进行因子编写以及使用DolphinDB Backtest回测插件进行期货策略回测专家,Always respond in Chinese-simplified
工作区文件目录:AGENTS.md 中的工作区文件目录如章节 2.1 工作区设计所示,填入文件目录具体内容即可,这里不做赘述。
当前任务说明:当前任务说明为任务流的概述,能够帮助 Agent 快速理解总体任务流所要达成的目标,同时需要说明必要的环境信息,以及工作流执行方式:
2.3 设计库表结构
由前文描述可知,本文设计的 Agent 需要实现一项关键能力指标数据可复用,即支持自动解析 Prompt 中对应因子/信号计算与主力合约逻辑,并复用已有因子/信号 + 主力合约合成规则,避免重复计算。
同时,DolphinDB Backtest 回测插件也需要对应的行情数据与基础数据。特别针对 CTA 策略,每日保证金率与手续费率都可能进行变动,因而在库表层面,不仅需要准备标的的基本信息表,还要准备标的每日信息表。汇总以上 Agent 能力需求与 Backtest 回测插件的数据需求,设计库表结构如下:

图 2-5:Agent 所需 DolphinDB 库表结构设计
2.4 搭建完整任务工作流
根据前文基本工作流的梳理以及库表的设计,我们可以梳理 Agent 端与数据库端的交互过程,这里进一步加入环境检查、SDK 调度等环节。同时为了提升任务执行的成功率,这里在 DolphinX Skills 的基础上增加了 Agent 对样例代码的学习环节。
在任务流执行的全程过程中,特别是在策略代码编写时使用到的 DolphinDB 语法,Agent 可以通过DolphinMind RAG 能力进行搜索并得出正确用法。
最终,我们构建了用于 CTA 因子/信号计算与策略回测的投研 Agent,其任务工作流如下所示:

图 2-6:CTA 投研 Agent 任务工作流设计
三、效果展示
用户向 Agent 输入指标计算与策略具体逻辑的 Prompt,Agent 就会依次执行前文提及的任务工作流。
以下展示了不同详细程度的策略的描述 Prompt 以及 Agent 执行效果,可以看出该 Agent 能够较好地理解用户需求,并执行 CTA 指标计算、主力合约合成以及不同类型的 CTA 策略回测任务。
3.1 简易策略:以一个时序 CTA 策略为例
3.1.1 策略描述 Prompt
以下是这个简易版本的策略描述 Prompt:
bash
现需要执行DolphinDB Backtest:
标的池规则:股指期货
初始资金:10000000
回测开始时间:2022.01.01
回测结束时间:2023.01.01
止盈止损比例:保证金比例10%
开平仓条件:结算价计算金叉死叉,金叉多头信号+死叉空头信号;下一个交易日开盘价开仓,已有持仓则跳过
3.1.2 任务流分析
遇到类似金叉死叉这类模糊表述,Trae 会自动生成若干候选精确表述指标,根据需求选择即可:

图 3-1:Agent 解析金叉死叉指标
同时,由于 Prompt 中为给出明确的平仓信号,Agent 也会进行询问:

图 3-2:Agent 确认平仓信号
之后,Agent 会自动按照 AGENTS.md 中规划的工作流进行执行,遇到报错也会按照工作流进行调试。遇到无法通过命令行 shell 脚本调试的行为,Agent 会自动在 ./script/usrScript 文件夹下编写相关代码进行调试。
3.1.3 执行结果观察
下图展示了回测的执行工作流结果与策略回测结果,可以发现 Agent 严格按照了 AGENTS.md 中规划的工作流,并将计算的因子与策略脚本文件保存至指定的文件夹。

图 3-3:Agent 工作流执行结果

图 3-4:Agent 策略回测结果
3.2 复杂策略:以一个截面 CTA 策略为例
3.2.1 策略描述 Prompt
如果将策略的复杂程度提升,增加更多的策略条件;同时自定义主力合约合成规则,这里假设按照前一交易日的成交量区分主力合约,从而得到如以下所示策略 Prompt 的复杂策略描述。
bash
现需要执行DolphinDB Backtest:
指标计算规则:
- kurtRet10D: 过去10日settle涨跌幅的kurtosis
标的池规则:除了['ZC', 'PM', 'WH', 'RI']以外的所有商品期货品种
初始资金:10000000
资金分配规则:开仓固定为1手
回测开始时间:2022.01.01
回测结束时间:2023.01.01
调仓日规则:每周第一个交易日为调仓日
主力合约规则:volRule,上一个交易日成交量第一的合约定义为该交易日该品种的主力合约,若新主力合约到期日<旧主力合约,则保持旧主力合约不变
止盈止损比例:按照保证金比例计算的10%止盈 + 5%止损,多单空单均适用
到期日条件:离最后交易日15天必须强行平仓,且不得开该合约新仓
开多仓条件:当前交易日为调仓日 + 未持有该品种多单 + 到期日条件满足 + kurtRet10D排名TOP10大 -> 下一交易日开盘价主力合约开仓
开空仓条件:当前交易日为调仓日 + 未持有该品种空单 + 到期日条件满足 + kurtRet10D排名TOP10小 -> 下一交易日开盘价主力合约开仓
平多仓条件:下一个交易日为调仓日 or 止盈止损 or 到期日条件不满足 -> 下一交易日开盘价平仓
平空仓条件:下一个交易日为调仓日 or 止盈止损 or 到期日条件不满足 -> 下一交易日开盘价平仓
3.2.2 执行结果观察
下图是该截面 CTA 策略的执行结果汇报,可以看出在复杂的 CTA 策略投研场景下,该 Agent 依然能够理解用户的意图并根据工作流严格执行。

图 3-5:Agent 策略运行结果
此时观察工作区,可以发现 indicator 文件夹与 strategy 文件夹下已经出现了Agent 生成的指标计算脚本文件与策略文件。result 文件夹下按照策略名称创建了一个名为 kurtRet10DStrategy 的子文件夹,其中保存着具体的回测结果。
由于策略描述 Prompt 文本中包含了名为 volRule 的主力合约规则及描述,因而 Agent 在 mainCont 文件夹下生成了一个名为 volRule.dos 的主力合约合成脚本,并按照 volRule 规则在回测中进行调仓。

图 3-6:Agent 工作区生成脚本文件与结果文件
同时观察 DolphinDB 表 dfs://factorDB/infoCTA,发现其已经记录了所有的信号与因子名称及其描述。当新的 Prompt 中涉及到与库内因子/信号语义一致的指标时,Agent 会自动使用含义一致的这些指标,从而实现指标复用的功能。

图 3-7:更新后的 infoCTA 表
四、部署方式
下载附件中的压缩包,按照以下操作进行部署即可:
step1. 确保 powershell 读取中文注释不会输出乱码。
以管理员身份打开 powershell,粘贴执行以下命令:
bash
#允许运行自定义脚本
set-executionpolicy remotesigned
#创建默认profile,如果存在则不创建
if (!(Test-Path -Path $PROFILE)) {
New-Item -ItemType File -Path $PROFILE -Force
}
#查看创建的profile文件位置
$PROFILE
根据输出的位置,找到 profile 文件,
bash
C:\Users\Admin\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
使用任意文本编辑器打开该 profile 文件,加入一行:
bash
$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding
重启 powershell,输入 chcp 查看编码,若为 65001 则说明修改成功,此时 powershell 执行 shell 脚本读取代码文件遇到中文不会输出乱码。
step2. 将压缩包解压至 windows 用户允许读写的任意路径下,若当前存在 pandas + dolphindb + json5 环境,可以修改 AGENTS.md 中的本地 Python Conda 环境为该环境。

图 4-1:指定 Agent 执行某一 Conda 环境
step3. 配置 DolphinDB 连接,打开解压后的文件夹,修改 ./script/strategy 文件夹下的 config.json5 文件,填入对应的配置项,该配置项将作为 DolphinDB 的连接配置在 Agent 中全局使用:
bash
{ "session": { "host": "", "port": "", "userid": "", "password": "" } }
step4. 建库建表 + 数据导入,打开解压后的文件夹,依次运行 Python 代码即可完成教程数据导入。后续可以接入 tushare 或通联等数据提供商的数据,并通过设置定时任务的方式实现数据的增量更新。

图 4-2:建库建表 + 导入示例数据的 Python 代码文件
step5. 运行 Trae Agent 客户端,打开目标文件夹。为确保网络端沙箱放行,尤其是 DolphinDB 部署在远程 linux 服务器上的情况,这里需要以自定义权限模式进行执行。点击设置 - 权限审批 - 自定义配置,进入 global.json 文件,修改配置项 enable 为 false:
bash
"shellSandbox": { "enable": false, // 默认为true,导致沙箱拦截部分行为 "onRestrict": "request_permission_retry_sandbox" },
step6. 根据网页 DolphinMind 中的提示,并在该页面上申请 DolphinMind api-key,将 DolphinMind 接入 agent,使其可以通过 DolphinMind 的 RAG 能力查询文档中 DolphinDB 函数用法。

图 4-3:Agent 接入 DolphinMind RAG
step7. 输入策略描述 Prompt,即可让 agent 生成对应的主力合约拼接、因子信号计算与期货策略回测脚本,agent 执行最终的回测脚本返回对应结果。
五、总结
本文利用 Trae + DolphinX Skills 实现了一个能够进行 CTA 因子信号计算、主力合约合成以及策略回测全套流程的 Agent,展现了当前 DolphinMind RAG、DolphinX Skills 与系统提示词相结合的强大执行能力。
以下是基于 DolphinX Skills 进行 Agent 开发的几点实际体验:
- 在初始建库建表时,可以通过
setTableComment和setColumnComment函数为整个表以及每个字段添加注释,这样减少了后续向 Agent 的字段解释成本,可以直接将整个表的 schema 返回给 Agent。 - 在强业务逻辑的场景下,受限于 Agent 自身的能力以及 Skills 本身的文档属性,Agent 生成的代码可能较为混乱,且运行效率较为低下。此时可以针对性地给出一个或几个业务场景中的真实代码,让 Agent进行学习,能够大幅提升任务执行的成功率。
- **数据层面必须遵守的逻辑,须同时在系统提示词 AGENTS.md 与原始库表注释中均加以说明,**保证 Agent 在取数过程中的行为符合预期。
- 在测试过程中,应当结合真实用户输入的 Prompt,**尝试简化 Prompt,并观察 Agent 的任务执行是否符合预期,**该过程有助于预防工作流执行时的潜在问题。
- 在测试过程中,对于回测场景下常用但 Agent 需要迭代多轮才能写出的函数,可在 ./script/strategy 文件夹中的 demo.dos 策略样例文件中予以使用。