做A股量化一段时间后你会发现真正决定策略能不能活下来的往往不是模型本身有多高级而是特征怎么构造、信号怎么合成、实盘链路怎么打通。这篇是系列的下篇重点聊特征工程和大模型决策落地的完整路线。如果你还在纠结该怎么把AI塞进策略里或者刚跑通一个demo却不知道怎么转到实盘这篇文章应该能帮你少踩几个坑。先说一个观点不要把大模型当成涨跌预测器而是要把它放在决策链路上一个更合适的位置。特征工程负责把行情和基本面变成模型吃得到的信号大模型负责解读非结构化信息最后还要有一套风控和回测机制把这一切约束住。下面我从头到尾拆一遍。1. 特征工程不是越多越好先解决对齐再做截面最后才是算法1.1 数据对齐是第一步做不好后面全白搭很多刚开始做量化的朋友拿到的第一份数据就是一张带股票的日线表日期、开盘、收盘、最高、最低、成交量、成交额、复权因子。看起来没问题但真开始做特征时第一个拦路虎往往不是指标难算而是数据根本对不齐。A股的数据有几个奇怪的特性有停牌、有涨停跌停、有上市首日不设涨跌幅、有ST股风险警示。如果你直接用原始表做滚动窗口计算某只股票停牌几天后复牌你的移动均线会被拉出奇怪的折线而且这部分数据在回测里会产生巨大的偏差。更麻烦的是不同数据源的复权方式还不一样前复权、后复权、不复权直接决定你的收益率计算准不准。我自己的习惯是先固定一套清洗流程把数据统一成一张主表 多个映射表的格式。所谓主表是每个交易日、每只股票一行包含价格和成交量的核心列映射表则是多维度的标签信息比如行业分类、是否ST、上市天数、市值区间等等。这样做的目的是让后续每一个特征计算都在同一个时间轴上做避免因为停牌、新股、ST状态导致面板数据出现缺失或错位。实际处理的时候一个很容易被忽略的点是交易日历。A股有节假日调休有非交易日的行情快照比如有些数据商在周末也会推一次静态数据。如果你直接用自然日去shift回测里会出现时间错位看起来信号很准其实是把未来信息泄露进去了。所以所有特征计算都应该是基于交易日序号而非自然日序号。1.2 技术指标批量生成时的未来函数陷阱技术指标是特征工程里最常写的一块均线、MACD、RSI、布林带一堆库都能算。但问题来了很多人在计算时默认把当天的收盘价纳入指标然后同一天就用这个指标去下单这在回测里看似没问题实盘里却完全做不到。举一个最简单的例子你计算5日均线如果5日均线包含今天收盘那你在盘中或者开盘时根本不知道今天的收盘价除非你假设用的是截至昨天的均线。这就是典型的未来函数问题。回测用起来利润很高实盘一上线就会立刻崩掉。避免的办法很朴素任何用到当前周期收盘价的特征在下单信号产生前都至少往后推一天。也就是说T日收盘后计算的信号最早只能在T1日开盘后执行。这一点需要在特征计算的框架层面设计好而不是在每个因子里分别注意。我们常用的做法是在特征生成的入口统一传入一个截止日期参数所有指标计算只跑截止到该日期超出部分一律预测期屏蔽。另外一个坑是指标的参数冗余。你一口气写五十个均线组合每个参数都很接近算出来的特征相关性极高。起初看不出来但后续做特征筛选的时候你会发现一半以上的特征都在说同一件事真正独立的信息很少。所以我的建议是技术指标类特征在前期不需要贪多先把最经典的那批做干净比如动量类不同窗口的收益率、乖离率波动类ATR、历史波动率、振幅量价配合类量比、资金流向估计、换手率均值回归类RSI、布林位置、Z-score趋势类均线多头排列程度、MACD柱变化另外要提醒一下在A股里换手率、市值、波动率这些量价特征往往比单纯的技术指标更有预测力因为市场里的散户比例高情绪化特征明显。别只顾着算指标而忘了把流动性和市值维度加进来。1.3 截面特征排名、分位与行业中性化时间序列特征算完之后只是第一步。真正的建模优势来自截面特征——也就是同一时刻这只股票相对于整个市场、相对于同行业处于什么位置。比如你算出一只股票的5日涨跌幅是8%单看这个数字说明不了什么。但如果你知道整个市场的5日涨幅中位数是9%而这只股票所在的行业5日平均涨幅是6%那就有了相对信息它跑赢了大盘但跑输了自己的板块。这种相对强弱关系在A股风格切换极快的环境里往往比绝对值更有用。截面特征最常见的方法是排名和分位数。我一般会把每个时间序列特征都做一次当日横截面的百分位排名用0到1之间的数值替换原始值。这样处理之后不同时期、不同股票之间就有了可比性模型也不用自己去适应市场整体的涨跌。行业中性化是另一件必须做的事。A股的行业分类有很多套标准直接用某个分类即可关键是让每个特征在行业内再次做去均值处理。为什么一定要做行业中性化因为行业本身的影响太大了某某板块集体大涨的时候如果模型只是靠它属于热门行业这个信息得分那一旦行业轮动你辛苦训练出来的模型就失效了。中性化之后模型更多看到的是公司在行业内相对强弱颗粒度更细也更稳健。这里插一句做截面排名和中性化的数据是快照概念。例如在T日收盘后我们只能使用截至T日的全市场横截面数据绝对不能混入T1日的信息。快照程序的稳定性直接影响特征质量。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股市场本身就在变化去年有效的特征今年可能失效新增的数据源也可能带来意想不到的信号。我自己的体会是保持数据的干净和日志的完整比追求模型的复杂度更重要。把每一步都记录到能复盘的粒度你就能在一次次的迭代中慢慢前进。希望这篇能帮你少走一些弯路。