☰
ChatGPT挖高频因子:从提示词到中证1000指增的完整实战链路
2026/10/10 5:01:31 网站建设 项目流程

简介:这份PDF是国金证券《Alpha掘金系列之五》专题报告,聚焦如何利用ChatGPT进行高频选股因子挖掘,适合量化研究员、金融工程分析师以及对AI+投资策略感兴趣的进阶学习者。报告从ChatGPT的大语言模型原理、RLHF训练机制讲起,重点演示提示工程(Prompt Engineering)在因子生成中的具体用法,并给出周频变异系数因子与高频买卖盘力量因子的构建、测试及指数增强策略回测结果。文件共1个PDF,大小约2.16MB,便于下载后直接阅读全文。已有248人学习该资源。读者可从报告中获得完整的因子构造思路、策略参数与回测表现,包括多头年化超额收益、信息比率等关键数据,并了解ChatGPT在代码生成、研究提效方面的实际边界与注意事项。

1. 用ChatGPT挖高频因子:一份研报把流程走完的样本

2023年券商金工组扎堆试ChatGPT的时候,国金这份研报算是最早把全流程走完的样本之一。它最反直觉的结论是:变异系数因子IC均值能到-5.36%、T值-8.07,看起来质量极高,但多头组合年化超额只有-1.09%;而高频买卖盘力量差异因子日频多头超额能做到17.29%,降频到周频后两个力量因子的多头超额还有9.77%和10.20%。同一个模型,挖出来的因子表现天差地别,差别全在提示词和降频处理上。这份PDF从Prompt公式、思维链、因子构建到中证1000指增回测,给出了完整链路,适合正在做高频因子、或者想用LLM辅助研究提效的量化从业者直接复现。

2. 大模型挖因子的底层逻辑:Transformer注意力、RLHF与模型边界

2.1 Transformer改了什么:自注意力如何解决LSTM的权重与长距离问题

ChatGPT能用来挖因子,第一层前提是它真的“读得懂”量价关系。传统LSTM在做语言建模时有两大硬伤:一是对输入文本中不同词的重要性一视同仁,没法给关键信息更高权重;二是长距离依赖处理不好,序列一长,前文的信息就丢了。这两个问题放在因子挖掘场景里很致命——你让它看一段委托簿数据描述,它抓不住“大单压盘”和“小幅试探”的区别。

Transformer在2017年通过自注意力机制解决了这两个问题。Self-attention的核心操作是对输入序列的每个位置计算与其他所有位置的关联权重,权重高意味着信息被重点保留。GPT系列从GPT-1开始就用Transformer架构,参数从1.17亿一路涨到GPT-3的1750亿,再到GPT-4支持图片输入。参数规模带来的能力跃迁被称作涌现现象,对应研报里说的Scaling Law。注意一点:Scaling Law不是“参数越多一定越好”这种简单线性关系,而是模型在某个规模阈值之后,突然能完成之前完全做不了的推理任务。对量化研究的意义在于,小模型可能压根不理解“委托量”、“逐笔成交”这些词的业务含义,而千亿参数模型见过足够多的金融文本,能给出逻辑上自洽的因子公式。

2.2 RLHF三步训练:模型为什么更懂“人话”和“研究逻辑”

光有参数规模还不够,ChatGPT区别于GPT-3的核心是加了RLHF训练。研报把过程拆成三步:第一步,聘请40名标注员对指令集做标注,对模型进行监督微调;第二步,对同一指令采样多个输出结果,让标注员按好坏排序,用这个排序结果训练一个打分模型Reward Model;第三步,从指令集采样新指令,用打分模型作为奖励信号,进一步优化模型输出。

这个流程直接影响了因子挖掘的效果。没有RLHF之前,模型输出可能语法正确但逻辑不符合人类偏好——比如你问“给一个有原创性的选股因子”,它可能给你一个数学上成立但经济逻辑说不通的公式。加上打分模型之后,模型被训练成“更倾向于输出人类认为有用的答案”。对做因子的人来说,这意味着你可以用提示词去约束它,它会参考现有文献和研究的表达习惯来组织答案。研报里有个例子:模型给出的某个因子构建方式,“明显可以看出参考了一些现有文献和研究结果,在其已有知识的基础上进行一定变形、组合”。这就是RLHF带来的可调教性。

2.3 模型的边界:随机性和幻觉对因子挖掘的影响

RLHF和Scaling Law解决了“能不能理解”的问题,但没解决“每次都答对”的问题。研报在最前面和最后面的风险提示都强调了两点:一是ChatGPT具有随机性,部分情况下可能回答错误;二是模型被训练时接受了海量文本,处理实际问题时会存在“生搬硬套”的现象,需要不断提示纠正。

这两点在做因子挖掘时被放得很大。我见过有人拿同一个Prompt过两遍,第一遍得到价格动量因子,第二遍得到成交量加权因子——都看起来合理,但经济逻辑完全不同。更危险的是幻觉:模型可能编造一个“ARIMA(2,1,0)残差项因子”并附上公式,而这个公式在真实计算中根本跑不通。所以用ChatGPT挖因子,正确的姿势不是“问一个因子就信一个因子”,而是把它当研究助理:它负责给候选方案,你负责验证、修正、筛选。后面两章会把提示词的写法和因子的复现链路拆开讲。

3. 提示工程:把因子需求翻译成ChatGPT能执行的语言

3.1 Prompt三要素公式:角色、任务、指令怎么写才有效

研报给出的基本提示公式是三个部分:角色、任务、指令。格式是“作为一个【角色】,按照这些指示生成【任务】:【指令】”。这个结构看着简单,实际用起来差一步结果就差很远。

我一般这样写:

prompt = f""" 你是一位资深的量化研究员,拥有10年A股多因子选股研究经验。 请设计一个选股因子,要求: 1. 因子必须具有原创性,不能是常见的动量、反转、换手率类因子; 2. 必须有清晰的经济学逻辑支撑,说明该因子的定价逻辑; 3. 数据来源限定为逐笔委托数据中的委托价和委托量字段; 4. 因子需能在A股市场的日频数据上计算,计算复杂度控制在O(N)级别; 5. 请给出完整的因子计算公式,并说明每一步的计算口径。 """

角色部分别写“你是一个AI助手”,要写“资深量化研究员”,模型会切换到对应的知识分布去回答。任务部分“请设计一个选股因子”是核心指令,但光有这句话,模型大概率给你一个通用的“量价相关性因子”。真正的约束都藏在指令的1到5条里:限定原创性、限定数据范围、限定复杂度。

关键是约束的颗粒度。研报里的做法是分层递进:第一轮先问“给一个行之有效的选股因子”,得到的答案偏通用;第二轮在指令里加上“必须具有原创性、具有较强的逻辑支撑、有出色的业绩表现”,模型给出的因子质量明显提升;第三轮再限定“使用逐笔成交数据中的字段”,模型就给出了基于委买委卖量价的高频因子。我的习惯是第一轮不限制,看模型默认往哪个方向走,第二轮开始加约束勒紧,这样能观察模型对约束的反应是否和你的预期一致。

3.2 思维链提示:用“逐步思考”引导模型修正逻辑漏洞

标准Prompt适合生成单点答案,但如果你的问题是“IC指标有什么漏洞、怎么改进”,直接问,模型给的是教科书式回复,抓不到你想问的点。研报里做了一个很典型的实验:他们发现两个IC值接近的因子,实际分组收益差异很大——A因子IC只有0.22但多头表现好,B因子IC有0.25但多头组最差。直接问ChatGPT“怎么改进IC指标”,它答不到这个角度。

用思维链提示引导之后,模型才逐步意识到问题所在,最终给出方案:分组内分别计算IC值再做加权平均,给多头组更高权重。这个过程暴露了思维链的两层价值:第一,让模型把推理过程显式化,中间推导露出来,哪里逻辑不对你能看到、能纠正;第二,模型对A股做空限制认识不足时,你需要再补一句提示“A股多数股票做空受限”,它才给出多头高权重的方案。

思维链的写法没有固定公式,研报里的有效做法是:先描述一个具体场景(两个因子IC接近但分组收益不同),再让模型分析可能的原因,最后要求给出改进方案。关键是不直接问“怎么办”,而是把问题一步步拆开,让模型跟着你的框架走。实际使用时我会在Prompt末尾加一句“请一步步分析,并在最后给出可执行的公式”,这样既保留了推理过程,又落地到可计算的结果。

3.3 高频因子提示示例:约束数据范围与原创性

中低频因子跑完一遍之后,研报把场景切换到高频数据。提示词限定了两件事:数据范围限定为委托价和委托量,因子必须有原创性。这是高频因子挖掘里最容易被忽略的约束——如果不限定,模型会默认给你一个用收盘价算的因子,即使它本身写得再好,也解决不了“日频因子拥挤”的问题。

高频因子的Prompt要比中低频多一层限定,即明确数据口径。比如同样说“委托量”,你要说清楚是“每只股票每天3秒快照的前十档买卖委托量”,还是“逐笔成交的委托量”,这决定了因子能不能落地计算。研报里ChatGPT在限制下给出了买卖盘力量因子:用买一档到买十档的委托量和委托价,计算买盘力量和卖盘力量。模型甚至给出了降频方式——用计算均值的方法将因子从日频降为周频,这说明它理解了“高频因子要用于低频交易,需要先聚合”这个常识。但注意,模型只给了思路,真正的标准化处理、横截面可比性修正,都是研报作者手工完成的。

4. 因子复现链路:从变异系数因子到买卖盘力量因子的完整测试

4.1 中低频变异系数因子:5日滚动构建与IC测试结果

研报第一阶段让ChatGPT基于日频量价数据给因子,模型给出了变异系数类因子:价格变异系数LI和成交量变异系数VLI,以及两者的乘积、比值变体。公式定义很直接:

import numpy as np import pandas as pd def calc_cv_factors(price: pd.Series, volume: pd.Series, window: int = 5): """ 计算变异系数类因子 price: 日频收盘价序列 volume: 日频成交量序列 window: 滚动窗口,研报取5 """ # 滚动标准差 / 滚动均值 = 变异系数 li = price.rolling(window).std() / price.rolling(window).mean() vli = volume.rolling(window).std() / volume.rolling(window).mean() # 乘积形式:衡量价格波动与成交量波动的共振 li_x_vli = li * vli # 比值形式:衡量价格波动相对于成交量波动的偏离 li2_vli = li / vli.replace(0, np.nan) # 避免除零 return pd.DataFrame({ "LI": li, "VLI": vli, "LIxVLI": li_x_vli, "LI2VLI": li2_vli })

注意replace(0, np.nan)这一步,实际数据里成交量滚动标准差可能为0(长期停牌或者流动性枯竭),直接除会得到inf,因子值污染横截面排序。研报测试区间是2016年到2022年8月,中证1000指数成份股,周度调仓,每周初开盘价买入、周末收盘价卖出。回测结果分两层看:IC层面非常漂亮,四个因子的IC绝对值在2.79%到5.36%之间,T值全部小于-4,风险调整后IC在-0.25到-0.58之间,说明“低波动异象”在这段时间的中证1000里显著存在。

但多空组合和分组单调性层面拉胯了。LI因子的多头组合年化超额只有-1.09%,LI2VLI只有0.74%,最好的VLI也只有2.75%。这就是典型的“IC好看但做不出策略”的因子——IC反映的是整体秩相关,但可能主要由空头端贡献,多头端区分度不够。后面避坑章节会专门展开这个现象。

4.2 高频买卖盘力量因子:3秒快照与前十档委托数据的标准化处理

高频因子这块,研报用A股tick数据做了复现。数据规格是每只股票每天按3秒快照取快照,记录前十档的买入委托价、买入委托量、卖出委托价、卖出委托量。先对每只股票每天的每个时刻计算,再按交易日取均值,得到日频的买卖盘力量因子。

核心公式是这三个:

def calc_order_book_force(bid_vol, bid_price, ask_vol, ask_price, ref_price): """ 计算买卖盘力量因子 bid_vol: 十档买入委托量之和(日均值) bid_price: 十档买入委托价加权均值 ask_vol: 十档卖出委托量之和(日均值) ask_price: 十档卖出委托价加权均值 ref_price: 参考价,研报中为当日价格,常见做法用VWAP """ # 买盘力量:买量越大、买价越接近成交价,因子值越大 b_force = bid_vol * (1.0 - bid_price / ref_price) # 卖盘力量:卖量越大、卖价越高于成交价,因子值越大 s_force = ask_vol * (ask_price / ref_price - 1.0) # 买卖盘力量差异:标准化到[-1, 1],保证横截面可比 bs_force = (b_force - s_force) / (b_force + s_force) return b_force, s_force, bs_force

研报特别强调了一个修正点:买卖盘力量差异因子需要标准化以做到横截面可比。如果不加分母的b_force + s_force,BSForce会受股票绝对委托量规模影响——大市值股票天生因子值大,小市值股票因子值小,横截面上直接变成市值代理变量。加上分母归一化之后,BSForce的含义变成“买卖力量的不平衡比例”,这才是真正的选股信号。

回测结果显示:日频调仓下,BSForce的IC均值1.13%、T值7.00,多头组合年化超额17.29%,多空夏普4.51,最大回撤只有4.88%。BForce的日频多头超额也有11.17%,但IC均值只有-0.24%,T值-0.61,显著性不足。SForce的IC均值-1.02%、T值-2.87,多头超额6.57%。从纯收益角度BSForce最强,但这个因子后面有个致命问题:衰减过快。

4.3 日频到周频的降频逻辑:为什么BSForce被弃用、BForce和SForce被保留

日频调仓收益看着诱人,但实际交易里成本会吃掉利润。研报做了降频测试:把因子从日频降到周频,每周第一个交易日开盘价成交。结果BSForce几乎失效——原因是这个因子在“第二天基本已经失效”,日频的收益主要集中在前1个交易日,降频到周频等于信号完全错过。

BForce和SForce虽然日频表现不如BSForce,但衰减慢得多,降频后保住了大部分预测力,多头年化超额分别达到9.77%和10.20%。这个选择很有代表性:日频最强因子未必是最优选择,因为交易频率直接决定了成本敏感度。研报最终选了卖盘力量因子SForce构建中证1000指数增强策略,理由是“相对表现较好”且降频后依然稳定。

降频处理的代码习惯是:

def daily_to_weekly(factor_daily: pd.Series, price_open: pd.Series): """ 日频因子转周频 常见做法:取每周最后一个交易日的因子值作为当周信号,下周初开盘买入 研报中ChatGPT给出的方案是用均值降频,实际回测多用周内均值或周初值 """ weekly_factor = factor_daily.resample("W-FRI").mean() # 周内日均值 # 对齐交易周:回测时用下一周周一开盘价成交 return weekly_factor

研报提到ChatGPT对降频给出的建议是“使用计算均值的方法”,但实盘应用中均值降频和末日值降频差异很大:均值更平滑,末日值对最新信息更敏感。策略上需要先看因子IC的衰减曲线再决定用哪种。SForce在这个环节最终胜出,不是因为收益最高,而是因为“日频到周频的信息保留率”最高——这在成本约束下才是真正可用的因子。

5. 避坑清单:从模型随机性到因子衰减的实战排查记录

5.1 IC很高但多空净值走不出趋势:单调性排查

现象:变异系数类因子IC均值-5.36%、T值-8.07,多空组合净值却走不出稳定上行,LI因子多头年化超额-1.09%。

原因:IC反映的是因子值与未来收益的秩相关,这个相关性可能主要由空头端贡献。多空组合里空头端持续赚钱,多头端反而跑不赢基准,净值曲线虚高但不可交易——因为A股多数股票做空受限,空头收益很难落地。

解决:看因子十分位分组收益单调性,而不是只看IC。如果只有空头端单调而多头端混乱,这个因子只能作为风险因子过滤,不能作为alpha因子。研报后续策略构建里放弃变异系数因子,改用买卖盘力量因子,走的就是这个排查逻辑。

5.2 高频因子日频惊艳、周频失效:IC衰减检查

现象:BSForce日频多头超额17.29%、多空夏普4.51,降频到周频后几乎完全失效。

原因:因子衰减速度快,预测力集中在未来1个交易日,日频调仓能捕捉,周频调仓时信号已经消失。

解决:任何高频因子做降频决策前,先拉IC衰减曲线——分别计算T+1、T+2、T+5的IC值。T+1 IC远大于T+5的,说明信号偏高频;只有T+1高、T+2断崖式下跌的,直接放弃周频。研报最终选择BForce和SForce,正是因为它们虽然日频IC不如BSForce明显,但衰减更慢。我自己的筛选标准是:T+5 IC至少保留T+1 IC的30%,才值得降频。

5.3 ChatGPT代码输出有幻觉:字段名与边界条件的核查

现象:模型给出的因子测试代码跑出来报错,错误出在数据字段名根本不存在。

原因:ChatGPT对A股高频数据的认识来自文本语料,不是真实交易数据。研报里明确指出“模型所给代码需要注意代码细节,确保其符合实际需求”,代码框架能用,但字段名、列名、时间索引的格式都需要人工核对。

解决:把模型代码当脚手架,不当成品。常规做法是让模型先输出功能框架,再手工替换数据接口。比如模型写df["bid_volume"],实际数据里可能是df["bid_vol_l1"]到df["bid_vol_l10"]十列,需要写个聚合函数先用真实数据字段替换,再跑通逻辑。代码里凡是涉及数据读取、列名索引、时间对齐的部分,全部抽查一遍。

5.4 同一提示词两次结果不同:随机性控制

现象:同一个因子挖掘Prompt跑两遍,一次给出价量相关性因子,一次给出委托不平衡因子。

原因:模型输出带采样随机性,只要temperature没设为0,同样的输入可能得到不同输出。研报把它归入风险提示第一条“ChatGPT模型具有一定的随机性”。

解决:第一,正式研究环境把temperature设为0,降低发散;第二,即便用低temperature,也有随机性,关键因素子一定多跑几轮取交集;第三,用代码或脚本来做,需要复现时记录完整Prompt和模型参数。我习惯每次生成因子后,把Prompt、回答全文、日期一起存档,后续发现因子逻辑有问题能回溯。

5.5 模型“生搬硬套”:逻辑看似合理实则经不起推敲

现象:ChatGPT给出的因子公式在数学上成立,但经济逻辑有漏洞。研报里的典型例子是IC指标改进:模型在思维链引导下能发现问题,但对A股做空限制认识不足,先是给出了多空对称的加权方案,需要再提示才调整为给多头更高权重。

原因:模型训练语料以全球市场为主,美股做空机制和A股差异大。模型会在已有知识基础上“生搬硬套”。

解决:因子的经济逻辑必须事后人工验证。拿到模型给出的因子后,三步走:第一步,看公式是否在真实数据上可计算,字段是否存在;第二步,做分组收益测试,看多头端是否贡献收益;第三步,回读因子定义,看它是不是已有已知因子(动量、反转、波动率、流动性)的变形。如果三步都通过,这个因子才值得进候选池。

6. 把卖盘力量因子接到中证1000指增策略:参数设定与验证技巧

6.1 策略回测的关键参数表

研报最终落地的场景是中证1000指数增强。回测参数整理如下:

参数项设定值说明
测试区间2016.1 - 2022.8与因子测试区间一致
股票池中证1000指数成份股成分股定期调整
调仓频率周频每周第一个交易日开盘价成交
因子卖盘力量因子 SForce降频后信息保留率最高
交易成本单边千分之二已包含冲击成本估计
年化超额收益率7.17%扣成本后
信息比率0.57超额收益/超额波动

这里最容易被忽略的是交易成本假设。单边千分之二是机构投资者的常见费率假设,但如果你用的是万三费率做回测,结果会虚高不少。研报里日频BSForce表现最强,但加上单边千二成本后周频策略收益率可能被吃掉大半。做参数敏感性分析时,我会把手续费从万五到千三各跑一遍,观察策略的超额收益拐点,这样才能知道策略的真实成本容忍度。

6.2 验证技巧:先看因子衰减再定调仓频率

最后的落地顺序应该反过来:先测IC衰减曲线确定调仓频率上限,再测因子在不同频率下的多头超额,最后才跑完整指增回测。研报的路径正是如此:日频发现BSForce衰减快,弃用;BForce和SForce降频后保住收益,再用SForce进策略。从那以后我每次接到一个ChatGPT给出的高频因子,都强制走一遍“日频IC → T+5 IC残存比例 → 周频多头超额”三步检查,再决定是否上策略。这套流程看着多跑几步运算,但能挡住大量“因子好看、交易做不出来”的时间黑洞,希望帮到你。

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询