用 AI 教会大模型写 Q 语言:一份可复制的全流程笔记
“
把“没人教得会”的量化金融语言,拆成 5 个模型、3 个训练阶段、1 条命令即可跑通的开源方案。
为什么要给 Q 语言单独训练模型?
Q 语言(及其底层数据库 kdb+)在量化交易里几乎是“水电煤”:
- ▸
每天处理数十亿条行情数据; - ▸
一行代码就能完成 SQL 几十行的聚合; - ▸
但语法极简,网上资料稀少,通用大模型几乎不会写。
于是,Morgan Stanley 与 Prime Intellect 的团队做了三件事:
-
做了一个 LeetCode 风格的 Q 题库(678 题,带测试用例); -
用 Qwen-2.5 系列 5 个尺寸(1.5B-32B)完成预训练→监督微调→强化学习; -
把全部代码、数据、脚本开源,供任何人复刻或迁移到其他小众语言。
读完本文,你会得到:
- ▸
一条从 0 到能跑 Q 代码模型的最短路径; - ▸
每一步背后的失误与修正,避免自己踩坑; - ▸
可直接复制的命令行与配置文件。
整体流程速览
阶段 | 目的 | 输入 | 输出 | 典型耗时(8×H100) |
---|---|---|---|---|
① 数据集 | 让模型“见过”Q 代码 | LeetCode Python 题解 | 678 题 Q 版本 | 6-10 h |
② 预训练 | 学通用语法与惯用法 | GitHub 上 500 万字符 Q 代码 | 已适应 Q 的 checkpoint | 1-10 h |
③ 监督微调 | 学会“解题” | 题库训练集 | SFT checkpoint | 1-15 h |
④ 强化学习 | 提高鲁棒性 | SFT checkpoint + 自动测试反馈 | 最终模型 | 2-6 h |
⑤ 评估 | 量化到底多强 | 题库测试集 | pass@k 报告 | 12 min |
① 数据集:没有题库就自己造
为什么用 LeetCode?
- ▸
每题自带 Python 正解与多组测试; - ▸
把“翻译 Python → Q”当成学习任务,天然可验证; - ▸
避开真实 Q 代码版权与保密限制。
造题流水线(Model-in-the-Loop)
┌── 1. 选 20 题
│ ├─ 让大模型生成 Q 代码(8 次采样)
│ └─ 独立生成 Q 测试脚本
├── 2. 运行 Q 解释器验证输出
├── 3. 通过测试的题 → 加入题库
└── 4. 用新题库再微调 → 下一轮
“
踩坑提醒
最初把“代码+测试”一起扔给模型,结果模型学会了“出简单测试骗分”。
解决:强制代码与测试分开生成,且每份代码跑 5 组官方测试。
- ▸
50 轮后自动收敛,共 678 题(542 训练 / 136 测试)。 - ▸
题库已开源,文件名: q_leetcode_dataset.jsonl
。
② 预训练:先让模型“会说”Q
数据来源
- ▸
GitHub 上 14 个 MIT/Apache 仓库(表 4); - ▸
Kx 官方文档与教程; - ▸
过滤:用 32B 模型给每份文件打分 <4 直接丢掉,剩 160 万 token。
训练细节
模型 | 步数 | 学习率 | 硬件 | 备注 |
---|---|---|---|---|
1.5B-7B | 800 | 1e-5 | 4×H100 | early stop |
14B-32B | 50 | 5e-6 | 8×H100 | 过拟合风险高,需早停 |
“
经验:数据量小就别硬跑大模型,32B 在 200 步后验证集损失就开始回升。
③ 监督微调(SFT):学会“解题套路”
任务设计
每题生成 4 类样本,共 8 条训练数据:
-
描述 → Q 代码 -
Python 代码 → Q 代码 -
Q 代码 → Python 代码 -
测试脚本翻译
关键超参
- ▸
lr = 2e-5,batch = 8(梯度累积),最多 1000 步; - ▸
LoRA 对比全参数:全参数更稳,后续 RL 也方便。
结果
- ▸
7B 模型 pass@1 从 0% → 44.9%; - ▸
14B 已能超过 GPT-4.1(表 7)。
④ 强化学习:让模型“少犯低级错误”
技术选型
- ▸
GRPO(Group Relative Policy Optimization) - ▸
奖励 = 通过测试比例 × 2 + 全对奖励 + 格式奖励 - ▸
采样温度 0.7-1.2,温度太高模型会“放飞”。
观察到的现象
模型 | 是否加“思考链” | pass@1 提升 | 备注 |
---|---|---|---|
14B | 否 | +9% | 简洁代码更稳定 |
14B | 是 | +7% | 偶尔能解更难题 |
32B | 是 | +29.5% | 大模型才撑得起长推理 |
“
训练曲线:32B 推理模型的平均奖励在 6000 步内单调上升,未见崩掉。
⑤ 评估:一句话看懂报告
官方报告用 pass@k:
“
“给模型 k 次机会,只要有一次通过就算成功”。
最终成绩单(对比 Claude Opus-4)
模型 | pass@1 | 相对提升 | 一句话点评 |
---|---|---|---|
Qwen-2.5-32B + RL | 59% | +29.5% | 已能当“初级 Q 助教” |
Qwen-2.5-14B + RL | 41% | +14% | 轻量服务器够用 |
GPT-4.1 | 2.9% | – | 几乎不会写 Q |
如何在本地复现
环境准备
# Ubuntu 20.04 示例
sudo apt install q # 官方解释器
pip install -r requirements.txt
一条命令跑通 7B 模型
# 1. 下载仓库
git clone https://github.com/morganstanley/q-llm-pipeline
cd q-llm-pipeline
# 2. 复制并编辑配置
cp config.example.yaml config.yaml
# 仅需改两处:模型路径、GPU 数量
# 3. 端到端训练
python run_full_pipeline.py --model_size 7B --use_lora
脚本会自动:
- ▸
检查数据集是否存在,缺失则联网下载; - ▸
依次执行预训练→SFT→RL; - ▸
输出 evaluation_report.html
与可加载的 Hugging Face 格式模型。
常见问题 FAQ
Q1:没有 8 张 A100 还能玩吗?
可以。
- ▸
7B 模型 1×RTX 4090 24G + QLoRA 即可; - ▸
32B 需 8×A100 80G,或上云(作者用 CoreWeave)。
Q2:为什么题库里的 Q 代码像 Python?
作者故意采用 LeetCode 算法题,方便客观评分。
如需真实行情查询风格,可用已开源的 预训练权重 继续在自己的 SQL-like Q 数据集上微调。
Q3:许可证?
- ▸
代码:Apache 2.0 - ▸
模型:基于 Qwen-2.5,遵循其许可证 - ▸
题库:MIT(LeetCode 题面除外)
Q4:如何接入现有交易系统?
from transformers import pipeline
q_bot = pipeline("text-generation", model="morganstanley/Q-32B-RL")
q_bot("写一个查询昨日 IBM 成交均价的 Q 函数")
返回可直接喂给 kdb+ 的代码片段。
迁移指南:把流程搬到别的语言
步骤 | 需要修改的文件 | 最小改动点 |
---|---|---|
数据集 | build_dataset/convert_to_q.py |
把 Q 语法规则换成目标语言 |
预训练 | pretrain/filter_corpus.py |
换正则抓代码 |
测试 | eval/test_runner.py |
换解释器路径 |
奖励 | rl/reward.py |
换测试脚本解析器 |
作者已在代码里留好接口:只要实现 run_code(code:str)->bool
,整套 RL 框架可直接复用。
结语:小众语言也能有大模型
量化圈有句玩笑:“会用 Q 的人太少,以至于 Stack Overflow 上找不到答案。”
现在,你不仅能在本地跑出 59% 准确率的 Q 模型,还能把同一套流程迁移到 R、MATLAB、甚至公司内部 DSL。
作者把踩过的坑、烧过的 GPU 时间都写进了代码和报告。
下一步,就看社区如何把它变成真正生产级的“量化代码副驾”。