尧图精选

ChatGPT 辅助高频选股因子挖掘:从提示词到因子库的工程化流程

🕒 发布时间:2026/10/2 4:44:58 📁 来源:尧图网络
简介这份国金证券金融工程专题报告聚焦ChatGPT在量化选股中的实战应用面向具备一定Python与因子研究基础的量化从业者及金融工程方向研究者。报告系统梳理了ChatGPT的模型演进、Scaling Law与RLHF训练机制并重点讲解提示工程的角色、任务、指令三要素及思维链提示技巧随后以因子挖掘为测试场景展示价量变异系数因子与高频买卖盘力量因子的构建与回测结果其中卖盘力量因子构建的中证1000指数增强策略在考虑交易成本后年化超额收益达7.17%信息比率0.57。资源为1个PDF文件压缩包约2.16MB内容含完整目录、图表与风险提示便于按章节检索研读。目前已有247人学习下载适合希望将大语言模型引入因子研究、了解提示工程落地路径并借鉴策略回测框架的读者参考。1. 用 ChatGPT 挖高频选股因子一份研报标题背后的真实工作流很多人第一次看到“如何利用 ChatGPT 挖掘高频选股因子”这个标题第一反应是让模型直接吐出一堆能赚钱的因子公式。真上手就会发现这条路走不通——模型不知道你手里有什么数据、字段怎么命名、交易成本多少它给的东西大概率是没法回测的空中楼阁。这个标题真正有价值的地方是把 ChatGPT 当成一个“因子研究副驾驶”帮你把模糊的经济学直觉翻译成可计算的表达式帮你把重复的因子构造、IC 检验、分组回测代码写出来帮你排查回测里那些说不清道不明的玄学问题。它适合已经有一套分钟级或日频行情数据、会写 Python、但因子研究效率卡在“想法多、落地慢”这一步的量化从业者。下面这套流程是我自己反复跑过、也踩过坑之后沉淀下来的做法不依赖任何特定券商研报的原文只讲能复现的路径。2. 先想清楚ChatGPT 在因子挖掘里到底干什么活2.1 把“盘感”翻译成可回测的因子表达式量化研究里最贵的一步不是写代码是把一个模糊的市场观察变成精确的数学定义。比如你觉得“尾盘突然放量拉升的票第二天容易高开低走”这句话人听得懂但 pandas 听不懂。ChatGPT 在这里的作用是当翻译器你给它一段自然语言描述让它输出字段级的计算逻辑。关键是提示词里必须把数据 schema 交代清楚否则它会自己编字段名。# 把数据字段说明和因子直觉一起喂给模型让它输出可执行逻辑 prompt 我有分钟级行情数据字段如下 - date: 交易日 - time: HH:MM 格式的分钟时间戳 - open/high/low/close: 该分钟价格 - volume: 该分钟成交量 - amount: 该分钟成交额 我想构造一个因子描述“尾盘最后30分钟成交量占全天比例相对过去5日均值的变化”。 请输出 pandas 计算步骤不要写完整函数只写核心逻辑和中间列命名。 这段提示词的核心不是“问得好”而是把字段名、时间粒度、想要的输出形态全部锁死。模型返回的逻辑你还要自己核对一遍它可能会把time 14:30写成字符串比较在部分数据源里时间字段是datetime.time类型直接比字符串会翻车。参数上尾盘窗口我一般用 30 分钟但如果你做的是高频比如 5 分钟 bar这个窗口要相应缩短到 6 根 bar否则因子和隔夜收益的相关性会被稀释。2.2 因子挖掘里 ChatGPT 的能力边界它擅长的是模式化的代码生成、逻辑拆解、报错解释不擅长的是判断一个因子在当下市场是否还有效、帮你规避未来函数、替你决定用什么中性化方式。我见过最典型的翻车是让模型直接写“计算过去 20 日收益排名”它给了一个rolling(20).apply(rank)但没处理停牌和涨跌停回测里这些票的排名是失真的。所以我的习惯是模型出草稿我补数据清洗和交易约束。这一步没有捷径谁跳过谁吃亏。3. 从提示词到因子库一套可复现的构造流程3.1 提示词模板把因子假设拆成四段式直接问“帮我挖一个高频因子”得到的答案基本是废话。有效的提示词要包含四段数据描述、经济逻辑、计算约束、输出格式。下面这个模板我用了大半年改字段就能复用。factor_prompt_template [数据描述] 表名: minute_bar 字段: date(str), time(str), open(float), high(float), low(float), close(float), volume(int), amount(float), pre_close(float) 频率: 1分钟 股票池: 全A已剔除ST和上市不足60日的票 [经济逻辑] {your_hypothesis} [计算约束] 1. 只用当日及之前的数据禁止引入未来信息 2. 对停牌分钟volume0且amount0做前值填充但标记填充位置 3. 输出因子值需在截面做去极值MAD 5倍和标准化 [输出格式] 先写计算步骤的文字说明再写 pandas 核心代码最后列出需要我手动确认的假设。 your_hypothesis是唯一需要你动脑的地方。比如“开盘后 15 分钟成交额占全天比例越高当日收益越差”这就是一个可检验的假设。模型会把它拆成amount_15min / amount_day然后提醒你分母为 0 的情况。参数上MAD 去极值的倍数我一般用 5但在小盘股占比高的池子里会放宽到 8否则因子分布被削得太狠IC 反而下降。3.2 用 Python 把模型输出接进因子计算管道模型给的代码不能直接扔进生产要包一层校验。下面是我常用的因子计算骨架把模型生成的逻辑塞进compute_factor里。import pandas as pd import numpy as np def compute_factor(df: pd.DataFrame) - pd.Series: df: 单只股票单日的分钟数据按 time 升序 返回: 该股票该日的因子值标量 # 模型生成的核心逻辑尾盘30分钟成交额占比 tail_mask df[time] 14:30 tail_amount df.loc[tail_mask, amount].sum() day_amount df[amount].sum() if day_amount 0: return np.nan ratio tail_amount / day_amount # 手动补的约束如果尾盘有超过5分钟停牌因子置NaN tail_suspend (df.loc[tail_mask, volume] 0).sum() if tail_suspend 5: return np.nan return ratio # 按股票、日期分组滚动计算 factor_df minute_df.groupby([date, stock]).apply(compute_factor) factor_df factor_df.unstack(stock) # 转成 date x stock 的因子矩阵这里的关键参数是tail_suspend 5这个阈值。我试过 3 分钟和 10 分钟3 分钟太严很多正常票被误杀10 分钟太松停牌票的因子值明显异常。5 分钟是沪深两市连续竞价阶段比较稳的经验值。另外groupby.apply在数据量大时很慢实盘研究里我会改成先算中间列再groupby.agg速度差三到五倍。3.3 因子有效性检验IC、分组和换手率一起看因子算出来只是第一步能不能用要看三个指标IC 均值、IC_IR、分组单调性。ChatGPT 可以帮你写检验代码但阈值判断得自己来。def factor_evaluation(factor, forward_return): factor: date x stock 因子矩阵 forward_return: date x stock 次日收益矩阵 ic factor.corrwith(forward_return, axis1) ic_mean ic.mean() ic_ir ic_mean / ic.std() # 分5组看单调性 group factor.apply(lambda x: pd.qcut(x, 5, labelsFalse), axis1) group_ret {} for g in range(5): mask (group g) group_ret[g] forward_return[mask].mean().mean() return ic_mean, ic_ir, group_retIC 均值绝对值超过 0.03、IC_IR 超过 0.3这个因子才值得进因子库。分组收益要看第 1 组和第 5 组的差是否单调如果中间组跳来跳去说明因子和收益的关系是非线性的直接线性加权会出问题。换手率我一般要求日频因子双边换手低于 30%高频因子放宽到 50%再高交易成本就吃掉了。4. 避坑与排查那些让回测和实盘对不上的细节4.1 未来函数模型最爱犯的错现象回测 IC 高达 0.15实盘一上就亏。原因模型在计算“当日收益排名”时用了close的当日值去预测当日收益或者用了shift(-1)但没对齐时间戳。解决所有因子计算里forward_return必须用close.shift(-1) / close - 1且因子值只能用到t时刻及之前的数据。我习惯在因子函数入口加一行断言assert df[time].max() 15:00防止有人把盘后数据混进来。4.2 停牌和涨跌停的填充方式现象因子在部分股票上出现极端值分组收益被拉偏。原因停牌期间分钟数据缺失ffill填充后成交量变成 0但价格被填成停牌前价格导致“尾盘成交占比”这类因子算出 0 或 NaN。解决停牌分钟单独标记因子计算时把停牌超过阈值的样本直接置 NaN而不是填充。涨跌停票同理一字板当天的分钟数据几乎没有成交因子值没有意义。4.3 提示词里的字段名和实际数据不一致现象模型生成的代码跑起来报KeyError。原因你在提示词里写volume实际数据里叫vol你写time是字符串实际是datetime.time对象。解决每次新数据集先跑一遍df.dtypes和df.head()把真实字段名和类型复制进提示词。我一般会维护一个schema.md每次问模型前先贴进去省得反复改代码。4.4 因子标准化方式选错现象IC 在某个时间段突然失效。原因用了全样本标准化引入了未来信息。解决截面标准化必须逐日做factor.groupby(date).apply(lambda x: (x - x.mean()) / x.std())不能对整个矩阵一次性标准化。另外去极值也要逐日做MAD 的 median 和 MAD 值都只能用当日截面数据。4.5 模型给的代码没有处理除零和空值现象回测中途报ZeroDivisionError或因子矩阵出现大量inf。原因模型默认分母不为零但真实数据里amount为 0 的分钟很常见。解决所有除法外面包一层np.where(denominator 0, numerator / denominator, np.nan)然后在因子入库前统一做replace([np.inf, -np.inf], np.nan)。这一步我写成装饰器所有因子函数自动套用。5. 让因子研究提速的一个具体技巧批量提示词加自动校验单次问模型效率太低我一般把 10 到 20 个因子假设写成一个列表批量生成代码然后用一套自动校验脚本过滤掉不合格的。校验脚本主要查三件事有没有用到未来数据、有没有除零风险、因子值分布是否合理。def auto_check(factor_func, sample_df): 自动校验因子函数是否可用 # 1. 未来数据检查把最后一行数据删掉因子值不应变化 f1 factor_func(sample_df) f2 factor_func(sample_df.iloc[:-1]) if not np.isclose(f1, f2, equal_nanTrue): return FAIL: 可能引入未来数据 # 2. 除零检查构造 amount 全为 0 的极端样本 zero_df sample_df.copy() zero_df[amount] 0 try: factor_func(zero_df) except ZeroDivisionError: return FAIL: 未处理除零 # 3. 分布检查因子值不应全为常数 factor_series sample_df.groupby(date).apply(factor_func) if factor_series.nunique() 10: return FAIL: 因子值几乎无变化 return PASS这个脚本帮我省了大量人工检查时间。批量生成的 20 个因子里通常有 6 到 8 个会在第一步就被拦下来——模型很喜欢用close的当日值去算“当日收益相关”的东西。第二步拦掉的大多是比率类因子。第三步拦掉的是那些逻辑上说得通、但实际数据里几乎不变的因子比如“开盘价等于昨日收盘价的比例”在 A 股这个比例很低因子没有区分度。参数上nunique() 10这个阈值我按样本天数调整样本 100 天以下用 5100 天以上用 10。另外这个校验脚本只做初筛通过了的因子还要跑完整的 IC 和分组检验。我自己的习惯是每周批量跑一次把通过的因子存进因子库标注生成日期和提示词版本方便后面回溯哪些提示词风格产出率高。这套流程跑顺之后从想法到可回测因子的时间从原来的半天压缩到一两个小时剩下的时间可以花在更值钱的事情上——判断哪些因子值得留、哪些该淘汰。希望帮到你。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联 返回资讯列表 →