“量化龙虾”训练实验:基于 Ascend 的 Agentic-RL 实践记录

注解:本教程完整记录了基于Qwen3.5的一手训练实践,供开发者们用于快速上手参考。建议结合官方最新发布动态使用。
前言
从 Claude Code 到年初受到关注的 OpenClaw,越来越多开发者开始尝试用大模型驱动 Agent 系统,让AI能够自主、长时间地完成特定领域的工作。但在这些 Agent 应用背后,支撑模型进行多步决策和环境交互的关键技术之一 Agentic Reinforcement Learning(Agentic-RL),目前仍较少被系统化讨论。
原因并不难理解:Agentic-RL 本身就是一个高度复杂的系统工程,它不仅涉及 Agent 架构设计、上下文管理、工具调用与环境构建,还需要解决RL训练中的反馈设计、轨迹采样、长链路稳定性等一系列问题。
更现实的是,这套流程对算力、框架和工程能力都有较高要求,很多开发者即便理解原理,从零跑通一个完整案例也并不容易。

可以说,Agentic-RL 有比较明确的应用价值,但上手门槛不低,缺少完整的实践参考时,开发者往往很难快速建立直观理解。
也正因如此,我们选择在这个方向上写文章,希望通过手把手的实践步骤,降低理解和复现 Agentic-RL 的成本。在本文中,我们将基于 Qlib 与 Qwen3.5 模型,从零构建一只能够模拟股票投资决策的“量化龙虾” 。它分为两部分:
-
Agent构建:构建一个能够自动获取股票数据、分析市场行情与当前仓位,还能自主执行交易决策的龙虾
-
Agentic-RL后训练:我们将基于昇腾计算资源,对整个Agent系统进行强化学习训练,持续提升它的“炒股”能力
在这次实验设置下,我们训练得到的agent模型在3个月模拟回测中的累计收益率接近10%,相比基模有一定提升

这个结果仍有提升空间;作为入门教程,它主要用于说明 Agentic-RL 训练和评估的基本流程,更多改进方法也欢迎社区继续探索。
写教程的过程中,我们也更直观地感受到:Agentic-RL 训练既有不少探索空间,也包含繁琐的工程实现。
我们不想把这篇教程仅仅写成一串配置项和代码片段,而是尽量保留这次实验的来龙去脉:为什么选这个任务,为什么这样设计Agent,哪些地方是为了训练稳定性做的妥协,哪些坑是我们真的踩过的。
希望大家读完后,不只是知道“代码怎么跑”,也能看到亲手训练一个 Agent 时会遇到的关键设计取舍和实践细节。
资源:
- 代码:atmogit、github
- 数据集:atomgit、modelscope
第一章:股票交易Agent设计
股票交易任务说明与Agent设计
我们希望构建一个“量化龙虾”,模拟真人进行股票交易的流程,看股价、看大盘、研究数据、买入卖出(这里面只考虑短线操作,不考虑长线操作对行业、市场和财报的分析)。并且希望进一步通过Agentic-RL来增强“量化龙虾”的炒股能力。
选用股票交易作为训练任务的原因
在正式进入实现之前,我们想先说明为什么选择“股票交易💰”作为Agentic-RL的题材。
首先,由于有像Qlib这样成熟的股票量化开发工具包,金融环境相对更容易搭建成可交互、可反馈的Agentic-RL环境(相比于写代码、操作计算机等)。模型的每一次买卖决策都会反映在盈亏上,通过相对直接的计算就能检验模型策略的有效性。
第二,金融市场的实时数据(股价、成交量、财报)持续变化,模型不能仅依赖预训练语料去“背出”明天的走势或者硬记下固定策略。这在一定程度上可以减少模型依赖静态记忆完成任务的可能。
更重要的是,我们希望通过这个教程让读者看到:Agentic-RL 的价值不只在于让 AI 更高效地完成“自动化流程”。写业务代码、回邮件等场景当然有用,但很多时候仍是在复现人类已有的操作范式。仅通过扩大预训练数据和精炼后训练数据,仍可能遇到能力边界:
仅依赖基座模型与静态数据,往往会限制 A g e n t 在动态任务中的表现上限 仅依赖基座模型与静态数据,往往会限制 Agent 在动态任务中的表现上限 仅依赖基座模型与静态数据,往往会限制Agent在动态任务中的表现上限
我们更希望通过Agentic-RL训练,探索LLM在复杂、动态、充满噪声的环境中,能否通过强化学习逐步形成更好的策略调整能力。因此,我们以一个真实的金融场景为例子(而不是只做静态问答或数学题),帮助开发者理解如何开发更具探索性的 AI Agent。类似方法未来也可能迁移到物理建模、生物制药等更复杂的领域,但这仍需要更多实践验证。
当然、股票量化是一个非常严谨的场景,从各种量化指标的提出、再到对交易策略的风险控制,都远超本教程能够覆盖的范围。因此本教程只是借用股票交易作为一个适合演示的模型训练场景,用较简化的分析+挂单模型来让开发者直观感受Agentic-RL过程。本教程的模型不能用于真实股票交易,也不能用作投资建议。
第二章:Agentic-RL的基本原理
本章节假定读者已经对LLM的基本原理、Agent技术、大模型微调与强化学习后训练技术有了最基本的了解。本章节则重点介绍Agentic-RL的训练过程原理,而不深入探讨算法细节。
大模型强化学习训练原理回顾
在开始介绍Agentic-RL之前,我们先回顾一下大语言模型强化学习训练过程(以经典的GSM8k数据集做数学题为例子):
-
同一个数学题,模型给出多个做题过程和答案(rollout)
-
把模型对同一问题的多次作答与正确答案做对比、分别给出得分(Reward)
-
将一批次问题以及对应的多个做题过程,加权进行一次微调训练(当然这里的加权是对RL损失的一个简化表述)
与对大模型微调不同,大语言模型强化学习是以轨迹为单位去训练的,而不是逐个token对齐。
那什么是“轨迹”呢?对语言模型来说,轨迹不是某一个 token,而是模型完成一次任务时产生的完整序列。比如 Claude Code 独立完成一个代码修改任务:它先理解需求,然后读取文件、分析代码、调用搜索或终端工具、修改文件、运行测试,最后给出结果。在这个过程中,模型生成的所有文本 token、工具调用、工具返回结果,以及基于这些结果继续决策的步骤,合在一起就构成了一次完整的“轨迹”。因此,大语言模型强化学习通常是以一次完整任务执行过程为单位来训练,而不是逐个 token 对齐。

因此大语言模型的强化学习微调,就是通过强化学习算法,根据模型输出所获得的Reward(Reward通常以模型对问题的答案是否正确来判断),来优化大语言模型的整段输出。
这么做的好处是:在训练过程中是由强化学习算法来负责分配每个token应该获得的奖励、因此我们不需要提前准备好每个tokens的标准答案(也就是微调数据集),大模型强化学习训练特别适合于一些我们无法构建标准答案的场景,比如人类反馈对齐或者推理场景。
Agentic-RL原理
Agentic RL的训练过程如下图所示,简单点来说就是将 LLM 扩展为一个 Agent 进行训练,这个 Agent 除了能够回答问题,还可以根据环境的反馈进行决策、生成动作等,能够完成更加复杂的任务。

Agentic-RL将 LLM 的多轮对话整体视为一个可学习的策略,并直接优化模型的多轮输出。在这个框架下,智能体需要在动态环境中与外部世界交互,执行多步行动来完成复杂任务,获得中间反馈来指导后续决策,优化长期累积奖励而非单步奖励。
结合股票交易任务为例:我们知道,股票交易如果想要赚钱,通俗来说就是卖出的价格比买入的价格要高就可以进行交易,而如果想要收益最大化,那么还要考虑股票价格未来的变动以及交易时的交易量等多种因素。
如果使用原始的 RL 训练策略,那么我们需要使用固定的数据集,并且模型只会根据单一的环境去判断什么时候该交易、该交易多少。
但是股票的变动是动态的,不能够单纯地按照价格的上升下降判断,市场环境、大盘走势、成交量变化、持仓状态甚至已有仓位风险都会影响最终决策。更接近真实交易员的决策流程通常不是只看一条K线后立刻下单,而是先观察市场,再补充信息,然后不断修正自己的判断。
而在大模型强化学习训练过程中,模型通常只有一次回答:输入问题,然后输出完整答案。即便是多轮对话,也是一问一答的形式,奖励函数根据最终答案是否正确进行打分,整个过程更像是在考试:
题目给你 → 一次性答完 → 老师评分
但股票交易更像真实工作:
看行情 → 查询信息 → 分析 → 下单 → 观察反馈 → 再分析 → 再决策
整个过程中模型需要不断获取新信息,并根据环境变化动态调整策略。此时,模型面对的不再是一个静态问题,而是一个持续变化的决策环境。因此在 Agentic-RL 训练过程中,模型优化的对象不再是一段静态文本,而变成了一条完整的行为轨迹:
o 1 ⟶ a 1 ⟶ o 2 ⟶ a 2 ⟶ . . . ⟶ a T o_1 \longrightarrow a_1 \longrightarrow o_2 \longrightarrow a_2\longrightarrow ... \longrightarrow a_T o1⟶a1⟶o2⟶a2⟶...⟶aT
在标准的强化学习教程当中,一般轨迹符号如下:
o t o_t ot 表示当前观察(Observation)
a t a_t at 表示当前动作(Action)
对于Agentic-RL来说, o t o_t ot指的是输入给模型的文本,不局限于用户输入,而可以来自工具返回、大盘变化、环境状态甚至前一步执行结果;而 a t a_t at则是模型的输出,可以是调用工具如执行交易、停止任务等,也可以是返回给用户的文本。
所以在Agentic-RL当中,虽然使用的算法还是大语言模型强化学习常见的算法如PPO或者GRPO。但我们期望对模型的训练目标发生了改变,由单纯的“输出答案正确”为了模型开始主动决定“下一步该做什么”。比如在股票场景中,模型可能需要额外调用几次工具、多消耗一些上下文长度,甚至暂时放弃当前看起来收益不错的股票。但如果这些行为能够帮助模型获得更准确的市场判断,那么长期收益反而会更高。
当然虽然训练原理、算法和大模型强化学习是一致的,但由于Agentic-RL需要多次与环境交互,生成多轮工具调用的上下文轨迹等等,这些复杂的训推过程和交互状态使得开发难度困难了不少。后面我们将重点介绍如何利用开源框架来实现Agentic-RL的训练。
第三章:Agentic-RL训练框架的选择(面向昇腾开发者)
如果是在普通的大模型训练项目里,我们通常会先搭评估环境,再讨论训练算法和训练环境,参考往期博客。这个习惯来自几次很朴素的经验:
-
没有一个好的测评环境和测评指标,我们往往很难明确定义要通过训练改进模型的目标
-
我们没法定量评估训练前后模型的表现提升,也因此会导致我们很难优化训练策略
-
由于现代大模型往往已经经过较充分的后训练调优,大多数场景下优化提示词的收益更大,因此需要先搭建评估环境并进行提示词工程,了解实际阻碍模型能力的原因。
不过开始做量化龙虾时,我们很快发现 Agentic-RL 和常规训练项目有些不同:这里要搭的不是一个孤立的训练脚本,而是一套会不断采样、调用工具、结算环境、再把反馈送回模型的优化系统。于是我们的第一步没有从评测页面开始,而是先确定训练框架。这样做的原因很现实:如果先把 Agent 环境和评估逻辑写成一套独立系统,等接入训练框架时,很可能又要围绕框架的 AgentLoop 、工具生命周期和数据格式重写一遍。为了减少重复适配,我们选择先从框架约束出发设计任务。
常见Agentic-RL框架介绍
当然,相比于从零实现,复用社区框架可以减少不少工程工作。而在项目初期,我们比较担心的是选错后会不会一路写到训练阶段才发现:工具调用方式不匹配、长上下文无法稳定支持、或者评估时能跑的 Agent 难以接入训练循环里。
这里我们罗列了开发者常用的部分 Agentic-RL 框架:
| 框架名称 | 发布时间 | 维护团队 | 特点 | GitHub星数 |
|---|---|---|---|---|
| TRL | 2022 | HuggingFace | 上手成本较低的RL框架、支持Agentic-RL开发、但计算效率和支持的模型规模相对有限 | 18.4k🌟 |
| Verl | 2021 | 字节火山引擎 | 社区使用较广泛的RL框架、有较完善的文档和丰富的特性、但开发难度较大 | 21.3k🌟 |
| Areal | 2023 | 蚂蚁金融 | 专门针对Agent场景发布的异步强化学习框架、支持直接通过Agent框架获取并转化训练数据 | 5.2k🌟 |
带着这个担心,我们先把 Agentic-RL 框架需要解决的问题拆开。对这个项目来说,工程上比较明显的是两个挑战:
-
轨迹生成: Agent 系统通常需要多次调用环境提供的工具,并根据工具的响应回复内容,而工具若依赖于外部服务或者涉及复杂的CPU运算则会带来额外的错误或者延迟,通常 Agentic-RL 框架需要能够处理工具超时甚至环境崩溃的场景。
-
长文本吞吐能力: 通常Agent系统在轨迹生成时会多次调用工具,部分支持思考的模型还会生成大量的推理文本,Agentic-RL框架需要能够支持更灵活的并行策略来确保超长文本不至于导致OOM(Out-of-Memory,显存爆了)
这里只列出了Agentic-RL新增的两个挑战,而诸如超大模型带来的并行挑战、大语言模型强化学习本身需要包括参考模型、奖励模型在内的多模型调用问题并没有列出。
所以在挑框架时,我们关注的不是“这个框架功能是不是最多”,而是它能不能把模型训练和Agent轨迹生成这两件事接起来:一边管理NPU算力、并行切分、PPO/GRPO等训练逻辑,另一边稳定地跑多轮工具调用和环境结算。落到自定义Agent任务上,我们主要看两点:
-
框架对大规模训练的支持能力: Agent场景通常会拉长上下文,工具返回也会让轨迹变得更长,因此运行效率、算力规模和并行策略都会更早成为瓶颈。我们的做法是先估算模型大小、上下文长度和手头算力,再反推框架是否能够稳定支持。
-
任务能否自然写进框架: Agentic-RL任务往往不是一次回复结束,而是模型和环境反复交互。比如TRL更适合“多次工具调用 + 一次最终回复”的轨迹,而Verl可以支持带user模拟回复的多轮AgentLoop,这对我们这种交易环境更适合。
Agentic-RL的框架选择
考虑到我们使用的是昇腾计算资源、不同框架对于昇腾的支持能力和开发复杂性差异较大,因此我们比较了各个框架的功能丰富度、开发复杂性以及对训练规模的支持,我们的评估如下:
| 框架名称 | 昇腾支持情况 | 功能丰富度 | 开发复杂性 | 训练规模 |
|---|---|---|---|---|
| TRL | 🌟🌟支持昇腾运行,仅支持FSDP并行 | 🌟能实现单轮回复Agent训练、支持OpenENV环境定义 | 🔨深度支持Huggingface系列工具,代码简洁、开发相对简单 | 🐓8卡小规模训练 |
| Verl | 🌟🌟🌟支持FSDP和基于MindSpeed完整的5D并行 | 🌟🌟🌟支持多种Agentic-RL场景和算法 | 🔨🔨🔨由于丰富的功能导致框架相对复杂,需要参考案例代码和阅读框架源码 | 🦖多节点大规模训练 |
| Areal | 🌟🌟 支持昇腾运行,仅支持FSDP并行 | 🌟🌟支持通过Agent开发框架直接定义环境 | 🔨🔨专门针对异步Agent强化学习场景设计,接口相对友好 | 🦅2-4节点规模训练 |
在选择框架时,算法复杂度、训练规模以及开发周期(有些项目可能仅仅只希望很快验证、有些则要长期迭代)三者要同时考虑。通常我们的经验是:一个8卡以内、模型不超过7B、上下文小于16k的简单Agent任务,用TRL可能更容易起步;如果目标是RL算法研发,或者准备做更大规模、更复杂的Agent训练,AReal和Verl更值得重点评估。

本教程我们最终选用了Verl框架,主要原因有两个方面:
-
从本教程开始策划一直到发布之际、Verl仍是对昇腾设备支持较完善的Agentic-RL框架之一。
-
我们希望教程能够帮助更多的开发者了解如何进行Agentic-RL,而Verl框架在社区中使用较广泛,相关资料和案例也相对更多。
由于该教程跨度的时间周期较长,除了Verl框架,社区也出现了不少专门针对Agent场景设计的框架如Areal和Slime(正在适配昇腾),我们也尝试在AReal上复现了我们的项目。AReal等框架由于支持OpenAI Agents相关能力,在轨迹生成场景上代码更简洁。不过在我们的实践中,Verl框架仍然在昇腾适配、灵活的并行策略和Agents行为控制上更符合本项目需要。
对于使用昇腾算力来进行Agent强化学习微调的开发者,我们建议重点评估Verl和AReal:
-
如果更关注于Agents搭建、或者已经在OpenAI Agents、Camel-AI等框架上搭建好了Agents,建议选用AReal。不过注意,AReal对于MindSpeed并行的支持仍在试验阶段。
-
如果更关注RL算法开发、或者模型参数量较大或者上下文较长,可以重点考虑Verl,其对于MindSpeed支持更好。
第四章:量化龙虾的设计
股票交易Agent设计
当然我们很难一步到位,构建一个大型金融量化系统。让我们用最“Claw”的方式做一个简单的设想——我们希望有一个能够每天帮我操作股票账户的量化龙虾,每天登陆我的账户、看看我关注的自选股,先看股票表现,再决策是否要调整的仓位。
那么对于这只量化龙虾,我们不需要它预测所有股票的长期价值,也不是模拟一个完整基金经理团队,而是在一个固定交易日、固定股票池和有限操作次数里,完成一次尽量合理的组合调整。
因此,在本项目中,我们将“量化龙虾”设定为一名负责单日调仓的量化交易分析师。每一条训练样本对应一个交易日,Agent会收到当天的大盘状态、初始持仓、可用现金和可交易股票池。我们希望它学会的不是“讲出一段看起来专业的行情分析”,而是把分析落到可以被环境检验的交易动作上。
更具体地说,我们希望Agent形成这样一条工作链路:
-
先理解当前账户状态:有哪些持仓、现金是否充足、可交易股票池有哪些。
-
再观察市场环境:大盘趋势、波动率、市场宽度、成交活跃度等信息是否支持进攻或防守。
-
然后针对候选股票调用工具,查看价格走势、技术指标或自定义Alpha因子。
-
最后给出可执行动作:买入、卖出或停止交易,并在
reasoning字段中说明决策依据。
这个设定对我们来说处在一个相对合适的位置:它有一定真实金融场景特征,能让模型面对噪声、风险和不确定性;同时又没有复杂到一开始就被完整交易系统拖住。对于希望尝试“LLM + 金融”的开发者来说,它展示的是一个较小但完整的Agentic-RL闭环:LLM负责分析和决策,Qlib负责提供市场数据,Verl负责采样轨迹和执行强化学习训练,交易环境负责把动作转换成可计算的收益反馈。

围绕这条链路,我们在量化龙虾的Agent系统中设计了四个核心工具:
-
GetPriceDataTool: 获取指定股票在指定时间段的价格数据,包括开盘价、收盘价、最低价、最高价、成交量等信息,以及区间最高/最低值和近X日走势统计指标。
-
GetMacroIndicatorsTool: 获取市场指数(如沪深300)的行情数据,包括开盘价、收盘价、最低价、最高价、成交量及区间涨跌幅、日波动率和近X日走势。
-
ComputeAlphaFactorTool: 计算各股票的Alpha因子,为模型提供额外的决策信号。
-
TakeAction: 用于模型执行交易决策(买入、卖出或停止)。
前三个工具负责给Agent提供交易信息,最后当Agent形成判断时,再通过TakeAction完成交易决策。我们希望把模型的“语言能力”和环境的“数据事实”分开:行情、指标和因子尽量来自工具,模型负责把这些信息组织成判断;而判断也不能只停留在分析报告里,最终要落到买入、卖出或停止交易上。这样后续的奖励函数才能根据真实价格变化,反过来检验这次决策是否有效。
这里也藏着一个教学项目里的取舍:真实的单日调仓通常会涉及更细的交易时序:例如在T日形成决策,在T+1进行挂单,并且还要考虑开盘价、成交量、涨跌停、撮合失败、部分成交、撤单等一系列真实市场问题。为了让第一版训练环境先跑起来,我们有意把这些逻辑简化了:Agent可以看到T+0的完整行情数据,并在提出调仓动作后,环境假设对应的T+1挂单能够成功成交,而不额外模拟复杂的撮合过程。在代码实现上,我们相当于把这个跨日撮合过程压缩进一个单日episode里处理。
这个简化会带来两个影响。一方面,它让训练环境变得稳定、可复现,模型每次动作都能被快速转换成组合变化和收益反馈;另一方面,它也提醒我们不要把这个系统直接当成严肃回测或实盘交易框架。我们这一步关注的是如何把金融场景抽象成一个可训练的Agent任务,而不是在第一篇教程里完整解决量化交易工程的全部细节。
系统提示词设计
提示词是这次实验里一个有点微妙的部分。我们一边希望通过RL让模型自己学会更好的交易策略,一边又不得不承认:Agent能不能稳定调用工具、能不能及时停止、能不能把分析落到动作上,很大程度上会被初始上下文影响。由于在Verl上打通完整Agent流程与工具已经花掉了不少时间,我们这次没有做完整的提示词消融实验,但还是留下了几条很有用的设计记录:
实际上提示词模版的设计给我们的实验带来了不少麻烦,我们发现Qwen3和Qwen3.5特别钟爱RSI_15这个指标,并且经常错误的将其传递到
ComputeAlphaFactorTool,但是当我们在工具的提示词中强调不要这么做时,这个问题还变严重了😭。

一、我们并没有将全部Agent提示词放在SYSTEM PROMPT当中,而是将“角色相关信息”放在了SYSTEM PROMPT而将“跟随交易动态变化的信息”放在了USER PROMPT当中。这么做的原因是因为选用的Qwen模型官方提示词模版是system-user-assistant...这样的user/assistant交替填充模式。而如果仅仅包含system prompt我们担心会和模型本身工作模式差异较大。
二、SYSTEM_PROMPT中包含了角色信息、工作流程、规则约束,我们最早的版本仅仅包含角色信息(描述了股票分析师的角色)和规则约束(Agent具体的行为,比如交易需要注意的事项等边界条件),但在推理验证阶段发现模型本身很容易产生错误行为,因此额外增加了人工定义的工作流程来收敛模型的行为——这提高了训练稳定性,但也可能限制模型的探索空间。考虑到算力预算,我们最终还是增加了工作流程约束以保障效果。
三、在我们的实验中,直接在系统中注入大盘信息,有助于提升模型的最终表现。因此在系统提示词中会将当日的大盘信息直接注入。
四、对于Qwen3模型,将函数工具描述再次注入到系统提示词中,有助于提升模型的调用准确率。
⚠️如果时间允许,我们会把提示词消融放得更靠前一些。Agentic-RL里的提示词可能会悄悄塑造模型行为:一个例子、一个候选列表顺序,甚至一句看似无害的流程提示,都可能让模型形成偏好。提前把这些影响摸清楚,后面的训练会少很多“到底是模型学会了,还是prompt把它推过去了”的困惑。
第五章:通过Verl框架实现Agentic-RL训练
Verl框架开发方法
在我们开始繁琐的编码任务之前,我们先了解下如何在Verl框架中开发一个Agent。
由于Verl的前身是一个大语言模型强化学习框架,所以其有关Agents的代码和基类放在了
<VERL_PROJECT>/verl/experimental当中,并且接口变动较大,本章节遵照main分枝上May 15, 2026@802256的接口实现进行讲解。未来接口可能变化,但在Verl上进行Agent Loop开发的基本设计思路预计仍会比较接近。
Verl框架是一个高度封装的训练框架,会负责帮助我们管理从大模型的分布式计算、经典的强化学习算法实现、以及Agent异步调度流程。因此,我们只需要实现两个核心部分:
-
实现Agent工具: 我们希望提供给大模型的Python函数工具,返回的信息需要是文本、方便加入LLM上下文。
-
定义奖励函数: 当Agent完成一个轨迹生成后、我们评估Agent在整个工作流程中的工作质量的方法
-
Agent循环流程: 从第一个初始化Agent的提示词开始的循环,包括模型输出、调用函数、工具返回结果输入、模型再输出等等的行为,以及最后终止循环的判断条件、奖励计算的整个流程。
当我们完成了Agent工具、奖励函数、以及较关键的Agent循环流程后,Verl框架会处理Agent循环过程中产生的全部上下文(也就是“轨迹”),并进一步添加损失掩码,用于后续的强化学习微调,完整流程可以见下图。

但是我们知道了设计理念,怎么在Verl上具体开发呢?这里我们画了一张金融Agent项目的各个模块与Verl框架的关系图,方便开发者快速理解Verl上训练Agent的核心思想。

Verl的训练都是通过verl.trainer下的各个算法函数开始的。比如我们使用GRPO算法训练我们的Agent,那么我们使用的就是verl.trainer.main_ppo函数(GRPO算法是PPO算法的一种特殊形式、所以通常大多数强化学习框架在实现上共用一套代码)。我们的训练从main_ppo开始,而所有的强化学习轨迹生成流程我们都需要遵照Verl框架定义好的基类开发。虽然这么做增加了代码的复杂性,但是经由Verl统一管理可以相对方便地实现跨机跨卡的并行轨迹采样。
那么对于我们的金融Agents,我们继承了verl.tools.base_tool.BaseTool开发了四个用于股票分析和仓位调整的工具。并且遵照verl.experimental.agent_loop.tool_agent_loop.ToolAgentLoop实现了整个金融Agents工具调用和仓位调整后的收益计算。而对奖励的处理,我们额外放在了reward_fn.py当中。
完成这些类后,我们需要将各个类的文件地址以字符串的方式传递给verl.trainer.main_ppo。这样verl.trainer.main_ppo就会根据并行策略实例化多个agents、实现并行采样,提升强化学习的采样效率。
Verl框架基于分布式计算框架 Ray 来实现跨节点、多卡的计算调度和数据传输。在实现上,Verl对Ray的核心类进行了封装,以便更方便地管理分布式计算任务。而 Ray 的设计理念是将计算逻辑封装为可远程调用的任务或 actor,从而支持分布式执行。
Agent循环实现

接下来我们进入Agent循环的具体实现,我们以单次轨迹生成到奖励计算再到进入verl.trainer.main_ppo进行训练为例。完整的流程如上图所示。首先我们将SYSTEM_PROMPT和USER_PROMPT拼接得到的初始提示词给到LLM,让模型生成第一个回复。接下来,模型会输出文本。如果检测到输出中有FUNCTION_CALL相关的信息,则匹配可用的4个工具:
-
如果是3个数据工具,则执行工具函数拿到结果,给到模型做下一波输出
-
如果是TakeActionTool,则判断交易动作:
-
如果是买入/卖出,则执行交易操作,更新持仓与现金信息,给到模型做下一波输出
-
如果是停止,则结束轨迹生成,进入到奖励计算和权重更新环节
当模型停止后,根据本轮交易的收益计算Reward,并给到verl.trainer.main_ppo进行GRPO强化学习训练,更新LLM的权重参数。多次采样并输入到训练器中的管道图如下所示:

Agent工具实现
对于股票数据的查询类接口我们主要使用开源的Qlib工具包实现。Qlib 是微软亚洲研究院推出的一个开源量化投资工具包,提供了大量的量化交易研究工具,包括便捷的数据获取与管理接口、灵活的特征工程功能、模型训练和回测系统,以及实验结果管理。当然在本项目中我们主要使用了Qlib的数据获取接口,用于给我们的量化龙虾提供分析用的数据。

这里有一个值得关注的细节:原始股票数据通常以矩阵形式呈现,里面包含高开低收、成交量和各种字段。我们最早也考虑过直接把这些数据交给模型,但很快意识到这会把问题变成“让LLM读表格”。于是我们把数据处理成易于阅读的格式化文本,让工具返回的信息更像人类交易员会读到的行情摘要。
以下展示三个数据工具的格式化文本示例:
GetPriceDataTool:
## SH600519 近5个交易日行情
最新:2024-01-15 开1680.00 高1720.00 低1675.00 收1710.00 量2.5万手
区间:最高1720.00(2024-01-12) 最低1675.00(2024-01-10) 涨跌幅+2.1%
技术指标(最新值):
- MA5: 1695.50
- RSI_14: 58.32
近5日走势:
2024-01-09: 收1675.00 量3.2万手
2024-01-10: 收1675.00 量2.8万手 ▼
2024-01-11: 收1690.00 量2.6万手 ▲
2024-01-12: 收1720.00 量2.9万手 ▲
2024-01-15: 收1710.00 量2.5万手 ▼
GetMacroIndicatorsTool:
## 指数 SH000300 近20个交易日行情
最新:2024-01-15 开3350.20 高3380.50 低3345.00 收3368.80 量1.2亿手
区间涨跌幅:-1.5%,日波动率:0.008
近5日走势:
2024-01-09: 收3420.00 量1.5亿手
2024-01-10: 收3405.00 量1.3亿手 ▼
2024-01-11: 收3380.00 量1.4亿手 ▼
2024-01-12: 收3395.00 量1.2亿手 ▲
2024-01-15: 收3368.80 量1.2亿手 ▼
ComputeAlphaFactorTool:
## 因子: Corr($close, Log($volume), 10)
最新值排名:
1. SZ000001: +0.8234
2. SH600519: +0.6542
3. SH000858: -0.1234
通过这种格式化文本的呈现方式,Agent可以更直观地理解股票和市场趋势,从而在调用 TakeAction 时做出更有依据的交易决策。一次典型的rollout大致会是:Agent先查看大盘环境,再查询一到多只候选股票的行情或因子,随后根据当前持仓和现金决定是否买入、卖出,最后调用TakeAction(type="stop")结束当天调仓。整个过程中,数据工具只负责提供观察,不直接产生奖励;主要奖励来自交易结束后,环境对最终组合表现的评价。
奖励函数设计
**任务奖励设计:**在股票交易Agent设计章节,我们已经介绍了对股票交易Agent的设计理念。我们的核心目标不是让“量化龙虾”在任意行情里机械追求绝对收益,而是让它判断:在给定初始持仓和现金的前提下,模型提出的新交易策略,是否真的比“什么都不做、保持原始持仓”的原始策略更好。
这里用 T0 表示模型决策和交易执行的日期。模型在 T0 可以看到 T0 及以前的数据,并在 T0 调用 TakeAction 买入、卖出或停止交易。所有中间步骤都不产生有效奖励,只有当一次轨迹生成结束时(单个交易日从分析到完成交易结束),我们才根据最终组合计算一次 r_outcome。
前瞻收益用的是 T+1、T+2、T+3 的收盘价按照 0.5、0.3、0.2 的加权结果。对于单只股票,其前瞻收益率记为:
Forward Return T = 0.5 ⋅ P T + 1 + 0.3 ⋅ P T + 2 + 0.2 ⋅ P T + 3 − P T P T \text{Forward Return}_T = \frac{0.5 \cdot P_{T+1} + 0.3 \cdot P_{T+2} + 0.2 \cdot P_{T+3} - P_T}{P_T} Forward ReturnT=PT0.5⋅PT+1+0.3⋅PT+2+0.2⋅PT+3−PT
在组合层面,我们分别计算两条路径:
-
原始策略收益: 保持 episode 开始时的初始持仓和现金不变,不执行模型提出的新交易。
-
新策略收益: 执行模型在 T0 的买入、卖出或停止操作,然后用同样的 T+1 到 T+3 前瞻价格重估最终持仓。
最终奖励信号不是新策略的绝对收益,而是相对原始策略的前瞻收益提升:
r o u t c o m e = NewStrategyReturn T + 1 : T + 3 − OriginalStrategyReturn T + 1 : T + 3 r_{outcome} = \text{NewStrategyReturn}_{T+1:T+3} - \text{OriginalStrategyReturn}_{T+1:T+3} routcome=NewStrategyReturnT+1:T+3−OriginalStrategyReturnT+1:T+3
这里的“提升”指收益率差值。例如原始策略前瞻收益为 +1.0%,新策略前瞻收益为 +1.6%,则 r_outcome 为 +0.6%,而不是用 +0.6% 再除以原始收益。
这样设计可以减少市场整体涨跌对奖励的干扰。上涨行情里,模型只有比原始持仓涨得更多才会获得正向奖励;下跌行情里,如果新策略比原始持仓少亏,也能得到合理反馈。
分桶奖励返回策略: r_outcome 是连续收益率,但金融市场噪声很大。如果直接把连续收益喂给 RL,模型可能会过度拟合很小的收益差异。因此我们把连续收益分桶成离散奖励:
r_outcome >= +0.80% → 强于原始策略,奖励 +3
r_outcome >= +0.40% → 明显优于原始策略,奖励 +2
r_outcome >= +0.10% → 小幅优于原始策略,奖励 +1
r_outcome >= -0.10% → 基本持平,奖励 0
r_outcome >= -0.30% → 小幅弱于原始策略,奖励 -1
r_outcome < -0.30% → 明显弱于原始策略,奖励 -2
**格式惩罚与边界情况:**由于我们选用的模型 Qwen3.5 本身已经经过了 Agent 强化学习训练,其在格式遵从、多轮工具调用上已经具备了较好的表现。因此,在奖励函数的设计时我们无需针对包括格式遵从、函数成功调用等基础能力给出额外的正向奖励。不过在少数情况下模型会传入错误的参数、提前停止、或者陷入不停分析的死循环。如果整条轨迹没有产生有效的终止交易决策,也就是没有得到有效的 terminal reward,我们将直接返回 -3。换句话说,-2 代表策略表现很差,-3 则专门表示工具调用或轨迹完成失败。
我们将亏损惩罚设置为最小-2、而将工具调用失败设置为-3有一个潜在好处:可以用奖励函数的数值大致判断模型在rollout中有多少次失败的轨迹生成。这样有助于我们通过SwanLab记录的训练reward判断问题更可能来自LLM能力,还是agent系统设计,而不用逐条翻rollout日志记录。
第六章:训练环境搭建
昇腾环境配置

本次训练我们采用的是8卡的昇腾910。昇腾NPU目前已支持完善的LLM RL训练工具链(verl、ms-swift、swanlab等),满足AgentRL训练要求。训练使用的昇腾环境细节一览表:
| 组件 | 规格 |
|---|---|
| CPU | 4 × Kunpeng-920 (48核心) |
| 内存 | 1.0 TiB |
| 训练设备 | 8 × Ascend 910 64G |
| 硬盘 | 1.75 TiB NVMe SSD + 4 X 3.84 TiB NVMe SSD |
| 服务器镜像 | openEuler release 22.03 LTS |
| 驱动版本 | 25.1.1 |
| 驱动 | Ascend-hdk-910-npu-driver_25.5.1_linux-aarch64.run |
| 框架固件 | Ascend-hdk-910-npu-firmware_7.8.0.6.201.run |
在安装下面的环境前,请确保你的昇腾机器已经装好了NPU driver、CANN 8.5.0版本以及Docker。
Verl环境安装

由于Verl框架依赖了大量的开源项目,这之中难免会存在包与包之间的环境冲突。我们将昇腾上Verl所依赖的各个关键包、以及与包间互相依赖关系绘制了出来(见上图)。本教程使用的Qwen3.5由于是今年年初才发布的模型,因此如transformers等包还需要手动更新至最新版本(5.0.0+),直接按照官方文档中的Verl安装方法可能导致无法运行。
开发者可以使用Docker安装环境,并手动升级Verl和Transformers来支持Qwen3.5
第零步:拉取项目代码
git clone <占位符号>
第一步:拉取和进入Verl镜像并进入镜像
docker pull quay.io/ascend/verl:verl-8.5.0-910-ubuntu22.04-py3.11-latest
docker run --rm \
--name verl-ascend \
--net=host \
--shm-size=100g \
--device /dev/davinci0 \
--device /dev/davinci1 \
--device /dev/davinci2 \
--device /dev/davinci3 \
--device /dev/davinci4 \
--device /dev/davinci5 \
--device /dev/davinci6 \
--device /dev/davinci7 \
--device /dev/davinci_manager \
--device /dev/devmm_svm \
--device /dev/hisi_hdc \
-v /usr/local/dcmi:/usr/local/dcmi \
-v /usr/local/Ascend/driver/tools/hccn_tool:/usr/local/Ascend/driver/tools/hccn_tool \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \
-v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \
-v /etc/ascend_install.info:/etc/ascend_install.info \
-v /root/.cache:/root/.cache \
-v <YOUR_PROJECT_PATH>:/root/trade-agent-rl # 将<YOUR_PROJECT_PATH>替换成实际项目的绝对路径
-it quay.io/ascend/verl:verl-8.5.0-910-ubuntu22.04-py3.11-latest bash
第二步:升级transformers至5.0+版本
pip install -U transformers
pip install numpy==1.26 # 确保transformers更新不影响numpy版本
第三步:安装pyqlib、swanlab等依赖包
pip install pyqlib swanlab modelscope atomgit
股票数据集下载
我们采用开源项目Qlib获取了25年1月-25年12月的历史交易数据作为我们的训练数据。Qlib官方提供的股票数据仅到24年底就截止了,这里我们使用了Github仓库chenditc/investment_data,它提供了中国A股从2000年至今,共计6000+个交易日的股市数据,含完整的6000多支股票,还包含了茅台、上证指数、沪深300、深证成指、沪深300ETF、黄金ETF共6个指数数据。这个数据源覆盖较完整,在此感谢作者的整理与维护。

将压缩包导入Qlib后我们可以直接获取
bash scripts/download_data.sh
在实际训练中,我们将股票数据集分为训练集、验证集和回测集三部分,让模型在训练集中学习,在验证集中反映学习情况,在回测集中模拟实盘评估模型的实际表现。这样做的好处是能客观反映模型的真实表现。这里我们按照时间进行划分而非随机采样以确保数据不泄漏。我们选择25年1月1日至25年6月15日的数据用于生成我们的训练集、使用25年6月16日-25年7月30日的数据构建测试集。

其中,每条数据会包含:日期、股票代码、开盘价、收盘价、最低价、最高价、成交量,如下所示:

模型选择与下载

Qwen3.5是阿里通义实验室于2026年开源的新一代大语言模型,这是一个原生多模态模型,在推理、编程、Agent能力与多模态理解等基准评估中表现较好。
相比它的前辈,Qwen3.5 在多模态理解、推理效率和Agent任务适配上都有进一步增强。
除此之外,在 Post-training 性能上,相对于 Qwen3 系列模型,Qwen3.5 也有一定提升 —— 这主要来自 Qwen3.5 对各类 RL 任务和环境的扩展,提升了模型对高难RL环境的适应性与可泛化性。
这些提升让Qwen3.5具备较好的通用Agent能力,也适合作为业务场景AgentRL训练的基座模型之一(如垂域 OpenClaw-like 应用、垂域软件助手等)。
我们选用了Qwen3-4B、Qwen3.5-4B和Qwen3.5-35B-A3B作为基座模型。下载命令如下:
modelscope download --model Qwen/Qwen3.5-4B --local_dir ./models/Qwen3.5-4B
modelscope download --model Qwen/Qwen3.5-35B-A3B --local_dir ./models/Qwen3.5-35B-A3B
测试环境安装
通常采用FSDP并行的情况下,vllm安装成功后环境基本都能够正常完成训练,这里我们重点测试vllm安装是否正常:
运行如下命令:
COMMENT: 从这里往后代码都没有加 bash 或 shell
vllm serve ./models/Qwen3.5-4B \
--port 8001 \
--served-model-name Qwen3.5-4B \
--max-model-len 4096 \
--reasoning-parser qwen3 \
--tool-call-parser qwen3_coder
在NPU服务器上新开启一个终端输入:
curl -X POST http://127.0.0.1:8001/v1/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen3.5-4B",
"prompt": "测试vllm服务是否拉起",
"max_tokens": 50
}'
如果能看到模型的文字回复说明环境安装完成。
第七章 运行训练
训练脚本运行
执行下面的代码,即可开启训练:
bash run_grpo.sh MODEL_PATH=~/models/Qwen3-4B # 或替换成其他模型
看到如下面截图所示的打印内容时,则代表训练正常启动,打印内容为单次轨迹生成模型的结果。

由于Agentic-RL涉及多次采样+超长文本微调,Qwen3-4B在8卡NPU上完整训练需要15h左右、Qwen3.5-4B需要20h+。
使用SwanLab跟踪训练进展
我们在SwanLab上实时观测训练效果:

可以看到在仪表盘上,Verl框架上报了接近150+个指标,我们并不需要完整查看所有指标,仅需看几个比较核心的指标:
-
val-aux/a_stock_single_day/reward/mean: 验证集上的平均奖励
-
response_length系列: 响应长度统计,反映模型的推理输出长度
-
num_turns系列: 对话轮数统计(Agent 任务中多轮交互的次数)
-
val-aux/num_turns系列: 验证集上的对话轮数统计
-
critic/advantages系列: 优势函数统计,反映当前策略相比基线的优劣程度
-
critic/rewards系列: 即时奖励统计
-
actor/entropy: 策略熵,衡量探索程度。值越高表示策略越随机,有助于探索;过低可能导致模式崩溃
-
actor/grad_norm: 梯度范数,监控梯度大小,防止梯度爆炸/消失
-
actor/pg_loss: 策略梯度损失(PPO 的 surrogate loss)
-
actor/ppo_kl: PPO 实际计算的 KL 散度,用于监控策略变化
回测实验与运行命令
训练过程中的验证集Reward只能告诉我们“单条轨迹”是否在奖励函数上变好,但它并不能完整回答另一个更接近我们所设想的使用场景的问题:当模型连续工作很多天时,它能不能稳定地读取行情、管理仓位、执行交易,并把前一天留下的账户状态带到下一天继续决策?因此我们设计了一个简单的回测实验用于验证模型连续多日管理持仓的能力,流程如下:
-
创建一个模拟账号,初始化当前组合的现金、持仓和净值。设置允许交易的股票池
-
运行Agent让模型基于当前现金与持仓情况,调用数据工具分析股票池中的股票表现,并作出交易决策
-
如果模型调用
TakeAction,脚本会用当天价格执行买入、卖出或停止交易,并把最新账户观察结果返回给模型。 -
当模型调用
TakeAction(type="stop")时,当天回合结束,组合状态进入下一个交易日。并重复过程2。
开启回测的命令如下:
- 将Verl保存的FSDP格式权重转化为HuggingFace格式:
python -m verl.model_merger merge \
--backend fsdp \
--local_dir ./{模型权重保存位置} \
--target_dir ./final_vllm_model_weights \
- 使用 vLLM 启动推理服务:
python -m vllm.entrypoints.openai.api_server \
--model ./final_vllm_model_weights \
--served-model-name trader_agent \
--port 8001 \
--max-model-len 20480 \
--enable-auto-tool-choice \
--reasoning-parser qwen3 \
--tool-call-parser qwen3_coder \
--language-model-only
- 在新的终端开启回测脚本、将访问vllm推理服务并进行回测,完成后会将收益率打印在屏幕上。
cd rollout_dashboard
uv run python backtest_cli.py \
--base-url http://localhost:8001/v1 \
--model trader_agent \
--start-date 2025-06-20 \
--num-days 60 \
--initial-cash 1000000 \
--temperature 0.7 \
--max-turns 10 \
--seed 42 \
-o ../logs/backtest_result.json
默认情况下,股票池会使用
train_data_config.DEFAULT_UNIVERSE中的前三只股票,初始现金为100万元。由于Qwen系列模型在温度为0时会出现严重的重复生成问题,因此我们将默认温度设置为0.7,并且固定随机种子为42。连续回测过程中前一天的交易结束后的Portfolio继续传给下一天。因此,模型第一天买入的股票会真实影响第二天的现金、持仓、市值和可卖数量。

- 运行回测看板:
cd rollout_dashboard && uv run streamlit run multi_compare.py
通过浏览器打开http://127.0.0.1:8501,即可打开回测可视化看板。
训练结果展示
我们使用25年6月20日作为初始日期,模拟10日连续交易,实验设置如下:
-
模拟日期:25年6月20日
-
模拟时长:连续60个交易日
-
初始现金:100万元
由于训练集截止到6月15日,为了尽量降低数据泄漏风险,我们将回测起始日期延后了5日。
下图对比了 Qwen3.5-4B 原始模型(绿色) 和 经过我们 Agentic-RL 训练后的 Qwen3.5-4B 模型(橙色) 在 60 个交易日模拟交易中的表现。回测区间为 2025 年 6 月 20 日至 2025 年 9 月 11 日,初始资金均为 100 万元。
可以看到,原始模型期末 NAV 为 1,053,220 元,累计收益 +5.32%;Agentic-RL 训练后的模型期末 NAV 为 1,093,474 元,累计收益 +9.35%。在盈利天数接近的情况下,训练后的模型获得了更高的净值增长。在该回测设置下,这可能反映出训练后的模型在交易机会识别和收益捕捉上有一定改善。
下方依次展示了两组模型的 NAV 曲线、每日收益分布,以及 60 个交易日内的详细交易记录。

当然,由于股票交易本身具有随机性,该次回测还不算完整、严格的对比测试。
使用拒绝采样对Qwen3.5-35B模型进行微调
为了探索更大规模模型的效果,我们尝试将经过Agentic-RL训练的Qwen3.5-4B模型的连续回测轨迹数据用于对Qwen3.5-35B模型进行微调,观察是否能够提升Qwen3.5-35B的性能表现。
考虑到直接使用全部轨迹未必能稳定提升模型表现,因此我们采用拒绝采样微调的思想,将经过Agentic-RL训练的Qwen3.5-4B模型生成的轨迹,按如下规则进行过滤:
-
去除 function calling 行为异常的轨迹
-
去除没有显式采用 TakeAction(type=“stop”) 主动结束的轨迹(这通常是由于重复生成导致的)
-
删除 NAV收益<0 的轨迹,换句话说只保留赚钱的策略。
通过上述规则,我们能够获取到一批质量相对更高的训练数据,并使用 MS-Swift 框架对 Qwen3.5 进行 lora 微调。训练参数如下:
| 参数 | 值 | 备注 |
|---|---|---|
| 数据集数量 | 121 | 每条轨迹不超过20k |
| LoRA rank | 32 | - |
| LoRA alpha | 64 | - |
| LoRA 作用模块 | all-linear | LoRA 应用目标模块 |
| 训练轮数 | 4 epoch | - |
| 训练Batch大小 | 32 | 采用8块NPU、4 accumulate |
| 学习率 | 1e-4 | - |
| warmup | 0.05 | - |
| 学习率衰减 | cosine | - |
训练命令如下:
swift sft \
--model '/models/Qwen/Qwen3.5-35B-A3B' \
--tuner_type lora \
--dataset './data/synth_grpo-192607_150_msswift.jsonl' \
--torch_dtype bfloat16 \
--num_train_epochs 4 \
--per_device_train_batch_size 1 \
--per_device_eval_batch_size 1 \
--gradient_accumulation_steps 4 \
--learning_rate 1e-4 \
--warmup_ratio 0.05 \
--lora_rank 32 \
--lora_alpha 64 \
--target_modules all-linear \
--eval_steps 10 \
--save_steps 10 \
--logging_steps 5 \
--max_length 20480 \
--output_dir /output \
--dataloader_num_workers 4 \
--report_to swanlab \
--swanlab_project trade-ft
可以通过SwanLab查看训练进展:

回测表现

同样我们运行了60d的连续回测,可以看到相比于Qwen3.5-35B-A3B模型(蓝色),微调后的模型在交易策略上更为保守。不过最终回测效果与原始模型接近。
总结
至此,我们完成了一次“金融小龙虾”Agent 的 Agentic-RL 训练实践。为了让教程更易读、易上手,我们在实验中简化了不少真实交易细节,例如股票交易中的 T+1 规则、手续费、滑点、成交量约束等。因此,这个实验更适合作为理解 Agentic-RL 训练流程的入门示例,而不是一个可直接用于实盘交易的完整系统。
另外,本次实验全程运行在自主创新昇腾设备上,训练过程整体较稳定,也初步说明自主创新 AI 硬件具备支撑这类 Agentic-RL 训练实践的潜力。希望这个教程能帮助大家更直观地理解 Agentic-RL,也期待自主创新算力生态继续完善。
附录
金融Agent初始提示词案例
System部分提示词如下⬇️
# Role
你是一个专业的量化交易分析师,负责分析 A 股市场并做出交易决策。你需要通过分析市场数据、计算技术指标和 Alpha 因子来决定是否买入或卖出持仓标的。
## Rules
- 每次交易股数须为 100 的整数倍
- 当日买入的股票不能当日卖出(初始持仓可当日卖出)
- 交易成本:买入万五 + 千一滑点,卖出千一点五+ 千一滑点
- 每日最多分析 3 轮,每轮最多调用 3 个数据工具
- 最多执行 3 次交易操作(买入或卖出均计入)
- **必须**在每个交易日结束时调用 TakeAction(type="stop"),不允许在未调用 stop 的情况下结束
- 可交易标的范围:SH600519、SZ002156、SH600036
## Workflow
每个交易日你会收到最近 5 天的市场状态、持仓明细和现金余额。你的工作流程是:
1. **获取数据**:调用数据工具获取需要的行情、指标或因子数据
2. **分析推理**:在工具返回数据后,在思考中综合分析所有信息,形成交易观点。
- 信息不足:跳回步骤 1 继续获取数据
- 信息充分:进入步骤 3 执行交易
- 达到最大分析轮数仍无法形成明确观点:跳转步骤 4 结束操作
3. **执行交易**:
- 买入/卖出:调用 TakeAction(type="buy"/"sell", symbol=..., amount=...)
- 若还有分析轮数,可跳回步骤 1 继续获取数据并分析其他标的
4. **结束操作**:调用 TakeAction(type="stop")
## 分析要求
- **多维分析**:综合考虑趋势、波动率、量价关系、大盘环境等多个维度
- **证据驱动**:每个判断都要引用具体数据支持,并在 reasoning 字段中清晰表达你的分析逻辑
- **风险意识**:始终评估下行风险,避免过度集中持仓
- **效率优先**:尽量用最少的工具调用获取关键信息,避免冗余查询,可以在一次请求中最大调用 3 个数据工具
- **坦诚表达不确定性**:在信息不充分时,明确表达你的置信度
请严格按照上述规则和流程进行分析和决策。
# 大盘环境说明
## 当前市场状态(2025-01-02)
- 波动率环境:中(近20日波动率处于过去一年的 65 分位)
- 市场趋势:短期下行(5日动量 -3.9%),中期下行(20日动量 -3.0%)
- 市场宽度:偏弱(上涨股票占比 17%)
- 成交活跃度:正常(近5日成交额较20日均值下降 15%)
- 风格倾向:大盘价值优于小盘成长(近20日超额 +2.9%)
user部分提示词⬇️
当前交易日:2025-01-02。
初始持仓:空仓
可用现金:1,000,000.00 元
请开始分析市场并做出交易决策。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐

所有评论(0)