← 返回 2026-10-06

QuantCode 模型:面向可执行算法交易代码的语言模型专用化 QuantCode Model: Specializing Language Models for Executable Algorithmic Trading Code

Alexey Chernysh, Orkhan Ekhtibarov, Dmitry Zmitrovich 📅 2026-09-30 👍 10 2026-11-11 18:30
Agent评测 代码生成 大语言模型 灾难性遗忘 监督微调 算法交易 继续预训练

领域继续预训练与验证SFT专用化LLM生成可执行量化代码,并发现工具调用能力退化

前置知识

继续预训练(Continued Pretraining)

在已训练好的基座模型上,用目标领域的大规模原始语料继续做因果语言建模。它没有显式的指令-回答配对,只是提升领域文本在模型中的先验概率,用来注入领域 API、术语和代码惯用法。

本文用它让 35B/397B 模型熟悉算法交易框架代码(约 5-6B tokens),是两阶段训练流程的第一阶段,其增益与副作用(工具调用退化)是全文核心议题之一。

监督微调(SFT)

用(输入,目标输出)配对数据对模型做条件负对数似然训练,直接教模型从请求映射到答案。关键在于目标数据的质量:本文的每个代码目标都必须在真实回测环境中通过执行验证后才入库。

SFT 是本文增益最大的干预(Judge Pass 从 33.0% 提到 58.2%),理解它与预训练的区别才能理解'两阶段作用于流水线不同环节'这一核心结论。

Backtrader 与回测

Backtrader 是 Python 量化回测框架,提供策略生命周期方法、指标、数据馈送、订单提交与跟踪等原生抽象;回测指在历史行情数据上重放策略、模拟交易执行。正确实现需要跨 bar 管理状态并正确构建指标数据依赖。

Backtrader 是本文唯一的目标框架:预训练语料、SFT 目标和 QuantCode-Bench 的 400 个任务全部围绕它,模型必须生成能初始化、执行并产生至少一笔交易的策略代码。

QuantCode-Bench 与 Judge Pass

含 400 个 Backtrader 策略生成任务的基准,按'编译→回测执行成功→至少一笔交易→LLM 语义判官'的分级流水线判定成功。Judge Pass 指通过最终语义对齐判官(GPT-5.4)的任务比例,是论文的主要汇报指标。

论文所有训练效果的量化都建立在这套分级指标上(Backtest/Trades/Judge),分级设计恰好揭示了预训练与 SFT 各自改善了流水线的哪一环。

Agentic 多轮修复

模型先提交代码,失败后接收结构化工具反馈(报错信息、回测输出等),并可在最多 10 轮内修订重试。T1/T3/T5/T10 表示在对应轮次预算内的累计判官成功率,反映模型利用运行时反馈自我修复的能力。

agentic 设定暴露了预训练 checkpoint 的隐性缺陷:首轮变好(T1 从 22.3% 到 32.3%)但终轮反而变差(T10 从 47.5% 跌至 32.5%),说明它丧失了处理对话反馈的能力。

灾难性遗忘与能力保持

模型在窄分布数据上高强度训练后丢失原有通用能力的现象。本文中领域专用化破坏了结构化工具调用的语法(输出未闭合的工具调用标签,解析器无法解析,agent 循环卡死)。

这是论文最有部署价值的发现:基准分数提升的同时,生产环境必需的能力可能悄悄退化,且恢复调用语法(格式)不等于恢复工具使用策略(决策质量)。

模型合并(Model Merging)

在参数空间对多个 checkpoint 做线性组合(如 $\theta = 0.65\theta_A + 0.35\theta_B$)以低成本混合能力,源自 model soups 与 task arithmetic 等工作,常用工具为 MergeKit。

本文用 0.65/0.35 线性合并尝试恢复工具调用格式但失败,而以合并 checkpoint 为起点的恢复 SFT 才部分恢复格式——这一对比是理解恢复实验设计的前提。

研究动机

LLM 已经是强大的通用代码生成器,但可执行的算法交易代码是一个苛刻的专用化目标。一份自然语言策略请求往往同时指定指标组合、入场/出场条件、仓位规模、止损逻辑、时间约束与风控规则,模型必须把意图映射到 Backtrader 这类专业框架:正确构建指标的数据依赖、跨 bar 管理状态、提交并跟踪订单。这类错误难以在文本层面发现:代码可能语法正确却初始化失败;可能成功执行却从不触发自己的入场条件;可能产生交易却实现了一个与用户请求不同的策略。作者指出,文本相似度或编译通过率都无法可靠捕捉这些失败模式。此前的基准测量也显示通用模型间差距巨大:Claude Opus 4.6 单轮 Judge Pass 为 75.8%,而 Qwen3.6-35B-A3B base 只有 27.8%,397B 的 base 也只有 41.5%。

本文的目标是本文要回答的不是'哪个通用模型更强',而是'定向训练能否改变以执行为中心的基准所测量的能力画像'。作者系统考察两个互补机制:其一,在算法交易框架与仓库代码上做继续预训练,目标是提升领域与 API 熟悉度;其二,在经执行验证的'用户请求→代码'对上做监督微调(SFT),目标是直接学习意图到可运行代码的映射。实验在同一模型谱系内构成顺序可比的训练序列:Qwen3.6-35B-A3B 走 base→继续预训练→SFT 三阶段,Qwen3.5-397B-A17B 走 base→继续预训练两阶段。评测覆盖单轮与 agentic 多轮(最多 10 轮修复)两种 QuantCode-Bench 设定,并扩展到约 200 任务的仓库级 SWE-bench 式赛道和结构化工具调用恢复实验。

与已有工作不同的是,独特切入角度体现在四个方面。第一,训练中心视角:不在横向榜单上比较各家旗舰,而是在自己的模型谱系内逐阶段归因增益,因此预训练与 SFT 各自的贡献可以被干净地测量。第二,坚持行为接地:成功必须同时满足可执行、产生交易、语义判官通过三重条件 $S(x,y)=\mathbb{1}[B{=}1\wedge T{=}1\wedge J{=}1]$,而非文本指标。第三,实证发现两个阶段作用于流水线的不同环节:预训练主要提高领域熟悉度,SFT 同时修复可执行性与语义对齐。第四,也是最具部署价值的发现:领域专用化会破坏解析器合规的结构化工具调用,且恢复调用语法与恢复工具使用策略是两件不同的事——这一'能力保持'维度恰恰是 QuantCode-Bench 协议本身不测量的,直接揭示了以基准为中心做领域专用化的方法论盲区。

核心方法

直觉上,方法让模型先'读过'领域代码、再'做过'经过验证的任务。继续预训练语料约 5-6B tokens,来自 GitHub 上按交易与回测关键词检索、经星标数与最近提交日期过滤、再用 MinHash 去重的算法交易仓库,覆盖策略生命周期、指标、数据馈送、订单提交等框架惯用法。SFT 数据约 800 对:请求取自 Reddit、StackExchange 与 GitHub 的策略讨论,经模型判官按质量排序,非请求形式的内容在保留底层逻辑前提下改写为真实用户查询;代码目标在与框架同置的 agentic 环境中生成,鼓励使用 Backtrader 原生抽象,并经执行验证(畸形 import、无效 API、初始化失败、运行时异常等一律剔除)。两阶段均为全参数 bf16 训练,FSDP2 加 8 路专家并行。继续预训练用 AdamW($\beta_1{=}0.9$,$\beta_2{=}0.95$),峰值学习率 $1\times10^{-4}$ 余弦衰减至 $1\times10^{-6}$,全局 batch 为 512 条 8192 token 序列,共 2250 步;SFT 用恒定 $1\times10^{-5}$、batch 128、3 个 epoch、不做序列 packing。

核心创新不在监督目标本身——SFT 就是标准的条件负对数似然 $\mathcal{L}_{\text{SFT}}(\theta)=-\sum_{t=1}^{|y|}\log p_\theta(y_t\mid x, y_{<t})$——而在于目标分布的构建方式:每个 SFT 目标代码都必须在真实回测环境中通过执行检查后才入库,系统性排除'看起来合理但运行时不兼容'的样本,这是与常规静态 SFT 数据集的本质区别。第二个创新是实验设计:同一 35B 谱系内 base→预训练→SFT 的顺序对照使各阶段增益可直接归因,397B 谱系的 base→预训练对照又独立验证预训练效应在更大规模上成立。第三个创新是对能力保持失败的系统处理:发现专用化 checkpoint 频繁产生未闭合工具调用标签后,先试权重合并 $\theta_{\text{merged}}=0.65\,\theta_{\text{SFT}}+0.35\,\theta_{\text{orig}}$(失败),再做恢复 SFT(用 Qwen3.5-122B-A10B 经 OpenHands 生成的软件工程轨迹与领域策略轨迹,assistant-only 损失掩码,16k/32k 两变体),并把'解析器合规'与'下游工具使用效用'明确分离为两个量。

方法步骤详情

流程分五步。第一步,语料构建:关键词检索 GitHub 算法交易仓库→星标与活跃度过滤→MinHash 去重,得到 5-6B tokens 预训练语料。第二步,继续预训练:输入为原始领域代码序列,目标是因果语言建模,不含请求-回答映射,配置为 AdamW、峰值 $1\times10^{-4}$、2250 步、FSDP2 加 8 路专家并行。第三步,SFT 数据构建:从 Reddit/StackExchange/GitHub 收集策略素材→模型判官排序→改写为可执行请求→agentic 环境生成代码目标→执行验证过滤,留下约 800 对,且刻意排除 QuantCode-Bench 任务避免泄漏。第四步,SFT 训练:在 35B 预训练 checkpoint 上以恒定 $1\times10^{-5}$ 训练 3 个 epoch。第五步,评测:单轮用 greedy decoding,判官为 GPT-5.4,逐级报告 $B(y)$(回测执行成功)、$T(y)$(至少一笔交易)、$J(x,y)$(语义对齐);agentic 设定下失败后给结构化反馈、最多 10 轮,记录 T1/T10;仓库级赛道约 200 个经可执行测试验证的任务;恢复实验另做部署级解析器合规检查。

技术新颖性

与已有工作的区别有三层。相对于领域自适应预训练文献(Gururangan 等)和代码预训练模型(Code Llama、StarCoder2、DeepSeek-Coder),本文把目标分布收窄到单一软件生态(算法交易框架),追求的不是通用编程能力而是框架 API、生命周期与订单语义的熟悉度。相对于 QuantCode-Bench 基准论文(只比较通用模型),本文是它的训练侧补充,证明基准的分级诊断能力同样适用于评估训练干预。相对于 SWE-bench 类仓库级基准,本文构建了领域化的仓库赛道并诚实报告了负面结果:恢复 SFT 只找回了格式合规(定性验证),仓库任务解决率(16k 变体 16.3%、32k 变体 13.0%)仍低于 base 的 23.7%,明确区分了'解析器接受调用'与'调用决策正确'这两个常被 agentic 评测混为一谈的量。这种把失败模式当作一等研究对象、并设计专门干预与评测的做法,在领域专用化文献中较为少见。

实验结果

四组核心结果。其一,继续预训练带来温和但一致的单轮提升:397B 的 Judge Pass 从 41.5% 升至 47.5%(+6.0),Backtest 65.5%→71.5%,Trades 42.8%→47.5%;35B 的 Judge Pass 从 27.8% 到 33.0%(+5.2)。其二,SFT 增益大得多:35B 谱系内相对预训练 checkpoint,Backtest 53.8%→83.5%(+29.7)、Trades 36.8%→60.0%(+23.2)、Judge 33.0%→58.2%(+25.2);相对 base 累计 +37.5/+31.5/+30.4。最大变化发生在可执行回测环节,说明验证过的目标分布主要修复了'能否写出可运行代码'。专用 35B 模型(83.5/60.0/58.2)超过 Gemini-3-Flash(Judge 59.8),仍落后 Claude Opus 4.6(75.8)。其三,agentic 结果揭示关键分化:预训练 checkpoint 的 T1 从 22.3% 升至 32.3%,但 T10 反而从 47.5% 跌至 32.5%,说明因果语言建模损害了对话反馈处理;SFT 则把 T1 提到 58.3%、T10 提到 79.5%。前沿模型同样受益于迭代(Opus 4.6 从 75.8% 到 97.5%)。其四,仓库级赛道上 GPT-5.4 解决 38.6%、Qwen3.5-397B 33.2%,绝对成功率远低于单轮策略生成;恢复 SFT 恢复了工具调用格式(定性验证),但仓库任务解决率 16k 变体仅 16.3%、32k 变体 13.0%,均低于 base 的 23.7%。

Training and evaluation regimes.
Table 1: Training and evaluation regimes.
Single-turn QuantCode-Bench results for the principal training interventions.
Table 2: Single-turn QuantCode-Bench results for the principal training interventions.
Selected current single-turn QuantCode-Bench results.
Table 3: Selected current single-turn QuantCode-Bench results.
Agentic QuantCode-Bench Judge Pass for Qwen3.6-35B-A3B checkpoints at the retained turn budgets.
Table 4: Agentic QuantCode-Bench Judge Pass for Qwen3.6-35B-A3B checkpoints at the retained turn budgets.
Repository-level algorithmic-trading software-engineering track.
Table 5: Repository-level algorithmic-trading software-engineering track.
Repository-level SWE-bench-like results for the tool-call recovery experiment.
Table 6: Repository-level SWE-bench-like results for the tool-call recovery experiment.
Single-turn Judge Pass under domain specialization.
Figure 1: Single-turn Judge Pass under domain specialization.
Agentic Judge Pass for the Qwen3.6-35B-A3B base and final domain-pretraining-plus-SFT checkpoints.
Figure 2: Agentic Judge Pass for the Qwen3.6-35B-A3B base and final domain-pretraining-plus-SFT checkpoints.
查看结构化数据
任务指标本文基线提升
QuantCode-Bench 单轮策略生成(35B 谱系) Judge Pass (%) 58.2(预训练+SFT) 27.8(base)/ 33.0(仅预训练) +30.4 / +25.2 个百分点
QuantCode-Bench 单轮策略生成(35B 谱系) Backtest 成功率 (%) 83.5(预训练+SFT) 46.0(base) +37.5 个百分点
QuantCode-Bench 单轮策略生成(35B 谱系) Trades 生成率 (%) 60.0(预训练+SFT) 28.5(base) +31.5 个百分点
QuantCode-Bench agentic 多轮(35B 谱系) T10 Judge Pass (%) 79.5(预训练+SFT) 47.5(base);32.5(仅预训练) +32.0 / +47.0 个百分点
QuantCode-Bench 单轮(397B 谱系) Judge Pass (%) 47.5(继续预训练) 41.5(base) +6.0 个百分点
仓库级算法交易 SWE 赛道(恢复 SFT 16k) 任务解决率 (%) 16.3(格式恢复但性能下降) 23.7(35B base) -7.4 个百分点(负面结果)

局限与改进

作者坦承的局限:SFT 只在 35B 一个规模上验证,且未测'无预训练直接 SFT'的对照;内部 checkpoint 来自演进中的训练计划,无法提供数据版本、种子与训练日程都冻结的公开复现包;LLM 判官只是语义代理,可能漏掉细微的策略逻辑不匹配或对特定模型有偏好;整个评测不涉及盈利性、交易成本、市场冲击与跨市场状态稳健性,报告的成功率不能解读为策略可用;训练语料与基准同域,存在代码基准污染风险,仓库级去污染和版本化尚待加强;工具调用的解析器合规率未留存定量数据,只能定性报告格式恢复;仓库赛道仅约 200 个任务且仍在开发中。我的补充观察:800 个 SFT 样本规模很小,数据效率与规模定律未知;恢复 SFT 从合并 checkpoint 初始化的选择未做消融,merge 的贡献不明;教师策略 Qwen3.5-122B-A10B 的仓库性能本身有限,off-policy 蒸馏的上限受教师约束;单一 GPT-5.4 判官构成单点偏差风险。

独立分析的弱点

独立弱点分析。第一,评测协议的盲区由作者自己意外发现:QuantCode-Bench 不测解析器合规的结构化工具调用,若没有部署前的真实 harness 测试,这个致命回归(工具调用含未闭合标签导致 agent 循环卡死)会被完全漏掉——任何领域专用化工作都应把目标部署格式的保持性检查内置进评测流程。第二,预训练 checkpoint 的 T10 崩溃(47.5%→32.5%)只有'指令跟随退化'的假说性解释,没有专门消融验证(例如在预训练语料中掺入一定比例 chat 格式数据是否可避免该退化),改进方向是预训练数据配比实验。第三,恢复 SFT 是纯 off-policy 蒸馏且教师本身仓库性能有限,16k/32k 变体的差异只能给出三条未验证假说(隐式过滤长轨迹、token 加权偏移、off-policy 失配),改进方向是 on-policy 轨迹收集、按成功结果过滤轨迹、或直接用执行信号做强化学习。第四,语义判官单点化且判官本身是生成代码质量的相关方,改进方向是多判官集成或执行轨迹对比。第五,预训练语料与基准同域且未彻底去污染,专用化增益可能被部分高估。

未来方向

作者明确提出的方向:在冻结基准版本的前提下,于更多模型规模上重复完整的预训练+SFT 序列(当前 SFT 效应只在 35B 验证);在仓库级轨迹(代码搜索、issue 解读、补丁生成、跑测试、多轮修复)上训练,把能力从独立策略文件扩展到真实软件工程;把结构化工具调用作为一等保持能力,将解析器有效性、参数合法性与下游工具使用质量分开评测;纳入真实用户轨迹,使请求分布与失败修正过程更贴近实际量化开发。基于本文成果可延伸的方向:用三重执行信号(可执行+交易+判官)作为奖励做 RLVR 式强化学习,替代或增强静态 SFT 以直接优化修复策略;把 agentic 修复成功案例回收为新 SFT 数据形成数据飞轮;研究灾难性遗忘的机制解释与更廉价的正则化手段(数据回放、参数正则)以避免专门的恢复训练;将盈利性与成本约束作为代码正确性之上的第二阶段分层评测,而非混入成功判据。

复现评估

复现评估:论文本质是一份内部训练计划的技术报告,作者明确承认未提供数据集版本、框架版本、优化器配置、随机种子与精确训练日程的冻结复现包。可获取的部分:基座模型 Qwen3.6-35B-A3B 与 Qwen3.5-397B-A17B 为公开权重;QuantCode-Bench 的 400 任务协议已在先前的基准论文中描述;训练超参数(AdamW 参数、学习率调度、batch 大小、FSDP2 加 8 路专家并行、bf16)报告得相当详细。未发布的关键资产:约 800 对 SFT 数据、5-6B token 预训练语料、约 200 任务的仓库级赛道、以及 122B 教师生成的恢复训练轨迹。算力门槛高:两阶段都是全参数微调,35B 级已需多机集群,397B MoE 的全参预训练更是重量级工程。综合判断:方法论描述足以支持小规模(如 7B 级基座加子采样语料)的概念验证复现,但完整复现难度中高,主要障碍是算力与未公开的数据资产。

相似论文推荐