简介:这份国金证券金融工程专题报告《Alpha掘金系列之五:如何利用ChatGPT挖掘高频选股因子?》面向量化研究员、因子投资从业者及对AI辅助投研感兴趣的进阶读者,系统探讨大语言模型在量化选股中的落地路径。报告从ChatGPT的Transformer架构、Scaling Law与RLHF训练机制讲起,进而介绍提示工程的基本公式与思维链提示技巧,并重点展示因子挖掘实战:由模型生成的价量变异系数因子、买卖盘力量因子,以及日频多头年化超额收益17.29%、周频9.77%至10.20%、中证1000指数增强策略年化超额7.17%等回测结果,同时提示代码微调与模型随机性风险。资源为单个PDF文件,压缩包约2.16MB,已有248人学习。读者可借此理解AI生成因子的完整研究框架、测试指标与策略构建思路,适合作为量化因子挖掘与提示工程结合的参考材料。
1. 大模型挖因子:为什么"会聊天"的模型能生成有效选股信号
一个反直觉的事实是:ChatGPT 从未见过任何 A 股 tick 数据,却能在限定"委托价 + 委托量"的条件下,给出一个日频多头年化超额 17.29% 的买卖盘力量因子。这不是玄学,而是大语言模型把"语言中的关系推断"迁移到了"金融变量间的关系推断"上。传统因子挖掘依赖研究员遍历财报、量价、高频数据库,手工试错;而 LLM 通过 Transformer 的自注意力机制,对输入序列的不同部分动态分配权重,本质上是在做一种跨域的"关系建模"。当你在提示里把"委托价""委托量""买卖盘失衡"这些概念以自然语言描述清楚,模型就能基于预训练阶段积累的金融文本知识,组合出一个逻辑自洽的因子表达式。这背后的关键不是模型"懂金融",而是它"懂结构"——它知道什么样的变量组合在逻辑上能衡量一种市场力量。搞懂这条链路,你才能判断哪些因子是模型真正"想"出来的,哪些只是它在复述训练语料里的旧结论。
2. 从 LSTM 到 Transformer:自注意力到底改变了什么
2.1 传统 LSTM 的两个硬伤
在 Transformer 出现之前,量化研究员用 LSTM 处理序列数据时,长期受困于两个问题。第一,LSTM 对序列中每个词的权重是隐式且均匀衰减的,它无法显式地告诉模型"这个词比那个词重要 10 倍"。第二,长距离依赖会随着时间步拉长而信息丢失,一个 200 步之前的委托量突变,传到第 200 步时几乎被遗忘。这两个缺陷在金融场景里是致命的:高频数据里,开盘前 30 分钟的委托簿形态往往比收盘前 5 分钟更能预测次日收益,但 LSTM 记不住这种远距离的结构性差异。
2.2 自注意力的权重分配逻辑
Transformer 的解法是自注意力机制。它把输入序列的每个位置映射成 Query、Key、Value 三个向量,然后用 Query 和 Key 的点积计算任意两个位置之间的关联强度,再对 Value 加权求和。这意味着模型可以同时看到序列的所有位置,并且为每个位置动态计算一个权重。用金融语言说:模型自己学会了"哪个时间片的委托量变化对当前预测最重要"。
# 自注意力的核心计算(简化版,帮助理解权重分配) import numpy as np def scaled_dot_product_attention(Q, K, V): # Q, K, V 形状: (seq_len, d_k) d_k = Q.shape[-1] # 计算任意两个位置之间的关联分数 scores = np.dot(Q, K.T) / np.sqrt(d_k) # softmax 归一化为权重,突出重要位置 weights = np.exp(scores) / np.exp(scores).sum(axis=-1, keepdims=True) # 加权求和得到输出 output = np.dot(weights, V) return output, weights这段代码里,scores矩阵的每个元素代表位置 i 对位置 j 的关注程度,weights经过 softmax 后变成概率分布。关键参数是d_k,即每个注意力头的维度——维度越大,模型能区分的模式越细,但计算量也平方级增长。金融序列里,d_k通常设得比 NLP 任务小,因为 tick 数据的有效模式维度远低于自然语言。
2.3 参数规模与涌现现象
GPT-1 只有 1.17 亿参数,GPT-2 跳到 15 亿,GPT-3 达到 1750 亿。参数量的提升不是线性增益,而是触发了"涌现"——当参数超过某个阈值,模型突然获得了训练目标里没显式要求的能力,比如算术推理、代码生成、逻辑链推导。对因子挖掘而言,这意味着模型能在没有见过特定因子公式的情况下,基于对"波动率""流动性""买卖失衡"等概念的语义理解,组合出一个数学上合理的新表达式。这不是检索,是生成。
3. 提示工程:怎么把"闲聊模型"逼成"因子工厂"
3.1 角色、任务、指令的三段式约束
直接问 ChatGPT"给我一个选股因子",它会给你一个泛泛的动量或反转因子,毫无新意。有效的提示必须包含三个元素:角色(你是资深量化研究员)、任务(生成一个高频选股因子)、指令(限定数据范围为委托价和委托量,要求原创性)。角色设定不是玄学,它通过激活模型预训练语料中与"量化研究员"相关的文本分布,把生成空间收窄到专业领域。指令越具体,模型的输出越接近可执行的因子表达式。
3.2 思维链提示:让模型暴露推导过程
思维链提示的核心是要求模型"逐步思考"。在因子挖掘场景里,这比直接要答案有效得多。比如,当你问"如何改进 IC 指标",模型可能给出一个泛泛的答案;但如果你引导它先分析 IC 指标的缺陷(相同 IC 值下多头表现可能截然相反),再推导解决方案(分组加权计算 IC),它就能给出"给多头组更高权重"的具体建议。这个过程中,模型实际上是在做一种结构化的逻辑推演,而推演路径本身就可以被研究员复用为因子改进的思路。
3.3 提示的边界:模型会"生搬硬套"
需要警惕的是,ChatGPT 的训练语料里包含大量学术论文和研报,它给出的因子有时是已有文献的变形或组合。比如变异系数因子,模型在收盘价和成交量上分别计算变异系数再相乘,逻辑上衡量了波动性和流动性,但 IC 表现好而多头超额低,说明它没有真正理解 A 股做空限制对因子多头端的影响。提示工程能引导模型纠偏,但无法根除这种"知识拼接"的倾向。研究员的价值在于判断哪些输出是真正的新结构,哪些只是旧因子的排列组合。
4. 买卖盘力量因子:从自然语言到 tick 数据的落地链路
4.1 因子公式的数学结构
模型给出的买卖盘力量因子,核心逻辑是衡量买卖双方的力量失衡。买盘力量定义为买入委托量乘以买入价相对均价的偏离,卖盘力量类似但方向相反,最终差异因子做标准化处理:
# 买卖盘力量因子构建(基于 3 秒快照的前十档数据) def build_bs_force(bid_vol, bid_price, ask_vol, ask_price, avg_price): # 买盘力量:委托量越大、买价越高于均价,力量越强 b_force = bid_vol * (1 - bid_price / avg_price) # 卖盘力量:委托量越大、卖价越高于均价,卖压越强 s_force = ask_vol * (ask_price / avg_price - 1) # 标准化差异,保证横截面可比 bs_force = (b_force - s_force) / (b_force + s_force) return b_force, s_force, bs_force这里的关键参数是avg_price,通常取当日成交均价或前收盘价。标准化步骤(B-S)/(B+S)是必须的,否则不同股票的委托量量级差异会让因子失去横截面可比性。模型最初给出的版本没有这一步,是研究员根据逻辑合理性补上的——这说明 LLM 能给出结构,但细节修正仍需人工介入。
4.2 日频表现与衰减问题
在 2016 年至 2022 年 8 月的中证 1000 成分股上,日频调仓下 BSForce 因子的 IC 均值为 1.13%,T 统计量 7.00,多空夏普比率 4.51,多头年化超额 17.29%。但因子衰减极快,第二天基本失效。这不是因子本身的问题,而是高频数据的固有属性:委托簿信息反映的是极短期的供需失衡,隔夜后信息被市场消化。要用于实际策略,必须降频。
4.3 降频到周频的取舍
将买盘和卖盘力量因子分别降至周频后,多头年化超额分别为 9.77% 和 10.20%,但多空单调性一般。最终选择卖盘力量因子构建中证 1000 指数增强策略,在单边千分之二手续费下,年化超额 7.17%,信息比率 0.57。这个结果说明:高频因子的降频使用是一种"用信息衰减换交易可行性"的妥协。降频后因子仍有效,但强度下降,需要靠组合优化和风险控制来弥补。
5. 避坑与排查:用 LLM 做因子研究时最容易翻车的几个点
5.1 现象:模型给出的因子代码跑不通
原因:ChatGPT 生成的代码常引用不存在的库函数或假设了错误的数据结构,比如把 tick 数据的字段名写成通用名称而非实际接口名。解决:把代码当作伪代码,逐行核对数据接口,重点检查字段名、时间戳对齐和缺失值处理。
5.2 现象:因子 IC 很高但多头超额为负
原因:模型倾向于生成在全样本上统计显著的因子,但 A 股做空受限,空头端的收益无法获取。IC 衡量的是单调性,多头超额衡量的是实际可交易收益,两者可能背离。解决:在提示中明确加入"考虑 A 股做空限制,多头组表现优先"的约束,并在回测时单独看多头组合。
5.3 现象:同一提示多次运行得到不同因子
原因:LLM 的采样过程有随机性,temperature 参数越高,输出越发散。解决:把 temperature 调低(如 0.2),或对同一提示多次采样后取逻辑最自洽的版本,再手工修正。
5.4 现象:因子逻辑听起来合理但回测毫无效果
原因:模型可能把两个弱相关变量强行组合,逻辑叙述上自洽但数学上无预测力。解决:先做单变量 IC 测试,确认每个分量因子有独立预测力,再测试组合因子,避免"故事驱动"而非"数据驱动"。
5.5 现象:降频后因子完全失效
原因:高频因子的预测力集中在极短窗口,降频相当于对噪声做平滑,信号被稀释。解决:降频时不要简单取均值,尝试用衰减加权或只取特定时间片(如开盘后 30 分钟)的委托簿快照,保留信息浓度最高的部分。
6. 设计取舍:LLM 在量化研究里的边界与验证方法
把 ChatGPT 引入因子挖掘,本质上是在做一种"知识迁移"的实验。它的优势在于跨域组合能力——能把 NLP 里的注意力机制、金融里的委托簿理论、统计里的 IC 检验,用自然语言串成一条可执行的链路。但它的边界同样清晰:模型没有市场微观结构的先验,不知道 A 股 T+1 和做空限制对因子多头端的扭曲,也不理解交易成本对高频策略的吞噬效应。这些"常识"必须由研究员通过提示注入或后处理补全。
验证一个 LLM 生成的因子是否值得深挖,我一般会走三步。第一步,逻辑审查:因子的经济学解释是否成立,变量之间是否存在伪相关。第二步,单变量测试:每个分量因子的 IC、T 统计量、多空单调性是否独立显著。第三步,降频与成本压力测试:在目标调仓频率和实际手续费下,多头超额是否仍为正。这三步走完,才能判断一个因子是"模型编的故事"还是"数据里的信号"。
从这份资源里的完整测试链路看,买卖盘力量因子之所以能落地,不是因为模型多聪明,而是因为研究员在提示里限定了数据范围、在回测里修正了标准化步骤、在策略构建时选择了卖盘力量而非差异因子(因为后者衰减太快)。LLM 提供的是候选因子的"粗胚",打磨成可交易信号的过程,仍然依赖对市场机制的理解。
从那以后我每次用 LLM 生成因子,都强制走一遍"逻辑审查 → 单变量测试 → 成本压力测试"的流程,绝不跳过任何一步。希望帮到你。
本文还有配套的精品资源,点击获取