大模型挖因子:从Transformer到提示工程,生成可回测的选股信号

发布时间:2026/10/25 13:44:45
大模型挖因子:从Transformer到提示工程,生成可回测的选股信号

简介:这份PDF是国金证券金融工程团队「Alpha掘金系列之五」的专题报告,面向量化研究员、因子挖掘从业者及对AI辅助投研感兴趣的进阶读者,系统探讨如何借助ChatGPT这一大语言模型挖掘高频选股因子。全文围绕模型原理、提示工程与因子实战三条主线展开:先解析Transformer架构、规模定律与RLHF训练流程,再讲解角色—任务—指令提示公式及思维链提示技巧,最后以价量变异系数因子和买卖盘力量因子为例给出完整测试结果,其中日频买卖盘力量因子多头年化超额收益达17.29%,并据此构建中证1000指数增强策略。资源包仅含1个PDF文件,大小约2.16MB,便于随身查阅与归档。目前已有248人学习,适合希望把提示工程落地到因子研究、并了解策略回测与风险提示的读者参考。

1. 大模型挖因子:为什么“会聊天”的模型能吐出可回测的选股信号

一份量化研究报告里最反直觉的结论,往往不是某个因子年化多少,而是“因子不是人想出来的”。当研究者把委托价、委托量这类高频字段丢给一个通用对话模型,经过几轮提示约束后,模型给出的买卖盘力量因子在日频上做出了 17.29% 的多头年化超额,降到周频仍有 9.77% 到 10.20%。这件事值得搞懂的地方不在于模型多聪明,而在于它把“因子挖掘”这个原本依赖研究员经验、文献阅读和反复试错的环节,变成了一个可被提示工程约束的生成过程。ChatGPT 背后的 Transformer 自注意力机制、RLHF 对齐和思维链提示,恰好构成了这条链路的三个支点。搞清它们怎么咬合,才能判断模型给出的因子是玄学还是可复现的工程产物,也才知道哪些环节必须人工兜底。

2. Transformer 与 RLHF:模型凭什么能“理解”金融语义

2.1 从 LSTM 的两个硬伤说起

要理解 ChatGPT 为什么能在量化场景里给出像样的回答,得先看它替代了什么。传统语言模型常用 LSTM,处理序列时有两个绕不过去的缺陷:一是对文本中不同词无法区分重要程度,所有输入被相对均匀地压缩进隐状态;二是长距离信息难以有效提取和记忆,序列一长就大量丢失。金融文本和高频字段描述恰恰是“关键信息稀疏、依赖跨度大”的典型,比如“买盘力量”这个概念,需要同时关联委托价偏离程度和委托量大小,LSTM 很难把这两类信号的权重拉开。

Transformer 的引入直接针对这两点。它通过跟踪序列数据中的关系来学习上下文,核心是自注意力机制:对输入数据的不同部分赋予不同权重。用机制语言描述,给定一个输入序列,模型为每个位置计算它与其余所有位置的相关性得分,再按得分加权聚合信息。这样“委托量”这个词在和“价格偏离”共现时会被赋予更高权重,而无关的填充词被压低。这个机制让模型能处理更大的数据集,也为后续参数规模扩张留出了空间。

从 GPT-1 的约 1.17 亿参数,到 GPT-2 的 15 亿,再到 GPT-3 的 1750 亿,参数数量的提升带来了所谓的涌现现象(Scaling Law):规模跨过某个阈值后,模型表现出训练目标之外的能力。这是“会聊天”的模型能跨界做因子挖掘的第一层底层原因——它不是被专门训练来做量化的,而是规模足够大之后,语言中隐含的逻辑结构被压缩进了参数里。

2.2 RLHF 三步:把“能生成”变成“按人类偏好生成”

仅有预训练,模型只是一个概率续写器,输出未必符合人类预期。RLHF(人类反馈的强化学习)解决的是对齐问题。报告里给出的训练流程可以拆成三步,每一步都有明确的数据流:

第一步,从大量包含人类真实意图的指令集合中采样,由标注人员对这些指令进行标注,标注完成后对模型做微调。这一步让模型学会“指令—回答”的基本格式。

第二步,再次从指令集采样作为输入,让模型对同一输入生成多个不同结果,标注员对这些输出的好坏顺序进行标注。得到排序后,训练一个打分模型(Reward Model),目标是让打分模型的输出贴近人类的偏好排序。这里的关键设计是“排序而非绝对打分”,因为人类对两个答案谁更好判断更稳定,对单个答案打几分则噪声很大。

第三步,从指令集合中采样新的指令作为输入,根据打分模型进一步优化模型输出,结合打分模型训练得到最终模型。

用伪代码表达这个偏好学习的目标,大致是这样:

# 简化示意:RLHF 第三阶段的偏好优化目标 # reward_model: 第二步训练出的打分模型 # policy: 当前待优化的语言模型 # ref_policy: 微调后的参考模型,用于约束偏移 for batch in instruction_sampler: response = policy.generate(batch.prompt) # 采样新指令下的输出 reward = reward_model.score(batch.prompt, response) # 打分模型给偏好分 kl_penalty = kl_divergence(policy, ref_policy) # 防止模型跑偏 loss = -reward + beta * kl_penalty # 最大化偏好分,同时约束偏移 policy.update(loss)

这段逻辑里有两个参数值得注意:reward来自打分模型而非人工实时标注,所以打分模型的质量直接决定对齐效果;beta控制策略模型偏离参考模型的程度,太小会退化成只会讨好打分模型的“应试”输出,太大则学不到偏好。报告没有展开这个系数,但常见的实现思路是用它平衡“有用”和“不胡说”。

对齐之后,模型才具备“常识”——输出内容接近人类的认知和需求。这也是为什么在因子挖掘时,模型能理解“原创性”“逻辑支撑”这类约束,而不是随机拼接字段。

2.3 Zero-shot、One-shot、Few-shot:提示的三种学习姿态

模型的学习能力还体现在示例泛化上。Zero-shot 指模型在没有经过训练数据的情况下,利用已有知识和推理能力完成新任务;One-shot 指只有一组训练数据时学习并完成任务;Few-shot 指少量训练数据下完成任务。这三者不是模型架构的差异,而是提示中给多少示例的差异。对量化研究的意义在于:不需要重新训练模型,只要在提示里放一两个因子构建示例,模型就能模仿出结构相似但字段组合不同的新因子。这为下一章的提示工程提供了操作空间。

3. 提示工程:角色、任务、指令如何约束因子输出

3.1 提示公式的三要素与约束力

提示工程的核心是通过设计和提供有效提示,指导模型的文本生成。基本公式由三个元素组成:角色,即模型在生成任务中应扮演的角色;任务,对需要生成的内容做清晰简洁的叙述;指令,生成文本时应遵循的规则。一般形式是“作为一个【角色】,按照这些指示生成【任务】:【指令】”。

以客服场景为例,提示可以写成“作为一名客服人员,请生成客户询问的回复:这些回复应当专业、准确、简洁”。这个公式的作用不是玄学,而是向模型灌输一种“角色”,起到约束行为的作用。角色越具体,输出越有针对性。报告里把角色从“量化研究员”细化为“资深的量化研究员”,并在指令部分追加“具有原创性、具有较强的逻辑支撑、且因子也应当有出色的业绩表现”,模型给出的因子就从泛泛而谈收敛到可构建的形态。

这里有一个容易被忽略的机制:提示中的约束词会改变模型输出分布的重心。模型在预训练时见过大量“因子”“IC”“回测”相关的文本,当提示明确限定数据范围(比如只用委托价和委托量)时,模型会优先激活与这些字段共现过的构建模式,而不是自由发挥。这就是为什么“限定数据使用范围”能显著提升因子可用性——它把搜索空间从整个语言分布压缩到了金融字段的子分布。

3.2 提示类型分类与情感分析的随机性

除标准公式外,提示可以按任务类型分类。知识生成提示把新信息与特定主题的现有知识结合,生成新知识;情感分析提示让模型判断输入文本的情感色彩;强化学习提示通过输入和奖励让模型调整行为;对抗性提示则让模型生成难以被分类的文本。这些类型在量化场景里各有对应:知识生成对应因子构思,情感分析对应新闻情绪因子,对抗性提示可以用来检验因子是否容易被市场“反向利用”。

报告用两段新闻热点测试情感分析,发现当输入文本没有特别明确的情感词时,模型输出会有一定不确定性,但整体仍能保证一定准确率。这个现象要归因于神经网络本身的随机性,而不是提示写错了。常见的实现思路是在提示里要求模型给出判断依据,把“结论”变成“结论加理由”,用理由的合理性来过滤随机波动。这一点在因子挖掘里同样适用:要求模型解释因子的经济学逻辑,比只要求它给公式更可靠。

3.3 思维链提示:把 IC 指标的漏洞逼出来

思维链提示(Chain-of-Thought Prompting)的思路是把复杂问题拆成多个步骤,引导模型逐步思考并纠偏。报告用一个具体例子展示了它的价值:IC 指标(秩相关系数)作为因子评价方式存在漏洞,两个 IC 值分别为 0.22 和 0.25 的因子,A 因子 IC 较低但多头表现较好,B 因子 IC 较高但多头组表现最差。如果直接问模型“怎么改进 IC 指标”,模型很难给出切中要害的回答;但用思维链分步引导后,模型先认识到问题,再给出“每组内分别计算 IC 值再求均值”的方案,经进一步提示后收敛到“计算加权平均 IC,给做多组更高权重”。

这个过程的机制意义在于:思维链把模型的单步映射变成了多步推理,每一步的输出成为下一步的上下文,自注意力机制在每一步重新分配权重。模型并不是真的“想”了,而是中间步骤的文本为后续生成提供了更精确的条件分布。报告也指出,模型对 A 股做空限制认识不足,需要进一步提示才给出“做多组权重更高”的答案。这说明思维链能提升推理质量,但不能替代领域知识注入,提示者必须自己知道正确答案的方向。

4. 因子构建实战:从变异系数到买卖盘力量的实现细节

4.1 周频变异系数因子:IC 好看但多头不赚钱

中低频测试里,模型给出的因子在收盘价和成交量两个维度分别计算变异系数,再相乘得到综合因子,用来衡量波动性和流动性。研究者进一步变形,把两者相除得到 LI2VLI。构建方式用日频量价数据,取过去 5 天的价格和成交量变异系数:

# 变异系数因子构建(示意) # price, vol: 过去 5 日的收盘价与成交量序列 import numpy as np li = np.std(price) / np.mean(price) # 价格变异系数 vli = np.std(vol) / np.mean(vol) # 成交量变异系数 li_x_vli = li * vli # 相乘综合因子 li_2_vli = li / vli # 相除变形因子

参数上,np.std默认总体标准差,np.mean为均值,5 日滚动窗口对应周度调仓的观察期。测试区间为 2016 年至 2022 年 8 月,股票范围是中证 1000 成份股,周初开盘价买入、周末收盘价卖出。结果四个因子 IC 的 T 值均大于 2,IC 均值从 2.79% 到 5.36% 不等,方向为负,说明价格和成交量波动率越低越好,符合低波动异象。

但多空组合指标暴露了问题:LI 因子年化收益 8.35%、夏普 0.51,多头组合年化超额收益却是 -1.09%;VLI 因子多头超额 2.75%,也不足以支撑策略。IC 显著而多头不赚钱,本质是因子单调性不够,空头端的贡献被多头端的疲弱抵消。这个结果对提示工程的反馈是:模型能给出统计上显著的因子,但“显著”和“可交易”之间隔着组合构建这一层,提示里如果不约束多头表现,模型不会主动考虑交易方向的不对称。

4.2 买卖盘力量因子:委托价与委托量的加权逻辑

高频测试限定数据范围为委托价和委托量,模型经过引导给出买卖盘力量因子。构建时对每只股票每天的 3 秒快照数据分别求出前十档的买入委托价、买入委托量、卖出委托价、卖出委托量,每个交易日求均值。核心公式为:

# 买卖盘力量因子(示意,基于前十档快照均值) # b_vol, s_vol: 买盘/卖盘委托量均值 # b_price, s_price: 买盘/卖盘委托价均值 # mid_price: 参考中间价,用于标准化价格偏离 b_force = b_vol * (1 - b_price / mid_price) # 买盘力量 s_force = s_vol * (s_price / mid_price - 1) # 卖盘力量 bs_force = (b_force - s_force) / (b_force + s_force) # 差异因子,标准化到横截面可比

三个公式的设计动机不同。买盘力量用1 - 买价/中间价,买价越接近中间价,买盘越强;卖盘力量用卖价/中间价 - 1,卖价越远离中间价,卖压越弱。差异因子做(B-S)/(B+S)的标准化,是为了让不同股票之间可比——原始力量值受委托量绝对规模影响,直接相减会让大盘股天然占优。报告特别说明,这一步标准化是研究者基于逻辑合理性做的修正,模型原始输出未必包含。

日频测试区间为 2016 年 1 月至 2022 年 8 月,中证 1000 成份股,次日开盘价买入。结果 BSForce 的 IC 均值 1.13%、T 值 7.00,多空年化 37.00%、夏普 4.51、最大回撤 4.88%,多头年化超额 17.29%。SForce 的 IC 均值 -1.02%、T 值 -2.87,多头超额 6.57%。BForce 的 IC 不显著,但多头超额有 11.17%。这组数字说明两件事:差异因子综合了两个方向的信息,表现最稳;单方向因子的 IC 显著性和多头收益并不一致,选因子不能只看 IC。

4.3 降频与指数增强:衰减速度决定调仓频率

日频调仓成本过高,报告把因子降到周频测试。由于 BSForce 衰减过快,第二天基本失效,降频只保留买盘和卖盘力量因子。周频下多头年化超额分别为 9.77% 和 10.20%,多空单调性一般但多头组合尚可。最终用表现较好的卖盘力量因子构建中证 1000 指数增强策略,在单边千分之二手续费率下,年化超额 7.17%,信息比率 0.57。

这条链路里最值得记住的参数是“衰减速度”。高频因子往往在日内或次日最强,降频不是简单地把信号拉长,而是重新检验信号在更长持有期内的排序能力。报告选择卖盘力量而非差异因子做策略,正是因为差异因子衰减太快,周频下已经失去区分度。常见的实现思路是在降频时同时测试多个持有期,用 IC 衰减曲线选拐点,而不是拍脑袋定周频。

4.4 代码能力测试:框架能给,细节要自己兜

报告还测试了模型的代码输出,结论是针对常用的量化研究框架、函数能较准确给出结果,但使用时需要注意代码细节,确保符合实际需求,微调后可以大幅提升研究效率。这一点在因子实现里尤其明显:模型可能给出正确的滚动窗口逻辑,但字段名、复权方式、停牌处理这些细节需要人工核对。把模型当“框架生成器”而不是“最终代码作者”,是更稳妥的用法。

5. 避坑与排查:模型挖因子时最容易翻车的几处

5.1 现象:IC 显著但多头亏钱

原因:模型优化的是因子与收益的秩相关,不区分多空两端贡献,遇到单调性差的因子时 IC 被空头端拉高。解决:在提示里明确要求“多头组表现”,并在回测时单独看多头超额,IC 只作为初筛。

5.2 现象:同一提示两次输出因子不同

原因:神经网络生成具有随机性,温度参数和采样策略都会影响结果。解决:对同一提示多次采样,保留结构稳定、逻辑可解释的版本;要求模型给出构建理由,用理由一致性过滤随机波动。

5.3 现象:高频因子回测很好,实盘成本吃光收益

原因:日频调仓换手极高,单边千分之二的手续费在频繁交易下累积惊人。解决:先看因子衰减曲线,再定调仓频率;降频后重新检验 IC 和多头超额,不要直接沿用日频参数。

5.4 现象:模型给出的公式字段对不上

原因:模型基于通用语料生成,不熟悉具体数据源的字段命名和复权规则。解决:在提示里附上字段清单和数据样例,生成后逐字段核对,复权、停牌、涨跌停处理必须人工补。

5.5 现象:思维链引导后模型“顺着说”

原因:模型会迎合提示中的暗示,给出看似合理但经不起推敲的方案。解决:分步验证每一步的中间结论,对关键假设(如做空限制、交易成本)主动追问,不让模型在错误前提上继续推理。

6. 设计取舍:把模型当研究助手而不是策略作者

走到这里,最该想清楚的是一个取舍:模型在因子挖掘里到底该承担多少责任。报告给出的证据是双向的——它能给出买卖盘力量这种有原创性、逻辑自洽的因子,也能给出 IC 显著但多头不赚钱的变异系数因子;它能生成可用的测试框架代码,但字段细节需要人工兜底。这个边界不是模型能力不足的临时状态,而是生成式模型的工作方式决定的:它优化的是文本的合理性,不是策略的盈利性。

我一般会这么理解这套流程的分工:提示工程负责把研究员的领域知识压缩成约束条件,模型负责在约束下做组合搜索,回测负责做最终裁判。三者缺一不可,但权重不同。约束条件写得好,模型的搜索空间就窄,产出可用率高;约束写得松,模型会给出一堆“看起来像因子”的东西,筛选成本反而更高。报告里从“量化研究员”到“资深量化研究员”再到限定数据范围,就是逐步收紧约束的过程。

验证方法上,有几个可操作的检查点。第一,看因子是否有经济学解释,模型给出的构建理由能不能用市场微观结构或行为金融的逻辑讲通;第二,看参数敏感性,滚动窗口从 5 日改到 10 日,IC 是否剧烈波动;第三,看衰减曲线,信号在持有期内是否平滑衰减而不是断崖式失效;第四,看多头和空头贡献是否对称,不对称时策略只能做单边。这四点不需要复杂工具,但能过滤掉大部分“回测好看、实盘翻车”的因子。

还有一个容易被低估的取舍是随机性管理。模型的随机性在情感分析里表现为输出波动,在因子挖掘里表现为同一提示产出不同公式。完全消除随机性不现实,可行的做法是把随机性当成采样工具:多采几次,取交集或取逻辑最自洽的版本。这比追求“一次问对”更符合模型的工作特性。

从那以后我每次用模型做因子构思,都强制走一遍“提示约束—多次采样—逻辑复核—衰减检验”的流程,不跳过任何一步。模型可以帮你把搜索空间打开,但关上门做决定的还得是回测和交易常识。希望帮到你。

本文还有配套的精品资源,点击获取