做A股量化一段时间后,你会发现真正决定策略能不能活下来的,往往不是模型本身有多高级,而是特征怎么构造、信号怎么合成、实盘链路怎么打通。这篇是系列的下篇,重点聊特征工程和大模型决策落地的完整路线。如果你还在纠结"该怎么把AI塞进策略里",或者刚跑通一个demo却不知道怎么转到实盘,这篇文章应该能帮你少踩几个坑。先说一个观点:不要把大模型当成"涨跌预测器",而是要把它放在决策链路上一个更合适的位置。特征工程负责把行情和基本面变成模型吃得到的信号,大模型负责解读非结构化信息,最后还要有一套风控和回测机制把这一切约束住。下面我从头到尾拆一遍。1. 特征工程不是越多越好:先解决对齐,再做截面,最后才是算法1.1 数据对齐是第一步,做不好后面全白搭很多刚开始做量化的朋友拿到的第一份数据,就是一张带股票的日线表:日期、开盘、收盘、最高、最低、成交量、成交额、复权因子。看起来没问题,但真开始做特征时,第一个拦路虎往往不是指标难算,而是数据根本对不齐。A股的数据有几个奇怪的特性:有停牌、有涨停跌停、有上市首日不设涨跌幅、有ST股风险警示。如果你直接用原始表做滚动窗口计算,某只股票停牌几天后复牌,你的移动均线会被拉出奇怪的折线,而且这部分数据在回测里会产生巨大的偏差。更麻烦的是,不同数据源的复权方式还不一样,前复权、后复权、不复权,直接决定你的收益率计算准不准。我自己的习惯是,先固定一套清洗流程,把数据统一成"一张主表 + 多个映射表"的格式。所谓主表,是每个交易日、每只股票一行,包含价格和成交量的核心列;映射表则是多维度的标签信息,比如行业分类、是否ST、上市天数、市值区间等等。这样做的目的,是让后续每一个特征计算都在同一个时间轴上做,避免因为停牌、新股、ST状态导致面板数据出现缺失或错位。实际处理的时候,一个很容易被忽略的点是"交易日历"。A股有节假日调休,有非交易日的行情快照,比如有些数据商在周末也会推一次静态数据。如果你直接用自然日去shift,回测里会出现时间错位,看起来信号很准,其实是把未来信息泄露进去了。所以,所有特征计算都应该是基于"交易日序号"而非"自然日序号"。1.2 技术指标批量生成时的"未来函数"陷阱技术指标是特征工程里最常写的一块,均线、MACD、RSI、布林带,一堆库都能算。但问题来了:很多人在计算时默认把当天的收盘价纳入指标,然后同一天就用这个指标去下单,这在回测里看似没问题,实盘里却完全做不到。举一个最简单的例子:你计算5日均线,如果5日均线包含今天收盘,那你在盘中或者开盘时根本不知道今天的收盘价,除非你假设用的是"截至昨天的均线"。这就是典型的"未来函数"问题。回测用起来利润很高,实盘一上线就会立刻崩掉。避免的办法很朴素:任何用到当前周期收盘价的特征,在下单信号产生前都至少往后推一天。也就是说,T日收盘后计算的信号,最早只能在T+1日开盘后执行。这一点需要在特征计算的框架层面设计好,而不是在每个因子里分别注意。我们常用的做法是,在特征生成的入口统一传入一个截止日期参数,所有指标计算只跑截止到该日期,超出部分一律预测期屏蔽。另外一个坑是指标的参数冗余。你一口气写五十个均线组合,每个参数都很接近,算出来的特征相关性极高。起初看不出来,但后续做特征筛选的时候,你会发现一半以上的特征都在说同一件事,真正独立的信息很少。所以我的建议是,技术指标类特征在前期不需要贪多,先把最经典的那批做干净,比如:动量类:不同窗口的收益率、乖离率波动类:ATR、历史波动率、振幅量价配合类:量比、资金流向估计、换手率均值回归类:RSI、布林位置、Z-score趋势类:均线多头排列程度、MACD柱变化另外要提醒一下,在A股里,换手率、市值、波动率这些量价特征往往比单纯的技术指标更有预测力,因为市场里的散户比例高,情绪化特征明显。别只顾着算指标,而忘了把流动性和市值维度加进来。1.3 截面特征:排名、分位与行业中性化时间序列特征算完之后,只是第一步。真正的建模优势来自截面特征——也就是同一时刻,这只股票相对于整个市场、相对于同行业处于什么位置。比如你算出一只股票的5日涨跌幅是8%,单看这个数字说明不了什么。但如果你知道整个市场的5日涨幅中位数是9%,而这只股票所在的行业5日平均涨幅是6%,那就有了相对信息:它跑赢了大盘,但跑输了自己的板块。这种相对强弱关系,在A股风格切换极快的环境里,往往比绝对值更有用。截面特征最常见的方法是排名和分位数。我一般会把每个时间序列特征都做一次当日横截面的百分位排名,用0到1之间的数值替换原始值。这样处理之后,不同时期、不同股票之间就有了可比性,模型也不用自己去适应市场整体的涨跌。行业中性化是另一件必须做的事。A股的行业分类有很多套标准,直接用某个分类即可,关键是让每个特征在行业内再次做去均值处理。为什么一定要做行业中性化?因为行业本身的影响太大了,某某板块集体大涨的时候,如果模型只是靠"它属于热门行业"这个信息得分,那一旦行业轮动,你辛苦训练出来的模型就失效了。中性化之后,模型更多看到的是公司在行业内相对强弱,颗粒度更细,也更稳健。这里插一句,做截面排名和中性化的数据是"快照"概念。例如在T日收盘后,我们只能使用截至T日的全市场横截面数据,绝对不能混入T+1日的信息。快照程序的稳定性直接影响特征质量。1.4 预处理:去极值、缺失值、横截面标准化特征值算完之后,不预处理直接丢进模型是不行的。A股数据里极端值特别多,比如某天某只股票因为异常交易出现巨大涨幅,或者因为停牌导致换手率突变,这些离群点会让模型的权重偏得非常离谱。去极值我喜欢用MAD(中位数绝对偏差)方法,因为均值容易受极端值影响,而中位数稳健很多。对于每个因子,在横截面上计算中位数和MAD,凡是偏离超过3倍MAD的值,统统截断到边界。这个方法实现简单,效果稳定。然后是缺失值处理。A股里的缺失值很多是有含义的,比如新股上市首日没有历史均线,比如停牌日没有收益率。盲目用零填充或者全局均值填充,会破坏数据本身的含义。我的做法是,对于时间序列类的特征,用前一个有效值前向填充,但只填充有限周期,超过一定周期就直接标记为无效值;对于截面类的特征,用行业均值填充,实在填不了的就置为NaN,让模型自己去忽略。标准化也是在横截面上做。这里要特别强调,不要在全部历史数据上做全局标准化,而是每个交易日截面单独做,均值为0、方差为1。这样模型看到的是每日的相对水平,而不是绝对数值,可以有效减少市场体制变化带来的影响。做完这些,特征才算真正可以进模型了。2. 大模型在策略里的三个落点:别指望它预测涨跌2.1 大模型适合做的事件分类与情绪打分一开始我也尝试过让大模型直接预测第二天涨跌,结果非常稳定——稳定地亏。后来我调整了思路:大模型的数理推理能力其实很一般,它真正擅长的是理解非结构化文本、提取语义、归纳主题。所以,现在我在策略里给大模型的定位只有三个:财经事件分类、市场情绪打分、以及公告/新闻的风险提示。先说事件分类。每天盘后市场上会有大量的公告和新闻,比如业绩预增、股东减持、重大合同、处罚公告、并购重组。这些信息如果用人工去读,根本来不及,而且很容易漏。大模型可以对每一条公告做标签化处理,判断它属于哪个事件类型,是利好还是利空,影响程度是高是低。这些标签可以直接变成因子,进入后面的模型。情绪打分是另一个实际落地点。我们把关键词和句子喂给模型,让它给出一个1到100的情绪强度,配合简短的理由说明。比如某条新闻说"某公司公告与海外巨头达成战略合作",模型可以打一个偏正面的分数,同时注明依据是什么。这个分数经过清洗和聚合,就是一个文本情绪因子。为什么说大模型适合做这些?因为这里需要的不是精确预测,而是相对稳定的语义判断。在语义理解、信息抽取和概括归纳这件事上,大模型确实比传统NLP效果好很多。换个角度说,如果我们拿一堆历史新闻让模型去判断情绪,再由人来review,模型给出的判断大部分时候是符合直觉的,这正是它能被结构化的前提。2.2 打分提示词设计与结果去噪大模型的应用大头在提示词工程上。以情绪打分为例,我试过几版不同的提示词,效果差异很大。一开始写的是:"请判断这条新闻对股市的影响,给出分数。" 模型会给出一个很笼统的答案,有时候还会把它当成闲聊,随机输出。后来我改成这样:你是一名A股市场研究助理。给你一条关于某上市公司的新闻,请判断该新闻对该上市公司短期股价情绪的影响。 输出要求: 1. 情绪标签:利好、利空、中性,三选一。 2. 情绪强度:1到10的整数,1为极弱,10为极强。 3. 一句不超过30字的判断依据,必须引用新闻中的具体信息。 4. 若新闻与上市公司无直接关联,请直接输出"无影响"。把任务限定得越细,输出就越稳定。这里有个很关键的小技巧:强制模型输出依据。有了依据之后,我们可以对模型输出做二次校验,比如发现模型在该事件类型上频繁给出不靠谱的标签,就可以考虑在策略中降低这条信号的权重,甚至屏蔽它。除了提示词,结果去噪也很重要。大模型API返回的结果是有随机性的,温度参数调低可以让输出更确定,但不能完全消除随机性。我在实际使用中会对同一条新闻采样多次,然后用多数投票的方式确定最终标签,情绪强度则取中位数。你别觉得这个步骤费token,在日频策略里,每天需要处理的新闻数量有限,多几次采样带来的稳定性提升非常值得。另外有一点容易被忽略:大模型的打分不是"基本面研究",它看到的只是新闻文本,它并不知道这家公司的真实财务状况、管理层质量、行业竞争格局。所以情绪因子在整体信号里的权重不宜过高,把它当作一个辅助信号来用就好。2.3 融合路径:特征进模型,还是决策级否决权大模型输出的信号,要怎么跟传统机器学习模型融合呢?我踩过坑之后,觉得有两条比较靠谱的路径。第一条:把大模型输出当作特征,和量价特征一起喂给下游模型。也就是说,大模型判断出来一个情绪得分,这个得分作为一个新的维度,进入到梯度提升树或者神经网络里。这种方式的好处是,下游模型可以自己去学习情绪因子和量价因子之间的交互关系,比如"情绪因子极低 + 换手率激增"可能意味着风险信号。缺点是,一旦新增文本数据源,整个特征集都要重新训练,成本较高。第二条:决策级融合,赋予大模型否决权。传统模型的排序结果不变,但某些情况下大模型可以"一票否决"。比如模型给某只股票打了高分,但大模型在当日公告中识别出一条高风险负面消息,那我们就不交易这只股票。这种方式的逻辑是:量价模型负责找机会,语义模型负责排雷。我自己的做法倾向于两条腿走路:主成分上,把情绪因子作为普通特征进模型,同时保留一个自动否决名单,凡是当日出现重大负面公告的股票,直接从候选池里剔除。这样既保留了大模型的信息增量,又不会让它的失误对整体收益造成太大冲击。2.4 成本、延迟与幻觉:实盘之前就要考虑大模型听起来很美,但落地时有三件很现实的事:成本、延迟和幻觉。成本方面,每天对全市场公告和新闻做一遍批量判断,按日频策略的量级,一天的调用费用完全在可接受范围,但如果你的策略是分钟级或者tick级,成本会成倍上涨,延迟也扛不住。我的理解是,日频策略用大模型处理文本非常合适,高频策略暂时并没必要硬上。如果你想降低成本,可以用开源自部署的小参数模型做初筛,只把拿不准的样本送大模型复核,能省下不少钱。延迟方面,大模型API的返回时间一般在数秒到数十秒之间。如果你在开盘前要跑完整个流程,就必须把调用时间前置,比如在盘前30分钟就开始拉新闻、做分类。一旦拖到盘中处理,信号的时效性就会大打折扣。我习惯的做法是,把文本处理流程拆成"盘后预计算"和"盘前增量更新"两段,这样真正开盘时的计算压力就小很多。幻觉问题是最需要警惕的。大模型可能会把公告里的某种表述过度解读,或者把一条旧闻当作新消息来打标签。解决方案其实只有两个,一个是强制它引用原文,另一个是做时效性标注——公告日期、发布时间都要作为输入给到模型,同时我们在下游过滤掉过期信息。你永远不可能让幻觉降为零,但可以通过约束和过滤把它控制在不影响决策的范围内。3. 信号合成了,但风控才是活下来的关键3.1 信号权重:一个不需要复杂优化的合理默认值当你同时有量价模型预测分、情绪因子、事件分类标签时,下一步不是把模型调到完美,而是先把一个合理的合成方案跑起来。很多做量化的人不是死在模型上,而是死在"总想多优化一点"的拖延里。我从实用主义出发,推荐一个默认的合成方案:先把每个信号做横截面标准化,然后按经验权重相加。量价模型预测分占60%,情绪因子占20%,事件标签映射的分数占20%,最后把总分排序,取前若干名作为候选股票池。这个默认权重不需要复杂的优化器,它给的是一个相对稳健的起点。你先在这个权重下跑几个月,再根据归因数据去调整。请注意,这里的权重分配不是一成不变的。比如在财报披露季,事件标签的影响会变大;在趋势行情里,量价模型的贡献可能更大。我们在实盘之外,需要定期做一次滚动回测来观察每个子信号的边际贡献,然后小幅调整权重。建议每次调整幅度不要超过5个百分点,否则很容易出现过拟合。3.2 止损、仓位与单一标的上限的硬编码策略的长期存活,核心在风控规则。很多模型在回测里曲线很好,一上实盘就大幅回撤,原因往往不是模型失效,而是风控模块完全没有起作用。止损我习惯分成两层:个股止损和组合止损。个股止损常见的是固定百分比止损,比如买入后跌5%无条件离场。但我更推荐结合波动率来设定,比如当某只股票的亏损超过了近20日ATR的1.5倍时离场,这种方式在波动率不同的股票之间更公平。组合止损是在整个策略的净值回撤达到一定程度时,强制减少仓位,比如从100%降到50%。这两层缺一不可。单一标的上限是为了防止持仓过度集中。A股市场的个股波动很大,如果你把全部资金压在一只股票上,即使模型再好,运气不好也会让你很难受。我一般会把单只股票的仓位上限控制在总资金的10%到15%之间,同时保证持仓数量至少十只以上,行业分布尽量分散。风控规则必须写死在代码里,而不是靠人手下单时自律,因为实盘交易中最容易犯的错误就是"临时改变主意"。3.3 组合约束:行业暴露与换手率限制只有个股风控还不够,组合层面也需要约束。最典型的是行业暴露。假如你的模型选出的股票大量集中在某个行业板块,比如电子或者新能源,一旦这个板块遇到系统性调整,整个策略会一起受伤。所以应该设定行业权重的上限,超出部分自动在行业内做等权轮换,而不是继续加仓。换手率限制也是容易被忽视的一点。有些策略每天把股票池全部换一遍,回测里收益不错,但实盘中的交易成本会吃掉大部分利润。我的建议是,每天实际调仓的股票数量控制在股票池规模的20%以内,即使是信号发生了剧烈变化,也要强制让整个换手率不超过某个阈值。你可以设置一个"交易意愿度"评分,只有新旧信号的差异足够大时,才允许替换持仓。这样既能跟上模型变化,又不会频繁交易。这些组合约束看起来会让收益曲线变钝,但它们的价值恰恰在于让你活着等到模型有效的那一天。量化交易是概率游戏,单次交易可以亏,但组合不能失控。4. 回测里最容易骗到你的那些细节4.1 T日数据做T日决策是回测刷分重灾区回测系统的第一原则,就是严格模拟真实交易里的信息时序。实际交易时,你在T日开盘只能看到T-1日及之前的所有数据,而你在T日盘中做的决策,最早也只能在T日盘中实现。在回测中,很多框架默认你可以在T日收盘后拿到全部数据,然后在T日收盘时执行交易,这在日频策略里已经是信息泄露了。更隐蔽的问题出在"中途变价"。当你在T日盘中决定买入时,成交价应该参考T日盘中或开盘后的价格,而不是T日的收盘价。收盘价往往比盘中价格更容易出现被操纵或者极端化的情况。如果你在回测中动不动就用收盘价成交,那你的收益曲线会系统性地偏向乐观。我在写回测引擎时,把所有策略信号和交易执行强制分离:信号只使用t-1日的数据生成候选列表,然后回测系统会对候选列表做成交模拟,用的价格是t日开盘价或t日内的VWAP,而不是收盘价。这个细节虽然会让收益曲线变差一点,但真实感强得多。4.2 滑点、涨跌停与成交量的隐性约束回测中另一个常见的乐观偏差,是忽略了真实成交的可能性。当信号在开盘时告诉你买入某只股票,你以为自己会以开盘价成交,但实际情况下,如果你的资金量稍微大一点,瞬间就会把价格推高,尤其是那些成交量很小的小市值股票。所以在回测里模拟滑点和成交量约束时,不能用一个固定的百分比来敷衍。比较现实的做法是:如果你的目标成交量超过了该股票当日成交量的某个比例,比如5%或10%,那么成交价格就要向上滑动一到两档,甚至直接判定为部分成交或全部无法成交。A股有涨跌停板制度,当股票涨停时你根本买不进去,跌停时卖不出来,回测如果不加这个约束,会模拟出一批现实中根本成交不了的交易。把涨跌停、停牌、流动性比例这些硬约束全部加进回测之后,你才会看到一个更真实的模型水平。许多人从"完美回测"切换到"保守回测"后,第一反应是怀疑自己模型出了问题,其实模型没变,变的是你终于看到了实盘的影子。4.3 过拟合自查:参数敏感性、样本外和随机基线模型做出来之后,过拟合审查是必经之路。我通常做三件事。第一件,参数敏感性分析。把模型里的关键参数,比如特征窗口、止损比例、信号权重,在合理范围内做小幅扰动,看收益曲线是否剧烈波动。如果参数从5调到6,年化收益从20%变成5%,那这个模型基本就是过拟合的。真正稳健的策略,在参数小范围扰动下,收益应该有一定波动,但不至于天翻地覆。第二件,严格的样本外测试。把时间序列分成训练段、验证段和测试段。注意,时间序列的划分不能随机打散,必须以时间为cut,训练段在最前,测试段在最后。如果你用随机交叉验证,模型会偷看未来的数据分布,年份不同市场风格差异巨大,这样测出来的指标并不代表未来的预测能力。第三件,随机基线对照。把股票池随机打乱,用随机信号跑同一套回测流程。如果你的策略年化收益只比随机基线高几个百分点,扣掉手续费后几乎无优势,那说明模型没有真正的预测力。这个对比虽然残酷,但非常必要。5. 实盘前的最后一关:模拟盘、日志与归因5.1 先跑模拟盘,别直接上真金白银即使回测做得再严谨,我也坚持在实盘前先跑一段模拟盘。模拟盘和回测最大的不同,是它使用真实的实时数据,但不会产生真实的成交。这样你可以观察到模型在真实市场环境下的信号延时、数据流稳定性、API调用有没有超时、盘中计算资源够不够——这些在回测里都是看不到的。模拟盘至少跑两到四周,期间不要频繁修改参数,否则你只是在拟合一个没有实盘意义的meta模型。跑模拟盘的价值是暴露系统层面的问题,而不是验证策略收益。我见过很多人模拟盘一跑,发现信号比回测晚了几分钟,却还在那里怀疑因子失效,其实问题出在数据流延迟上。如果模拟盘期间模型的信号质量还算稳定,再来考虑小资金实盘。刚开始的资金量不要太大,控制在你能接受全部亏损的水平。这里的目的是用真实的市场摩擦,比如撮合方式、手续费、滑点,来校验之前所有假设,而不是追求回报。5.2 决策日志与归因:怎么知道是能力还是运气实盘开始之后,最容易被忽视的是日志系统。我每次做交易决策时,都会把当时的信号值、权重、因子读数、新闻情绪、和最终成交结果一起记录到数据库里。这个日志看似是脏活累活,但它是后续归因分析的唯一数据来源。有了日志,你就能持续回答几个关键问题:某个月的收益,到底主要来自量价信号,还是来自情绪因子?模型选中的股票,平均持有了多少天才赚钱?那些被大模型否决掉的股票,它们之后的表现有没有比模型选出来的更好?这些都是常规净值曲线给不了你的答案。归因分析不是等到亏损了才来做,而是按月定期跑一遍。我会把策略月度收益拆成几个部分:市场Beta、行业Alpha、个股选择Alpha和交易摩擦成本。如果个股选择Alpha连续几个月是负的,说明模型选股逻辑可能不再适应市场;如果交易成本占比持续增长,就要考虑降低换手率。这种拆解就像是给策略做体检,越早知道哪里出问题,调整成本就越低。最后说句实在话,特征工程和大模型决策的落地是一个持续迭代的过程,不存在一劳永逸的方案。A股市场本身就在变化,去年有效的特征今年可能失效,新增的数据源也可能带来意想不到的信号。我自己的体会是,保持数据的干净和日志的完整,比追求模型的复杂度更重要。把每一步都记录到能复盘的粒度,你就能在一次次的迭代中慢慢前进。希望这篇能帮你少走一些弯路。
做A股量化一段时间后,你会发现真正决定策略能不能活下来的,往往不是模型本身有多高级,而是特征怎么构造、信号怎么合成、实盘链路怎么打通。这篇是系列的下篇,重点聊特征工程和大模型决策落地的完整路线。如果你还在纠结"该怎么把AI塞进策略里",或者刚跑通一个demo却不知道怎么转到实盘,这篇文章应该能帮你少踩几个坑。先说一个观点:不要把大模型当成"涨跌预测器",而是要把它放在决策链路上一个更合适的位置。特征工程负责把行情和基本面变成模型吃得到的信号,大模型负责解读非结构化信息,最后还要有一套风控和回测机制把这一切约束住。下面我从头到尾拆一遍。1. 特征工程不是越多越好:先解决对齐,再做截面,最后才是算法1.1 数据对齐是第一步,做不好后面全白搭很多刚开始做量化的朋友拿到的第一份数据,就是一张带股票的日线表:日期、开盘、收盘、最高、最低、成交量、成交额、复权因子。看起来没问题,但真开始做特征时,第一个拦路虎往往不是指标难算,而是数据根本对不齐。A股的数据有几个奇怪的特性:有停牌、有涨停跌停、有上市首日不设涨跌幅、有ST股风险警示。如果你直接用原始表做滚动窗口计算,某只股票停牌几天后复牌,你的移动均线会被拉出奇怪的折线,而且这部分数据在回测里会产生巨大的偏差。更麻烦的是,不同数据源的复权方式还不一样,前复权、后复权、不复权,直接决定你的收益率计算准不准。我自己的习惯是,先固定一套清洗流程,把数据统一成"一张主表 + 多个映射表"的格式。所谓主表,是每个交易日、每只股票一行,包含价格和成交量的核心列;映射表则是多维度的标签信息,比如行业分类、是否ST、上市天数、市值区间等等。这样做的目的,是让后续每一个特征计算都在同一个时间轴上做,避免因为停牌、新股、ST状态导致面板数据出现缺失或错位。实际处理的时候,一个很容易被忽略的点是"交易日历"。A股有节假日调休,有非交易日的行情快照,比如有些数据商在周末也会推一次静态数据。如果你直接用自然日去shift,回测里会出现时间错位,看起来信号很准,其实是把未来信息泄露进去了。所以,所有特征计算都应该是基于"交易日序号"而非"自然日序号"。1.2 技术指标批量生成时的"未来函数"陷阱技术指标是特征工程里最常写的一块,均线、MACD、RSI、布林带,一堆库都能算。但问题来了:很多人在计算时默认把当天的收盘价纳入指标,然后同一天就用这个指标去下单,这在回测里看似没问题,实盘里却完全做不到。举一个最简单的例子:你计算5日均线,如果5日均线包含今天收盘,那你在盘中或者开盘时根本不知道今天的收盘价,除非你假设用的是"截至昨天的均线"。这就是典型的"未来函数"问题。回测用起来利润很高,实盘一上线就会立刻崩掉。避免的办法很朴素:任何用到当前周期收盘价的特征,在下单信号产生前都至少往后推一天。也就是说,T日收盘后计算的信号,最早只能在T+1日开盘后执行。这一点需要在特征计算的框架层面设计好,而不是在每个因子里分别注意。我们常用的做法是,在特征生成的入口统一传入一个截止日期参数,所有指标计算只跑截止到该日期,超出部分一律预测期屏蔽。另外一个坑是指标的参数冗余。你一口气写五十个均线组合,每个参数都很接近,算出来的特征相关性极高。起初看不出来,但后续做特征筛选的时候,你会发现一半以上的特征都在说同一件事,真正独立的信息很少。所以我的建议是,技术指标类特征在前期不需要贪多,先把最经典的那批做干净,比如:动量类:不同窗口的收益率、乖离率波动类:ATR、历史波动率、振幅量价配合类:量比、资金流向估计、换手率均值回归类:RSI、布林位置、Z-score趋势类:均线多头排列程度、MACD柱变化另外要提醒一下,在A股里,换手率、市值、波动率这些量价特征往往比单纯的技术指标更有预测力,因为市场里的散户比例高,情绪化特征明显。别只顾着算指标,而忘了把流动性和市值维度加进来。1.3 截面特征:排名、分位与行业中性化时间序列特征算完之后,只是第一步。真正的建模优势来自截面特征——也就是同一时刻,这只股票相对于整个市场、相对于同行业处于什么位置。比如你算出一只股票的5日涨跌幅是8%,单看这个数字说明不了什么。但如果你知道整个市场的5日涨幅中位数是9%,而这只股票所在的行业5日平均涨幅是6%,那就有了相对信息:它跑赢了大盘,但跑输了自己的板块。这种相对强弱关系,在A股风格切换极快的环境里,往往比绝对值更有用。截面特征最常见的方法是排名和分位数。我一般会把每个时间序列特征都做一次当日横截面的百分位排名,用0到1之间的数值替换原始值。这样处理之后,不同时期、不同股票之间就有了可比性,模型也不用自己去适应市场整体的涨跌。行业中性化是另一件必须做的事。A股的行业分类有很多套标准,直接用某个分类即可,关键是让每个特征在行业内再次做去均值处理。为什么一定要做行业中性化?因为行业本身的影响太大了,某某板块集体大涨的时候,如果模型只是靠"它属于热门行业"这个信息得分,那一旦行业轮动,你辛苦训练出来的模型就失效了。中性化之后,模型更多看到的是公司在行业内相对强弱,颗粒度更细,也更稳健。这里插一句,做截面排名和中性化的数据是"快照"概念。例如在T日收盘后,我们只能使用截至T日的全市场横截面数据,绝对不能混入T+1日的信息。快照程序的稳定性直接影响特征质量。1.4 预处理:去极值、缺失值、横截面标准化特征值算完之后,不预处理直接丢进模型是不行的。A股数据里极端值特别多,比如某天某只股票因为异常交易出现巨大涨幅,或者因为停牌导致换手率突变,这些离群点会让模型的权重偏得非常离谱。去极值我喜欢用MAD(中位数绝对偏差)方法,因为均值容易受极端值影响,而中位数稳健很多。对于每个因子,在横截面上计算中位数和MAD,凡是偏离超过3倍MAD的值,统统截断到边界。这个方法实现简单,效果稳定。然后是缺失值处理。A股里的缺失值很多是有含义的,比如新股上市首日没有历史均线,比如停牌日没有收益率。盲目用零填充或者全局均值填充,会破坏数据本身的含义。我的做法是,对于时间序列类的特征,用前一个有效值前向填充,但只填充有限周期,超过一定周期就直接标记为无效值;对于截面类的特征,用行业均值填充,实在填不了的就置为NaN,让模型自己去忽略。标准化也是在横截面上做。这里要特别强调,不要在全部历史数据上做全局标准化,而是每个交易日截面单独做,均值为0、方差为1。这样模型看到的是每日的相对水平,而不是绝对数值,可以有效减少市场体制变化带来的影响。做完这些,特征才算真正可以进模型了。2. 大模型在策略里的三个落点:别指望它预测涨跌2.1 大模型适合做的事件分类与情绪打分一开始我也尝试过让大模型直接预测第二天涨跌,结果非常稳定——稳定地亏。后来我调整了思路:大模型的数理推理能力其实很一般,它真正擅长的是理解非结构化文本、提取语义、归纳主题。所以,现在我在策略里给大模型的定位只有三个:财经事件分类、市场情绪打分、以及公告/新闻的风险提示。先说事件分类。每天盘后市场上会有大量的公告和新闻,比如业绩预增、股东减持、重大合同、处罚公告、并购重组。这些信息如果用人工去读,根本来不及,而且很容易漏。大模型可以对每一条公告做标签化处理,判断它属于哪个事件类型,是利好还是利空,影响程度是高是低。这些标签可以直接变成因子,进入后面的模型。情绪打分是另一个实际落地点。我们把关键词和句子喂给模型,让它给出一个1到100的情绪强度,配合简短的理由说明。比如某条新闻说"某公司公告与海外巨头达成战略合作",模型可以打一个偏正面的分数,同时注明依据是什么。这个分数经过清洗和聚合,就是一个文本情绪因子。为什么说大模型适合做这些?因为这里需要的不是精确预测,而是相对稳定的语义判断。在语义理解、信息抽取和概括归纳这件事上,大模型确实比传统NLP效果好很多。换个角度说,如果我们拿一堆历史新闻让模型去判断情绪,再由人来review,模型给出的判断大部分时候是符合直觉的,这正是它能被结构化的前提。2.2 打分提示词设计与结果去噪大模型的应用大头在提示词工程上。以情绪打分为例,我试过几版不同的提示词,效果差异很大。一开始写的是:"请判断这条新闻对股市的影响,给出分数。" 模型会给出一个很笼统的答案,有时候还会把它当成闲聊,随机输出。后来我改成这样:你是一名A股市场研究助理。给你一条关于某上市公司的新闻,请判断该新闻对该上市公司短期股价情绪的影响。 输出要求: 1. 情绪标签:利好、利空、中性,三选一。 2. 情绪强度:1到10的整数,1为极弱,10为极强。 3. 一句不超过30字的判断依据,必须引用新闻中的具体信息。 4. 若新闻与上市公司无直接关联,请直接输出"无影响"。把任务限定得越细,输出就越稳定。这里有个很关键的小技巧:强制模型输出依据。有了依据之后,我们可以对模型输出做二次校验,比如发现模型在该事件类型上频繁给出不靠谱的标签,就可以考虑在策略中降低这条信号的权重,甚至屏蔽它。除了提示词,结果去噪也很重要。大模型API返回的结果是有随机性的,温度参数调低可以让输出更确定,但不能完全消除随机性。我在实际使用中会对同一条新闻采样多次,然后用多数投票的方式确定最终标签,情绪强度则取中位数。你别觉得这个步骤费token,在日频策略里,每天需要处理的新闻数量有限,多几次采样带来的稳定性提升非常值得。另外有一点容易被忽略:大模型的打分不是"基本面研究",它看到的只是新闻文本,它并不知道这家公司的真实财务状况、管理层质量、行业竞争格局。所以情绪因子在整体信号里的权重不宜过高,把它当作一个辅助信号来用就好。2.3 融合路径:特征进模型,还是决策级否决权大模型输出的信号,要怎么跟传统机器学习模型融合呢?我踩过坑之后,觉得有两条比较靠谱的路径。第一条:把大模型输出当作特征,和量价特征一起喂给下游模型。也就是说,大模型判断出来一个情绪得分,这个得分作为一个新的维度,进入到梯度提升树或者神经网络里。这种方式的好处是,下游模型可以自己去学习情绪因子和量价因子之间的交互关系,比如"情绪因子极低 + 换手率激增"可能意味着风险信号。缺点是,一旦新增文本数据源,整个特征集都要重新训练,成本较高。第二条:决策级融合,赋予大模型否决权。传统模型的排序结果不变,但某些情况下大模型可以"一票否决"。比如模型给某只股票打了高分,但大模型在当日公告中识别出一条高风险负面消息,那我们就不交易这只股票。这种方式的逻辑是:量价模型负责找机会,语义模型负责排雷。我自己的做法倾向于两条腿走路:主成分上,把情绪因子作为普通特征进模型,同时保留一个自动否决名单,凡是当日出现重大负面公告的股票,直接从候选池里剔除。这样既保留了大模型的信息增量,又不会让它的失误对整体收益造成太大冲击。2.4 成本、延迟与幻觉:实盘之前就要考虑大模型听起来很美,但落地时有三件很现实的事:成本、延迟和幻觉。成本方面,每天对全市场公告和新闻做一遍批量判断,按日频策略的量级,一天的调用费用完全在可接受范围,但如果你的策略是分钟级或者tick级,成本会成倍上涨,延迟也扛不住。我的理解是,日频策略用大模型处理文本非常合适,高频策略暂时并没必要硬上。如果你想降低成本,可以用开源自部署的小参数模型做初筛,只把拿不准的样本送大模型复核,能省下不少钱。延迟方面,大模型API的返回时间一般在数秒到数十秒之间。如果你在开盘前要跑完整个流程,就必须把调用时间前置,比如在盘前30分钟就开始拉新闻、做分类。一旦拖到盘中处理,信号的时效性就会大打折扣。我习惯的做法是,把文本处理流程拆成"盘后预计算"和"盘前增量更新"两段,这样真正开盘时的计算压力就小很多。幻觉问题是最需要警惕的。大模型可能会把公告里的某种表述过度解读,或者把一条旧闻当作新消息来打标签。解决方案其实只有两个,一个是强制它引用原文,另一个是做时效性标注——公告日期、发布时间都要作为输入给到模型,同时我们在下游过滤掉过期信息。你永远不可能让幻觉降为零,但可以通过约束和过滤把它控制在不影响决策的范围内。3. 信号合成了,但风控才是活下来的关键3.1 信号权重:一个不需要复杂优化的合理默认值当你同时有量价模型预测分、情绪因子、事件分类标签时,下一步不是把模型调到完美,而是先把一个合理的合成方案跑起来。很多做量化的人不是死在模型上,而是死在"总想多优化一点"的拖延里。我从实用主义出发,推荐一个默认的合成方案:先把每个信号做横截面标准化,然后按经验权重相加。量价模型预测分占60%,情绪因子占20%,事件标签映射的分数占20%,最后把总分排序,取前若干名作为候选股票池。这个默认权重不需要复杂的优化器,它给的是一个相对稳健的起点。你先在这个权重下跑几个月,再根据归因数据去调整。请注意,这里的权重分配不是一成不变的。比如在财报披露季,事件标签的影响会变大;在趋势行情里,量价模型的贡献可能更大。我们在实盘之外,需要定期做一次滚动回测来观察每个子信号的边际贡献,然后小幅调整权重。建议每次调整幅度不要超过5个百分点,否则很容易出现过拟合。3.2 止损、仓位与单一标的上限的硬编码策略的长期存活,核心在风控规则。很多模型在回测里曲线很好,一上实盘就大幅回撤,原因往往不是模型失效,而是风控模块完全没有起作用。止损我习惯分成两层:个股止损和组合止损。个股止损常见的是固定百分比止损,比如买入后跌5%无条件离场。但我更推荐结合波动率来设定,比如当某只股票的亏损超过了近20日ATR的1.5倍时离场,这种方式在波动率不同的股票之间更公平。组合止损是在整个策略的净值回撤达到一定程度时,强制减少仓位,比如从100%降到50%。这两层缺一不可。单一标的上限是为了防止持仓过度集中。A股市场的个股波动很大,如果你把全部资金压在一只股票上,即使模型再好,运气不好也会让你很难受。我一般会把单只股票的仓位上限控制在总资金的10%到15%之间,同时保证持仓数量至少十只以上,行业分布尽量分散。风控规则必须写死在代码里,而不是靠人手下单时自律,因为实盘交易中最容易犯的错误就是"临时改变主意"。3.3 组合约束:行业暴露与换手率限制只有个股风控还不够,组合层面也需要约束。最典型的是行业暴露。假如你的模型选出的股票大量集中在某个行业板块,比如电子或者新能源,一旦这个板块遇到系统性调整,整个策略会一起受伤。所以应该设定行业权重的上限,超出部分自动在行业内做等权轮换,而不是继续加仓。换手率限制也是容易被忽视的一点。有些策略每天把股票池全部换一遍,回测里收益不错,但实盘中的交易成本会吃掉大部分利润。我的建议是,每天实际调仓的股票数量控制在股票池规模的20%以内,即使是信号发生了剧烈变化,也要强制让整个换手率不超过某个阈值。你可以设置一个"交易意愿度"评分,只有新旧信号的差异足够大时,才允许替换持仓。这样既能跟上模型变化,又不会频繁交易。这些组合约束看起来会让收益曲线变钝,但它们的价值恰恰在于让你活着等到模型有效的那一天。量化交易是概率游戏,单次交易可以亏,但组合不能失控。4. 回测里最容易骗到你的那些细节4.1 T日数据做T日决策是回测刷分重灾区回测系统的第一原则,就是严格模拟真实交易里的信息时序。实际交易时,你在T日开盘只能看到T-1日及之前的所有数据,而你在T日盘中做的决策,最早也只能在T日盘中实现。在回测中,很多框架默认你可以在T日收盘后拿到全部数据,然后在T日收盘时执行交易,这在日频策略里已经是信息泄露了。更隐蔽的问题出在"中途变价"。当你在T日盘中决定买入时,成交价应该参考T日盘中或开盘后的价格,而不是T日的收盘价。收盘价往往比盘中价格更容易出现被操纵或者极端化的情况。如果你在回测中动不动就用收盘价成交,那你的收益曲线会系统性地偏向乐观。我在写回测引擎时,把所有策略信号和交易执行强制分离:信号只使用t-1日的数据生成候选列表,然后回测系统会对候选列表做成交模拟,用的价格是t日开盘价或t日内的VWAP,而不是收盘价。这个细节虽然会让收益曲线变差一点,但真实感强得多。4.2 滑点、涨跌停与成交量的隐性约束回测中另一个常见的乐观偏差,是忽略了真实成交的可能性。当信号在开盘时告诉你买入某只股票,你以为自己会以开盘价成交,但实际情况下,如果你的资金量稍微大一点,瞬间就会把价格推高,尤其是那些成交量很小的小市值股票。所以在回测里模拟滑点和成交量约束时,不能用一个固定的百分比来敷衍。比较现实的做法是:如果你的目标成交量超过了该股票当日成交量的某个比例,比如5%或10%,那么成交价格就要向上滑动一到两档,甚至直接判定为部分成交或全部无法成交。A股有涨跌停板制度,当股票涨停时你根本买不进去,跌停时卖不出来,回测如果不加这个约束,会模拟出一批现实中根本成交不了的交易。把涨跌停、停牌、流动性比例这些硬约束全部加进回测之后,你才会看到一个更真实的模型水平。许多人从"完美回测"切换到"保守回测"后,第一反应是怀疑自己模型出了问题,其实模型没变,变的是你终于看到了实盘的影子。4.3 过拟合自查:参数敏感性、样本外和随机基线模型做出来之后,过拟合审查是必经之路。我通常做三件事。第一件,参数敏感性分析。把模型里的关键参数,比如特征窗口、止损比例、信号权重,在合理范围内做小幅扰动,看收益曲线是否剧烈波动。如果参数从5调到6,年化收益从20%变成5%,那这个模型基本就是过拟合的。真正稳健的策略,在参数小范围扰动下,收益应该有一定波动,但不至于天翻地覆。第二件,严格的样本外测试。把时间序列分成训练段、验证段和测试段。注意,时间序列的划分不能随机打散,必须以时间为cut,训练段在最前,测试段在最后。如果你用随机交叉验证,模型会偷看未来的数据分布,年份不同市场风格差异巨大,这样测出来的指标并不代表未来的预测能力。第三件,随机基线对照。把股票池随机打乱,用随机信号跑同一套回测流程。如果你的策略年化收益只比随机基线高几个百分点,扣掉手续费后几乎无优势,那说明模型没有真正的预测力。这个对比虽然残酷,但非常必要。5. 实盘前的最后一关:模拟盘、日志与归因5.1 先跑模拟盘,别直接上真金白银即使回测做得再严谨,我也坚持在实盘前先跑一段模拟盘。模拟盘和回测最大的不同,是它使用真实的实时数据,但不会产生真实的成交。这样你可以观察到模型在真实市场环境下的信号延时、数据流稳定性、API调用有没有超时、盘中计算资源够不够——这些在回测里都是看不到的。模拟盘至少跑两到四周,期间不要频繁修改参数,否则你只是在拟合一个没有实盘意义的meta模型。跑模拟盘的价值是暴露系统层面的问题,而不是验证策略收益。我见过很多人模拟盘一跑,发现信号比回测晚了几分钟,却还在那里怀疑因子失效,其实问题出在数据流延迟上。如果模拟盘期间模型的信号质量还算稳定,再来考虑小资金实盘。刚开始的资金量不要太大,控制在你能接受全部亏损的水平。这里的目的是用真实的市场摩擦,比如撮合方式、手续费、滑点,来校验之前所有假设,而不是追求回报。5.2 决策日志与归因:怎么知道是能力还是运气实盘开始之后,最容易被忽视的是日志系统。我每次做交易决策时,都会把当时的信号值、权重、因子读数、新闻情绪、和最终成交结果一起记录到数据库里。这个日志看似是脏活累活,但它是后续归因分析的唯一数据来源。有了日志,你就能持续回答几个关键问题:某个月的收益,到底主要来自量价信号,还是来自情绪因子?模型选中的股票,平均持有了多少天才赚钱?那些被大模型否决掉的股票,它们之后的表现有没有比模型选出来的更好?这些都是常规净值曲线给不了你的答案。归因分析不是等到亏损了才来做,而是按月定期跑一遍。我会把策略月度收益拆成几个部分:市场Beta、行业Alpha、个股选择Alpha和交易摩擦成本。如果个股选择Alpha连续几个月是负的,说明模型选股逻辑可能不再适应市场;如果交易成本占比持续增长,就要考虑降低换手率。这种拆解就像是给策略做体检,越早知道哪里出问题,调整成本就越低。最后说句实在话,特征工程和大模型决策的落地是一个持续迭代的过程,不存在一劳永逸的方案。A股市场本身就在变化,去年有效的特征今年可能失效,新增的数据源也可能带来意想不到的信号。我自己的体会是,保持数据的干净和日志的完整,比追求模型的复杂度更重要。把每一步都记录到能复盘的粒度,你就能在一次次的迭代中慢慢前进。希望这篇能帮你少走一些弯路。