本文来源于量化小论坛策略分享会板块精华帖作者为豆汁爸爸发布于2025年2月23日。

以下为精华帖正文:

Quantitative Finance 这个期刊不错,里面很多论文都可以免费下载,时常出现一些有意思能启发人的论文。

今天讲的这篇是使用GPT-4生成因子的论文。文章作者号称生成的某些因子能达到66%年化4.49sharp

01

背景

自动因子挖掘这事不新鲜,无论是用GA,还是用RL已经有了很多相关论文。但这些方法的问题是完全靠数据驱动,在经济方面缺少令人信服的解释,另外样本外数据的稳定性也是最关心的问题。

GPT模型的优势

与传统的数据挖掘方法不同,GPT(如GPT-4)基于知识推理,能够生成具有经济解释的因子,而无需依赖大量数据输入。这为因子生成提供了一种新的思路。与传统的数据挖掘方法相比,GPT生成的因子具有更强的经济解释能力,能够为投资策略提供有价值的见解。

02

研究方法

GPT-4模型与自主因子生成方法相结合,通过提供数据结构信息(如开盘价、收盘价、交易量等),让GPT生成新的因子,并直接输出计算代码。这些代码可以直接在Python中运行,生成投资策略。

因子生成过程

首先将ChatGPT定位为金融专家目标是获取可观收益(意味着提示词要含有角色)。为了节约GPT的计算开销,只告知它数据存储结构,不涉及具体数据内容。

GPT在进行描述时会故意描述的很模糊避免输出错误信息,但在描述因子表达式时这种描述是不行的。所以要用推理模式。

避免让GPT直接参与因子值计算,只让它推导因子计算式。

prompt样例

图片

数据

GPT4训练数据截止到2021.9,因子的测试数据是2021.10-2022.12. 股票市场为美股。

03

实验结果

单因子组合表现

作者对GPT生成的35个因子进行了实证测试,测试期为2021年10月至2022年12月,股票计算因子值以后前50%做多,后50%做空(相当于把市场所有股票都参与交易额,这得有多少资金量!)。下图选出来的因子有大量不能用的亏钱因子,不过也有赚钱的因子,比如因子4,13,28,35都非常不错。

结果显示,大多数因子在多-空(long-short)组合中表现良好,其中因子28的年化回报率达到66.16%,夏普比率(Sharpe Ratio)达到4.49。在多(long-only)策略中,因子28的年化回报率为53.899%,夏普比率为1.9339

图片

图片

多因子组合表现

作者还测试了将35个因子组合在一起的多因子投资策略。

一共测了两种组合方法:

静态组合:所有因子值min-max标准化,根据上小节单因子测试结果确定因子正负号,反作用的因子加符号,把这些因子值求算数平均数。

动态组合:所有因子值min-max标准化,每天根据每个因子的历史累计回报动态调整因子的权重,也像上面静态因子那样加正负号,然后求加权平均数。

在静态多-空策略中,组合的年化回报率为39.728%,夏普比率为2.4854,最大回撤(Max Drawdown)为7.1795%。在静态多策略中,组合的年化回报率为45.161%,夏普比率为1.6295,最大回撤为25.439%

在动态多权重的多-空策略中,组合的年化回报率为37%,夏普比率为3.09,最大回撤(Max Drawdown)为6.11%。在动态多权重多策略中,组合的年化回报率为34%,夏普比率为1.3,最大回撤为22.944%

在动态多空权重的多-空策略中,组合的年化回报率为30.0%,夏普比率为2.4478,最大回撤(Max Drawdown)为12%。在动态多空权重多策略中,组合的年化回报率为30.2%,夏普比率为1.264,最大回撤为29.177%

图片

04

写提示词的原则

生成因子提示词的9条原则

一、理解数据,向GPT明确数据结构和类型(如股票的开盘价、收盘价、交易量等),以及生成因子的需求(如投资目标、交易频率等)。

二、让GPT参考已知的金融技术指标,如移动平均线(Moving Averages)、布林带(Bollinger Bands)、MACD等。

三、将不同的技术指标或基础因子进行组合,创建复杂的因子。例如,将动量(Momentum)和波动率(Volatility)结合。

四、生成的因子基于特定的金融理论或投资哲学,例如价值投资、成长投资或市场效率理论。

五、对价格、成交量或其他数据应用数学或统计变换,如标准化、归一化、对数变换等。

六、对数据进行分组(如按股票、按时间)并应用滚动计算(如滚动平均、滚动标准差)。

七、生成因子后,通过回测、样本外测试和统计分析来评估因子的有效性,并进行必要的调整。

八、利用特定行业的知识、市场条件或公司特性来启发新的因子。

九、生成的因子需要能够从可用数据中计算出来,对噪声具有鲁棒性,并且适用于实际交易场景。

具有经济数学的可解释性的3条原则

一、GPT利用基础数学和统计属性来分析不同指标如何有意义地组合。例如,将一个衡量趋势的指标与一个衡量波动率的指标结合,可能会提供关于趋势市场动量的见解。

二、基于历史数据和行业实践,GPT可以对某些指标在不同市场条件下的行为做出合理猜测。

三、考虑一些通用性方法,GPT可以应用标准的数学和统计技术,如归一化、加权和统计相关性。

输入进GPT用于组合的基本指标在论文的table7。

图片

与GPT的对话过程

按照上面的原则跟GPT对话是这样:

给GPT输入数据,把上面已有的指标输入进去,让GPT生成一个因子的代码。

把代码放到自己本地的回测框架中跑一下得到结果。

根据结果反馈给GPT,例如这个因子信号太频繁,降低信号灵敏度等,让它生成下个因子。

05

因子的经济解释

例如,某些因子结合了变化率(ROC)、累积/分配线(ADL)和商品通道指数(CCI),能够反映价格变化的速度、资金流向和价格偏离历史平均水平的程度。把计算公式输入给GPT可以直接让它生成解释。(这个功能好像对行业内工作的人更有用,毕竟要和boss解释因子为啥好使)。

06

论文复现

因为我没有GPT账号,先用Deepseek玩一个玩具版本的因子生成。日后有钱了本地部署再微调用deepseek也方便。

图片

经过推理后deepseek得到的结果如下:

图片

设计原理

波动率调整系数:使用高频波动率对后续指标进行动态缩放,在低波动时期放大信号,高波动时期抑制噪声。

量价收敛:通过成交量动量(VMO)与价格动量的差值识别虚假突破。

自适应布林带:突破强度根据波动率动态调整带宽,防止在波动高峰期的假突破。

MACD动量分层:对MACD进行非线性变换,在趋势延续时增强因子强度,反转时快速衰减。

复合运算:采用乘积而非简单加权平均,要求三个维度同时发出正向信号。

动态标准化:每日横截面标准化确保因子中性化。

回测建议及历史表现

持仓周期:5-10日(因子半衰期经测试约7日)

组合构建:多空对冲或行业中性分层

风控机制:当市场整体波动率超过历史90%分位数时自动降低仓位

该因子在历史回测中(使用SP500成分股2018-2022数据)表现:

年化夏普比率:2.1-2.3

最大回撤:-12.7%(2020年3月)

月度胜率:68%

换手率:约6倍/月

我这次测试为了方便,使用了worldquant的快速表达式测试功能:

图片

测试结果,(黄线是测试集数据)这个因子有一定的信号sharp0.35还是不太令人满意。持股换手率高达52%,说明开仓信号较为频繁。2022年测试数据的表现也比较差。

图片

接下来根据测试结果反馈给deepseek,让它尝试改进

图片

deepseek提出的改进

一、市场状态自适应机制

使用ADX指标动态识别趋势市(ADX>25)和震荡市

不同市场状态下切换参数:

趋势市:使用动量逻辑(20日动量)+标准MACD参数

震荡市:使用反转逻辑(10日反转)+快速MACD参数

二、波动率计算优化

引入成交量加权的HL波动率:(high/low -1)*log(volume)

波动率调整系数范围扩大到[0.3,3.0],增强极端行情适应性。

三、回撤控制模块

当市场20日均收益为负时,通过指数衰减因子强度:exp(-3 * market_ret<0)

在2020年3月和2022年下行阶段自动降低风险暴露。

四、换手率控制技术

5日信号平滑处理:adj_factor.rolling(5).mean()

交易成本惩罚项:1/(1+0.05*|Δfactor|),抑制小幅波动产生的交易。

五、非对称MACD增强

趋势市中:MACD在信号线上方时放大趋势强度(比率形式)

震荡市中:MACD在信号线下方时生成反转信号(负向绝对值)

上述改进如果全都加进去因子就太复杂了。我只选择了2,并且把计算所有均值是时间窗口加大,把因子值做了5日平滑。结果如下

图片

Sharpe1.14 Turnover22.96% Fitness1.31 Returns30.10% Drawdown31.15% 各项指标均有显著改善。不足是2018-2019不赚钱了。

为了进一步改善,把因子作为y市值作为x进行线性回归,取残差作为新因子值,消除了市值影响。效果如下:

图片

Logo

更多推荐