☰
量化策略实战:特征工程与大模型辅助决策全流程
2026/10/21 17:47:58 网站建设 项目流程

1. 从原始数据到有效因子:特征工程的核心逻辑

1.1 为什么特征工程决定了策略的天花板

很多人做量化策略,第一反应是去找一个“神级模型”,觉得只要模型够强,数据随便喂进去就能赚钱。我刚开始也这么想,后来踩了无数坑才明白:在A股这种高噪声、低信噪比的市场里,特征工程的质量直接决定了策略收益的上限,模型只是逼近这个上限的工具。

举个直观的例子。你手里有某只股票过去60个交易日的收盘价,如果直接把60个价格数字扔给模型,模型看到的是一串高度相关的数值,既学不到趋势,也学不到动量。但如果你把这60个价格转换成“过去20日收益率”“当前价格相对20日均线的偏离度”“成交量加权后的价格重心”,模型立刻就能捕捉到不同维度的市场信息。这就是特征工程的价值——把原始数据翻译成模型能理解的“市场语言”。

A股市场有几个非常特殊的性质,直接影响了特征工程的设计思路。第一,涨跌停制度导致价格在极端日会出现截断,如果直接使用收益率,涨跌停日的信号会被扭曲。第二,T+1交易制度意味着你当天买入的股票当天不能卖出,特征设计时必须考虑持仓周期的约束。第三,散户占比高导致市场情绪波动剧烈,换手率、振幅这类情绪指标往往比基本面指标更有效。这些特性决定了我们不能照搬海外市场的特征体系,必须做本土化改造。

1.2 特征分类框架:从五个维度构建因子池

在实际操作中,我习惯把特征分成五大类,每类下面再细分具体因子。这个框架的好处是逻辑清晰,不容易遗漏重要维度,也方便后续做因子间的相关性分析。

第一类是价格动量类特征。这是最基础也最有效的一类。具体包括:过去N日的累计收益率(N取5、10、20、60)、过去N日的最高价与当前价的距离、过去N日最低价与当前价的距离、价格突破N日高点的标志等。动量因子的核心逻辑是“强者恒强”,但A股动量效应比海外弱很多,所以通常需要配合反转因子一起使用。我一般会同时计算短期(5日)和中期(20日)动量,让模型自己去学习不同周期的权重。

第二类是波动率类特征。包括过去N日收益率的标准差、过去N日的真实波幅均值、当日振幅与过去N日平均振幅的比值等。波动率因子在A股特别重要,因为高波动往往意味着高风险,但同时也可能意味着高收益机会。关键是要区分“好的波动”和“坏的波动”——上涨过程中的波动和下跌过程中的波动,对未来的预测意义完全不同。

第三类是成交量与流动性类特征。包括换手率、量比、成交额的对数、过去N日成交量标准差等。成交量是价格的“燃料”,没有成交量配合的价格变动往往不可持续。我特别关注“量价背离”信号,比如价格创新高但成交量萎缩,这通常是一个警示信号。

第四类是基本面类特征。包括市盈率、市净率、净资产收益率、营收增速、净利润增速等。这类因子的更新频率低(通常按季度),但稳定性好。在A股,小市值因子和低估值因子长期有效,但近几年随着市场风格变化,单纯依赖市值因子的策略回撤明显加大,需要结合质量因子一起使用。

第五类是市场情绪类特征。包括涨停家数、跌停家数、上涨家数占比、北向资金净流入等。这类因子属于“市场整体环境”变量,对个股的预测能力有限,但对仓位管理非常有价值。比如当市场情绪指标处于极端低位时,整体仓位可以适当提高。

1.3 因子预处理:缺失值、极值与标准化的处理细节

原始因子算出来之后,绝对不能直接喂给模型。我见过太多人跳过预处理这一步,结果模型表现一塌糊涂,还以为是模型不行。实际上,预处理做得好,简单的线性模型也能跑出不错的效果;预处理做得差,再复杂的深度学习模型也是白搭。

缺失值处理是第一步。A股数据缺失主要有三种情况:一是新股上市初期历史数据不足;二是停牌期间没有交易数据;三是财务数据尚未披露。对于前两种情况,我通常采用“前向填充+可用窗口标记”的方式——用最近一个有效值填充,同时增加一个“数据可用天数”的辅助特征,让模型知道这个填充值有多可靠。对于财务数据缺失,我倾向于直接剔除该样本,因为财务数据的缺失往往意味着公司存在某些问题,强行填充反而会引入偏差。

极值处理是第二步。A股经常出现连续涨停的妖股,这些股票的动量因子值会异常大,如果不处理,会严重干扰模型的参数估计。我的做法是采用中位数绝对偏差(MAD)法进行截断,而不是简单的3σ法。因为3σ法假设数据服从正态分布,而A股收益率明显是尖峰厚尾的,用MAD法更稳健。具体操作是:计算因子的中位数和MAD值,将超过中位数±5倍MAD的值截断到边界上。

标准化是第三步。不同因子的量纲差异巨大,比如市盈率可能是几十,而换手率可能是零点几。如果不做标准化,量纲大的因子会主导模型。我通常采用截面标准化,即在每个时间截面上对所有股票的同一因子做Z-Score标准化。这样做的好处是消除了市场整体涨跌的影响,让因子值反映的是“相对强弱”而非“绝对水平”。

注意:标准化必须在每个时间截面上独立进行,不能跨时间做全局标准化。否则会引入未来信息,导致回测结果虚高。

1.4 因子有效性检验:IC、IR与分层回测

因子算出来、预处理做完,接下来必须检验它到底有没有预测能力。我常用的三个指标是IC、IR和分层回测。

IC(信息系数)是因子值与未来收益率的相关系数。通常计算Spearman秩相关系数,因为它对极值不敏感。IC的绝对值大于0.03就算有效,大于0.05就算相当不错了。但要注意,单期IC高不代表因子好,需要看IC的均值是否稳定为正或为负。

IR(信息比率)是IC均值除以IC标准差,衡量的是因子预测能力的稳定性。IR大于0.5的因子就值得纳入因子池。我一般会计算过去12个月的滚动IR,观察因子是否出现失效迹象。

分层回测是最直观的检验方法。把股票按因子值从高到低分成5组或10组,分别计算每组的累计收益。如果因子有效,应该能看到明显的单调性——要么高因子组持续跑赢低因子组,要么反过来。如果各组收益杂乱无章,说明这个因子没有区分能力。

下面这张表是我在实际操作中总结的因子检验标准,供参考:

检验指标合格标准优秀标准备注
IC均值绝对值>0.03绝对值>0.05需观察至少12个月
IC胜率>55%>60%IC符号与预期一致的比例
IR>0.3>0.5IC均值/IC标准差
分层单调性首尾组差异显著各组严格单调需做统计显著性检验
换手率月换手<100%月换手<50%换手过高会侵蚀收益

2. 大模型在量化决策中的落地方式

2.1 大模型能做什么、不能做什么

先把预期管理好。大模型在量化策略里的角色,不是直接预测涨跌,而是做信息提取、模式识别和决策辅助。我见过不少人指望用大模型直接输出“明天某只股票涨还是跌”,这种用法基本都会失败,因为大模型的训练数据是文本,不是时间序列,它对数值的敏感度远不如传统时序模型。

那大模型到底能干什么?根据我的实践经验,主要有三个方向。第一是处理非结构化数据,比如从财报文本、行业新闻、研究报告里提取关键信息,转化成结构化因子。第二是做多模态融合,把文本情绪、数值因子、图表模式结合起来做综合判断。第三是做策略逻辑的生成与优化,比如让大模型根据历史回测结果,自动生成新的因子组合思路。

2.2 用大模型做财报文本因子提取

财报文本里藏着大量有价值的信息,但传统方法很难高效提取。我现在的做法是:把财报中的“管理层讨论与分析”部分截取出来,用大模型做三件事。

第一,提取关键经营指标的变化方向。比如“公司营收增长主要来自华东地区门店扩张”,大模型可以提取出“营收增长-华东地区-门店扩张”这样的结构化三元组。这些信息可以转化成因子,比如“扩张力度得分”。

第二,做情感分析。管理层对未来的措辞是积极还是消极,往往比财务数字本身更有预测力。我让大模型对每段文本打一个-1到+1的情感分,然后计算整篇财报的情感均值。实测下来,这个情感因子和未来一个季度的股价表现有显著的正相关。

第三,识别风险提示。财报里的风险提示部分往往被投资者忽略,但大模型可以快速提取出风险类型和严重程度。比如“原材料价格波动风险”和“政策监管风险”,对股价的影响路径完全不同。

具体操作上,我会用提示词模板来约束大模型的输出格式,确保每次提取的结果结构一致。比如:

prompt_template = """ 请从以下财报文本中提取信息,按JSON格式输出: {{ "growth_direction": "增长/持平/下滑", "growth_source": "主要增长来源,20字以内", "sentiment_score": -1到1之间的浮点数, "risk_types": ["风险类型1", "风险类型2"], "risk_severity": 1到5的整数 }} 财报文本: {text} """

提示:大模型提取的结果一定要做人工抽检,至少随机检查5%的样本。我刚开始太信任模型输出,结果发现有些财报的表格数据被误读,导致因子值完全错误。

2.3 大模型辅助因子组合优化

因子池建好之后,下一个问题是怎么组合。传统方法是等权加权或者IC加权,但这种方法忽略了因子之间的非线性关系。我现在的做法是:用大模型生成因子组合的候选方案,再用历史数据做快速回测筛选。

具体流程是这样的。第一步,把因子池里每个因子的IC均值、IR、换手率、与其他因子的相关性整理成一张表。第二步,把这张表喂给大模型,让它生成10到20个因子组合方案,每个方案包含因子名称和权重。第三步,对每个方案做快速回测,计算夏普比率、最大回撤、年化收益。第四步,选出表现最好的3到5个方案,做更细致的参数调优。

这个方法的优势在于,大模型可以基于它对金融逻辑的理解,提出一些人类容易忽略的组合方式。比如它可能会建议“把低波动因子和高质量因子组合在一起,因为这两个因子在不同市场环境下有互补性”。这种思路如果靠人工穷举,效率会低很多。

但要注意,大模型的建议必须经过严格回测验证,不能直接采用。我遇到过好几次,大模型给出的组合逻辑听起来很有道理,但回测结果一塌糊涂。原因可能是它过度拟合了训练数据中的某些模式,而这些模式在当前市场已经失效。

2.4 大模型决策的实时性与成本控制

大模型推理是有延迟和成本的,这在量化交易中是一个硬约束。如果你的策略需要盘中实时决策,调用大模型API的延迟可能达到几百毫秒甚至几秒,这在快速变化的市场里是不可接受的。

我的解决方案是分层决策架构。第一层是传统量化模型,负责高频、实时的信号生成,延迟在毫秒级。第二层是大模型,负责低频、盘后的决策辅助,比如每天晚上更新因子权重、生成第二天的交易计划。第三层是人工审核,对大模型给出的重大调整建议做最终确认。

这样设计的好处是,既利用了大模型的信息处理能力,又避免了它在实时性上的短板。成本方面,我通常只对持仓股票和候选股票调用大模型,而不是全市场5000多只股票都跑一遍。这样每天的API调用量可以控制在几百次以内,成本完全可接受。

3. 完整实操流程:从数据到策略上线

3.1 数据准备与因子计算流水线

整个流程的第一步是搭建数据流水线。我用的数据源包括日频行情数据、财务数据、以及通过大模型处理的文本数据。行情数据每天收盘后更新,财务数据按季度更新,文本数据在财报发布后48小时内处理完毕。

因子计算我写成了一个独立的Python模块,核心逻辑是:读取原始数据→计算基础因子→做预处理→输出标准化因子矩阵。这个模块每天定时运行,输出结果存入数据库。下面是一个简化的代码框架:

import pandas as pd import numpy as np from scipy.stats import rankdata def calculate_momentum(price_df, windows=[5, 10, 20, 60]): """计算动量因子""" factors = {} for w in windows: factors[f'mom_{w}d'] = price_df['close'].pct_change(w) return pd.DataFrame(factors) def calculate_volatility(return_df, windows=[5, 20, 60]): """计算波动率因子""" factors = {} for w in windows: factors[f'vol_{w}d'] = return_df.rolling(w).std() return pd.DataFrame(factors) def preprocess_factors(factor_df): """因子预处理:缺失值填充、极值截断、截面标准化""" # 前向填充 factor_df = factor_df.fillna(method='ffill') # MAD法截断极值 for col in factor_df.columns: median = factor_df[col].median() mad = (factor_df[col] - median).abs().median() upper = median + 5 * mad lower = median - 5 * mad factor_df[col] = factor_df[col].clip(lower, upper) # 截面Z-Score标准化 factor_df = factor_df.apply(lambda x: (x - x.mean()) / x.std()) return factor_df

这个框架看起来简单,但有几个细节非常关键。第一,滚动窗口的计算必须严格避免未来函数。比如计算20日动量时,只能用当前日期及之前的数据,不能用之后的数据。我通常会在代码里加一个时间戳检查,确保每个因子的计算截止日期不超过当前日期。第二,停牌股票的处理。停牌期间没有价格数据,前向填充会导致因子值“冻结”,复牌后可能出现剧烈变化。我的做法是给停牌股票打一个标记,在模型训练时降低这些样本的权重。

3.2 模型训练与验证集划分

特征工程做完之后,就是模型训练。我目前主要用两种模型:LightGBM做主力预测模型,大模型做辅助决策。LightGBM的优势是训练快、可解释性好、对缺失值不敏感,非常适合量化场景。

训练集、验证集、测试集的划分非常讲究。绝对不能随机划分,因为金融时间序列存在自相关性,随机划分会导致数据泄露。我的做法是:用前70%的时间段做训练,中间15%做验证,最后15%做测试。而且训练集和验证集之间要留一个“隔离期”,通常取20个交易日,避免边界处的信息泄露。

模型参数方面,我通常设置:学习率0.05,树的数量500,最大深度6,叶子节点最少样本数50。这些参数不是拍脑袋定的,而是通过网格搜索结合早停法确定的。早停法特别重要,因为金融数据噪声大,模型很容易过拟合。我一般设置早停轮数为50,即如果验证集损失连续50轮不下降,就停止训练。

3.3 回测框架与绩效评估

回测是检验策略好坏的唯一标准。我用的回测框架是自己写的,核心逻辑是:每个调仓日,根据模型预测分数排序,买入前N只股票,卖出不在前N的股票。调仓频率通常是一周一次或两周一次,太频繁会被交易成本吃掉收益,太慢又跟不上市场变化。

回测中必须考虑的几个现实约束:交易成本(佣金万分之二点五,印花税千分之一,滑点千分之二)、涨跌停无法成交(涨停买不进,跌停卖不出)、停牌无法交易。这些约束如果不加进去,回测收益会虚高很多。我见过一个策略,不考虑交易成本时年化收益30%,加上成本后直接降到8%,这就是现实。

绩效评估我主要看四个指标:年化收益率、夏普比率、最大回撤、Calmar比率(年化收益/最大回撤)。夏普比率大于1算合格,大于1.5算优秀。最大回撤控制在20%以内比较理想。Calmar比率大于0.5说明收益和风险的平衡做得不错。

下面这张表是我最近一个策略的回测结果,供参考:

指标数值评价
年化收益率18.7%中等偏上
夏普比率1.32合格
最大回撤16.4%可接受
Calmar比率1.14良好
月胜率58%一般
平均持仓数30只分散度足够

3.4 实盘上线与监控

回测通过之后,不要急着上实盘。我的做法是先跑一个月模拟盘,用实时数据但不下真实订单,观察策略在真实市场环境下的表现。模拟盘和回测的差异主要来自三个方面:数据延迟、成交价格偏差、以及市场冲击成本。如果模拟盘表现和回测差距在20%以内,就可以考虑小资金实盘。

实盘上线后,监控是重中之重。我每天会检查几个关键指标:策略当日收益与基准的偏离、持仓股票的集中度、因子暴露是否发生漂移。如果发现策略连续5个交易日跑输基准,或者单日回撤超过3%,就会触发预警,需要人工介入检查。

实操心得:实盘初期一定要用小资金,我一般用总资金的10%跑一个月,确认稳定后再逐步加仓。千万不要一上来就满仓,市场总会用各种意想不到的方式教育你。

4. 常见问题与排查技巧实录

4.1 因子失效的识别与处理

因子失效是量化策略最常见的问题。表现是:原本有效的因子,突然IC均值大幅下降,甚至变成负值。我遇到过好几次,一开始以为是市场风格切换,后来发现其实是因子计算逻辑出了问题。

排查因子失效,我通常按以下顺序检查。第一步,检查数据源。数据源是否发生了变更?比如某天开始,行情数据从复权价变成了不复权价,这会导致动量因子完全失效。第二步,检查计算逻辑。是否有代码改动引入了bug?我习惯用版本控制管理因子计算代码,每次改动都记录在案,方便回溯。第三步,检查市场环境。如果数据和代码都没问题,那可能是市场风格确实变了。这时候需要判断是暂时性失效还是永久性失效。暂时性失效可以等待恢复,永久性失效则需要剔除该因子。

4.2 大模型输出不稳定的应对策略

大模型的输出有时候会“飘”,同样的输入,两次调用可能给出不同的结果。这在量化决策中是个大问题。我的应对策略是多次采样+投票机制。对同一个输入,调用大模型5次,取出现频率最高的结果作为最终输出。如果5次结果差异太大,说明这个样本本身模糊性高,直接丢弃不用。

另外,温度参数设置也很关键。做信息提取时,我把温度设为0,让输出尽可能确定。做创意生成时,温度设为0.7,让输出更多样。这个参数一定要根据任务类型调整,不能一套参数用到底。

4.3 回测与实盘差异过大的排查清单

回测和实盘差异大,是每个量化交易者都会遇到的问题。我整理了一份排查清单,按优先级排序:

排查项常见问题解决方法
交易成本回测未计入滑点和冲击成本加入千分之二滑点,大单拆分
涨跌停回测假设涨停也能买入涨停日标记为无法成交
停牌回测未处理停牌股票停牌期间冻结持仓,复牌后按开盘价交易
数据延迟实盘数据比回测数据晚使用实时数据源,预留缓冲时间
流动性小市值股票无法按回测价格成交限制持仓股票的最小日均成交额
过拟合模型在训练集上表现过好增加样本外测试,简化模型

4.4 策略容量与资金规模匹配

策略容量是指一个策略能容纳的最大资金量。很多策略在小资金时表现很好,资金一大就失效,因为交易冲击成本会吃掉收益。我通常用以下方法估算策略容量:计算持仓股票的平均日均成交额,策略容量大约是这个值的5%到10%。比如持仓股票平均日成交额是2亿,那策略容量大约在1000万到2000万之间。

如果资金规模超过了策略容量,有几个解决办法。第一,降低调仓频率,减少交易冲击。第二,增加持仓股票数量,分散交易。第三,把大单拆成小单,用算法交易分批执行。第四,开发多个低相关性的策略,把资金分散到不同策略上。

5. 一些踩坑之后的真心话

做量化策略这几年,最大的体会是:模型和因子都是工具,真正决定成败的是对市场的理解和风险控制。我见过太多人沉迷于调参和堆因子,却忽略了最基本的逻辑——这个因子为什么有效?它在什么市场环境下会失效?如果市场环境变了,我该怎么办?

大模型确实给量化策略带来了新的可能性,尤其是在处理非结构化数据方面。但它不是万能的,不能替代对市场的深入思考。我的建议是:把大模型当成一个高效的助手,而不是一个全能的预言家。它帮你处理信息、生成思路,但最终的决策逻辑和风险控制,必须掌握在自己手里。

还有一个很实际的建议:不要追求完美的策略,追求可解释、可迭代的策略。一个夏普比率1.2但逻辑清晰的策略,远比一个夏普比率2.0但完全看不懂的黑箱策略更有生命力。因为前者你可以持续优化,后者一旦失效你连问题出在哪都不知道。

最后分享一个小技巧:我习惯每周写一份策略周报,记录本周的收益、回撤、因子表现、以及市场环境的变化。这份周报不对外发布,纯粹是给自己看的。坚持了两年多,回头翻看的时候,能清晰地看到自己的认知迭代过程,也能发现很多当时忽略的规律。这个习惯,比任何单一的技术手段都更有价值。

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

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

立即咨询