1. 从信号到决策:AI在量化交易里到底改变了什么
聊到AI重塑量化交易,很多人第一反应是“用深度学习预测股价”,这个理解不能说错,但太窄了。我在实际做策略研究和工程落地的过程中,越来越清晰地感受到:AI对量化交易的改造,真正的主战场不在“预测得更准”,而在从数据到信号、从信号到仓位、从仓位到风控这条链路上,每一个环节的决策方式都在被重新定义。
传统量化策略的典型结构是:人工构造因子(比如动量、波动率、换手率),线性加权或树模型组合,设定固定阈值触发交易。这套东西在2015年前后非常有效,因为市场参与者结构相对简单,因子拥挤度低。但到了2024年之后,情况完全变了。我实测过一组经典的多因子策略,在2020年还能做到年化夏普1.8左右,到了2024年同样的因子组合夏普掉到0.6以下,回撤还放大了。原因不复杂——大家都在用类似的因子,超额收益被迅速抹平。
AI的介入,本质上是把“人工找规律”变成“模型自己找规律”。这里的关键跃迁有三个:
第一,表征学习替代人工因子。Transformer这类架构最擅长的就是从原始序列里自动提取特征。你不需要再手动定义“过去20天收益率的标准差”这种因子,模型会从价格、成交量、订单簿快照里自己学出更有信息量的表示。我试过用一个小型Transformer编码器直接吃tick级数据,输出的embedding拿去做简单的线性分类,效果比手工因子+LightGBM的组合在短周期预测上提升了约15%的IC。
第二,序列建模能力质变。金融时间序列的难点在于长程依赖和非平稳性。LSTM时代我们已经在做序列建模,但LSTM对长序列的遗忘问题很严重,而且训练不稳定。Transformer的自注意力机制天然适合捕捉跨时间步的关联,尤其是当你想同时建模多个资产之间的联动关系时,它的优势非常明显。
第三,决策过程从规则驱动转向学习驱动。强化学习在量化里的应用,最直接的价值不是预测价格,而是学习“在什么状态下该拿多少仓位”。这比预测价格再映射到仓位要合理得多,因为仓位决策本身就是一个序贯决策问题,和RL的框架天然匹配。
注意:AI不是万能药。我见过太多团队一上来就搞端到端深度学习,结果连基本的交易成本都没算清楚,回测夏普3.0,实盘直接亏穿。AI是工具,不是替代品。
2. 核心技术拆解:Transformer、LLM与强化学习各自的位置
2.1 Transformer在量化信号提取中的真实用法
Transformer在量化里的应用,目前我看到的主要有三种形态。
第一种是纯预测型。把过去N根K线的OHLCV数据当成序列输入,输出下一根K线的涨跌概率或收益率预测。这种用法最直观,但坑也最多。金融数据信噪比极低,Transformer参数量大,很容易过拟合。我的经验是:模型要小、正则要强、数据要够。一个2层、4头、隐藏维度64的小Transformer,在百万级样本上训练,效果往往比12层的大模型好。原因很简单——金融数据里的有效模式有限,大模型学到的很多是噪声。
第二种是表征型。不直接预测价格,而是用Transformer学一个资产的embedding,然后把这个embedding喂给下游的轻量模型做分类或回归。这种做法的好处是解耦了“学表示”和“做决策”,训练更稳定。我通常会用对比学习的方式训练这个编码器:让同一资产在相近时间窗口的embedding靠近,不同资产或相隔较远的窗口的embedding远离。训练完之后,这个编码器可以复用到多个下游任务。
第三种是混合型。Transformer负责提取时序特征,和手工因子拼接后一起输入树模型。这种“深度+浅度”的混合方案在实际生产中最常见,因为纯深度模型的可解释性太差,风控和合规部门很难接受。混合方案至少能说清楚“模型用了哪些手工因子,深度部分贡献了多少”。
具体到实现层面,有几个参数需要特别注意:
| 参数 | 建议范围 | 原因 |
|---|---|---|
| 序列长度 | 60-120 | 太短捕捉不到中期模式,太长引入过多噪声 |
| 注意力头数 | 4-8 | 金融数据维度低,头数多了浪费 |
| 隐藏维度 | 64-128 | 超过128几乎必然过拟合 |
| Dropout | 0.1-0.3 | 金融数据必须强正则 |
| 学习率 | 1e-4到1e-3 | 配合warmup使用 |
我踩过的一个坑是:一开始用标准Transformer的绝对位置编码,结果模型对时间步的绝对位置产生了依赖,换一个时间窗口就失效。后来改成相对位置编码或者可学习的位置编码,泛化能力明显提升。这个细节在很多教程里不会讲,但实际做的时候非常关键。
2.2 LLM在量化中的角色:不是预测,是理解和编排
LLM在量化交易里的应用,很多人第一反应是“让GPT预测股价”,这完全是方向错了。LLM的核心能力是语言理解、信息抽取和流程编排,不是数值预测。
我目前看到LLM在量化里真正有价值的场景有这么几个:
研报和公告的自动化解析。每天有大量的上市公司公告、券商研报、行业新闻,人工读根本读不过来。用LLM做信息抽取,把非结构化文本变成结构化的因子信号,这个方向非常实用。比如财报发布后,LLM可以快速提取营收增速、毛利率变化、管理层指引等关键信息,转换成数值后输入策略。我实测过用LLM做财报情感分析,和人工标注的相关系数能到0.85以上,远超传统词典方法。
策略逻辑的代码生成与审查。这个方向最近一年进展很快。你可以用自然语言描述一个策略逻辑,让LLM生成对应的Python代码,然后人工审查和修改。虽然不能完全替代人工,但能大幅提升原型开发效率。我自己的做法是:LLM生成初版代码,我重点检查边界条件、交易成本计算和风控逻辑,通常能节省60%以上的编码时间。
多智能体协作做策略研究。这个是比较前沿的方向。让不同的LLM智能体分别扮演“因子研究员”“风控经理”“组合优化师”,互相辩论和审查,最后输出一个综合方案。这种做法的好处是能引入多视角的批判性思考,避免单一模型的盲区。不过目前还处于实验阶段,实盘应用需要非常谨慎。
提示:LLM的输出必须经过严格验证。我见过LLM生成的策略代码里,把交易成本设成了0,回测曲线漂亮得不像话,实盘直接亏光。任何LLM生成的内容,都要用独立的数据和逻辑去交叉验证。
2.3 强化学习:从“预测价格”到“学习仓位”
强化学习在量化交易里的定位,我认为是最被低估的。很多人把RL当成另一种预测工具,这是误解。RL的核心是序贯决策——在什么市场状态下,应该采取什么仓位动作,以最大化长期收益。
量化交易天然就是一个RL问题:状态是市场行情和当前持仓,动作是买入/卖出/持有及仓位大小,奖励是扣除交易成本后的收益。用RL来做仓位管理,比“预测价格再映射到仓位”要合理得多。
但RL在金融场景里有几个特殊难点:
奖励稀疏且噪声大。金融市场每天的收益波动很大,单步奖励的信号很弱。解决办法是用n步回报或者引入辅助任务(比如同时预测波动率)来增强学习信号。
非平稳性。市场规律会变,昨天有效的策略今天可能失效。标准的RL假设环境是平稳的,这在金融里不成立。应对方法包括:定期重新训练、使用元学习让模型快速适应新环境、或者在状态里显式加入市场 regime 的标识。
离线数据的问题。金融数据是离线采集的,不能像游戏那样无限试错。离线强化学习(Offline RL)在量化里比在线RL更实用。IQL、CQL这些离线RL算法,我在实际项目里用过,效果比在线RL稳定得多,因为不需要和环境交互,直接从未策略数据里学。
我自己的经验是:RL适合做仓位管理和执行优化,不适合做方向预测。让RL决定“现在该拿多少仓位”,比让它决定“明天涨还是跌”要靠谱得多。执行优化方面,RL可以学习如何在最小化市场冲击的前提下完成大单拆分,这个场景的奖励信号清晰,效果很好。
3. 从研究到实盘:一套可复现的AI量化流水线
3.1 数据层:比模型更重要的基础设施
做了这么多年量化,我越来越觉得:数据质量决定策略上限,模型只是逼近这个上限。AI模型对数据的敏感度比传统模型更高,因为参数量大,更容易学到数据里的偏差。
数据层要解决的核心问题有三个:
第一,时间对齐。不同数据源的时间戳精度不同,tick数据是毫秒级,财务数据是季度级,新闻是事件级。做多模态融合时,必须统一到同一个时间轴上。我的做法是:以交易时间为基准,把所有其他数据用“最近可用值”的方式对齐,同时记录每个数据点的实际时间戳,避免未来函数。
第二,缺失值处理。金融数据缺失很常见,停牌、涨跌停、数据源故障都会导致缺失。简单填充均值会引入偏差,我的做法是:对于价格类数据,用前向填充;对于成交量类数据,缺失时置零并加一个缺失标记位;对于财务数据,用行业均值填充并加标记。关键是让模型知道哪些值是填充的,而不是假装数据完整。
第三,标准化。金融数据的分布随时间变化,用全局均值和方差做标准化会引入未来信息。正确做法是滚动标准化:用过去N天的均值和方差来标准化当前值。N的选择很关键,太短则标准化不稳定,太长则无法适应市场变化。我通常用60-120个交易日。
# 滚动标准化的一个实现示例 def rolling_zscore(series, window=60): mean = series.rolling(window).mean() std = series.rolling(window).std() return (series - mean) / (std + 1e-8)这个函数看起来简单,但实际用的时候要注意:window内的数据不能包含未来信息,所以必须用rolling而不是expanding。另外std要加一个极小值防止除零。
3.2 特征工程:AI时代还需要人工因子吗
这个问题我被问过很多次。我的答案是:需要,但角色变了。人工因子从“主要信号来源”变成了“先验知识注入”和“模型可解释性的锚点”。
具体来说,人工因子在AI量化里有三个作用:
一是作为模型的输入之一。纯端到端学习在金融数据上很容易过拟合,加入人工因子相当于给模型一个“起点”,让它在这个基础上做微调。我通常会把人工因子和Transformer提取的embedding拼接在一起,输入下游模型。
二是用于风控和归因。深度模型是个黑盒,出了问题时很难排查。但如果模型里有一部分是人工因子,至少能知道“这次亏损有多少来自动量因子的暴露”。这对合规和风控非常重要。
三是用于模型诊断。如果深度模型的输出和人工因子的相关性突然变得很高,说明模型可能退化了,需要检查。如果相关性突然变低,说明市场结构可能发生了变化。
我常用的人工因子类别包括:动量类(过去N天收益率)、波动率类(已实现波动率、Parkinson波动率)、流动性类(换手率、Amihud非流动性)、微观结构类(买卖价差、订单不平衡)。这些因子不需要很复杂,关键是逻辑清晰、计算透明。
3.3 模型训练:从过拟合到泛化的实战经验
AI量化模型最大的敌人是过拟合。我见过太多回测夏普3.0、实盘夏普-1.0的案例。避免过拟合,我的经验可以总结为“三多三少”:
多验证、少调参。不要盯着回测曲线调参数,要用样本外数据做验证。我的做法是:把数据分成训练集、验证集、测试集,比例大概是6:2:2。验证集用于早停和超参数选择,测试集只在最后用一次。如果测试集效果不好,不要回头调参,直接重新设计。
多正则、少容量。金融数据信噪比低,模型容量要严格控制。Dropout、权重衰减、早停这些手段都要用上。我通常会把模型参数量控制在数据量的1/10以下,宁可欠拟合也不要过拟合。
多集成、少单模。单个模型很容易在某个市场状态下失效,集成多个模型能显著提升稳定性。集成的维度包括:不同架构(Transformer+LSTM+树模型)、不同数据窗口(短周期+长周期)、不同随机种子。我实测过,5个模型的简单平均,夏普比单模型高0.3-0.5。
还有一个容易被忽视的点:训练数据的采样方式。金融数据时间序列高度相关,随机采样会导致训练集和验证集的信息泄露。正确做法是按时间顺序划分,或者用purged cross-validation(在训练集和验证集之间留一个gap,避免边界处的信息泄露)。
3.4 回测与实盘:那些回测不会告诉你的坑
回测和实盘的差距,是量化交易里最昂贵的教训。我总结了几条血泪经验:
交易成本要算足。回测里设0.1%的手续费,实盘可能因为滑点变成0.3%。我的做法是:回测时用保守的成本假设(比如实际预期的1.5倍),如果策略在这个成本下还能盈利,实盘才可能赚钱。
流动性约束要建模。回测里假设你可以无限量成交,实盘里大单会冲击市场。对于小资金策略影响不大,但资金量上去之后,必须建模市场冲击。简单的做法是:限制单笔交易量不超过当日成交量的1%,超过部分按比例分摊到后续交易日。
停牌和涨跌停要处理。A股有涨跌停制度,回测里如果不处理,会在涨跌停日产生虚假成交。我的做法是:涨跌停日不允许开仓,已有仓位可以平仓但不能加仓。
幸存者偏差要消除。回测时用的股票池必须是当时可交易的股票,不能用现在的成分股回溯。这个坑很多人踩过,尤其是做指数增强策略时。
注意:回测夏普超过2的策略,实盘大概率达不到。我个人的经验是,实盘夏普大约是回测夏普的50%-70%,回撤大约是回测的1.5-2倍。做资金规划时一定要留足安全边际。
4. 常见问题与排查技巧实录
4.1 模型不收敛或loss震荡怎么办
这是训练深度量化模型时最常见的问题。排查思路按优先级排列:
先检查数据。90%的训练问题出在数据上。检查有没有NaN、inf、极端值。金融数据里偶尔会出现价格错误(比如小数点错位),这些异常值会毁掉整个训练。我的做法是:训练前对每个特征做winsorize(缩尾处理),把超过3倍标准差的値截断。
再检查学习率。学习率太大会导致loss震荡,太小会导致收敛慢。建议用学习率warmup:前10%的step线性增加学习率,之后余弦衰减。这个策略在Transformer上尤其有效。
然后检查batch size。金融数据噪声大,batch size太小会导致梯度估计不准。我通常用256-1024的batch size。如果显存不够,用梯度累积模拟大batch。
最后检查模型结构。如果以上都没问题,可能是模型太深或太宽。试着减少层数或隐藏维度,加更强的Dropout。
4.2 回测很好但实盘亏损的排查清单
这个问题我遇到过不止一次,排查流程如下:
| 排查项 | 检查方法 | 常见问题 |
|---|---|---|
| 未来函数 | 检查特征计算是否用了未来数据 | rolling窗口包含了当前时刻之后的数据 |
| 交易成本 | 对比回测和实盘的成本假设 | 回测成本设得太低 |
| 流动性 | 检查大单成交假设 | 回测假设无限流动性 |
| 幸存者偏差 | 检查股票池是否动态 | 用了当前成分股回溯 |
| 过拟合 | 检查样本外表现 | 测试集效果远差于训练集 |
| 执行延迟 | 对比信号时间和成交时间 | 回测假设即时成交 |
我的经验是:先查未来函数,再查成本,最后查过拟合。未来函数是最隐蔽也最致命的,一个小的未来函数能让回测夏普翻倍。
4.3 LLM辅助策略开发的注意事项
用LLM辅助写策略代码,有几个坑必须注意:
代码正确性验证。LLM生成的代码看起来往往很合理,但细节可能有问题。我通常会写单元测试来验证关键函数,尤其是涉及时间对齐、成本计算、仓位管理的部分。
逻辑一致性检查。LLM可能会在代码里引入和策略逻辑不一致的地方。比如你说“用过去20天动量”,它可能写成“过去20个交易日但包含当天”。这种细节必须人工审查。
数据泄露防范。LLM生成的代码可能无意中引入未来函数。我通常会让LLM生成代码后,再用另一个LLM或者人工专门检查数据泄露问题。
版本管理。LLM生成的代码要纳入版本管理,每次修改都要记录。我见过团队直接用LLM生成的代码上线,出了问题找不到是哪个版本,这是非常危险的。
4.4 强化学习训练不稳定的应对策略
RL在金融场景里训练不稳定是常态。我的应对策略包括:
奖励归一化。金融收益的尺度变化很大,直接用作奖励会导致训练不稳定。我通常会对奖励做滚动标准化,或者用夏普比率作为奖励。
动作空间离散化。连续动作空间在金融里很难训练。我通常把仓位离散化成几档(比如0%、25%、50%、75%、100%),这样训练稳定得多。
经验回放要小心。金融数据非平稳,旧的经验可能已经失效。我通常用优先经验回放,并且限制回放缓冲区的最大长度,确保只保留最近的数据。
定期重新训练。市场结构会变,RL策略需要定期重新训练。我通常每季度重新训练一次,或者当策略回撤超过阈值时触发重新训练。
5. 工程落地:从研究代码到生产系统的距离
5.1 研究环境和生产环境的差异
研究环境里,你用的是Jupyter Notebook,数据在内存里,模型训练一次跑几个小时。生产环境里,你需要低延迟的数据流、稳定的模型推理、实时的风控检查。这两者之间的差距,比很多人想象的大得多。
我见过太多团队,研究代码写得漂亮,但工程化时发现根本跑不起来。核心问题在于:研究代码关注的是“能不能跑出结果”,生产代码关注的是“能不能稳定跑、出问题能不能快速定位”。
工程化的关键改造包括:
数据流从批处理变成流处理。研究时用历史数据回测,生产时需要实时接收行情数据。这要求数据管道从“读文件”变成“订阅消息队列”,延迟从分钟级降到毫秒级。
模型推理从离线变成在线。研究时模型可以慢慢跑,生产时必须在毫秒级完成推理。这要求模型压缩(量化、剪枝)和推理优化(ONNX、TensorRT)。
风控从回测变成实时。研究时风控是事后检查,生产时风控是事前拦截。每一笔订单在发出前都要经过风控检查,包括仓位限制、单笔限额、日内亏损限额等。
5.2 模型部署的几种方案对比
| 方案 | 延迟 | 灵活性 | 适用场景 |
|---|---|---|---|
| Python进程内推理 | 中 | 高 | 中低频策略 |
| ONNX Runtime | 低 | 中 | 中高频策略 |
| TensorRT | 极低 | 低 | 高频策略 |
| 专用推理服务 | 低 | 高 | 多策略共享 |
我的建议是:中低频策略用Python进程内推理就够了,简单直接,调试方便。高频策略才需要上TensorRT这类专用推理引擎。不要为了追求低延迟而过度工程化,维护成本会很高。
5.3 监控与告警:实盘运行的保命机制
实盘运行最怕的是“模型悄悄失效了但没人发现”。监控体系要覆盖三个层面:
数据层监控。检查数据是否正常到达、是否有异常值、分布是否发生漂移。我通常会计算每个特征的滚动均值和方差,和训练时的分布对比,偏差超过阈值就告警。
模型层监控。检查模型输出的分布是否正常、预测IC是否下降、换手率是否异常。如果模型输出的分布突然变化,说明市场结构可能变了,需要人工介入。
交易层监控。检查成交率、滑点、持仓是否符合预期。如果实际滑点远大于回测假设,说明流动性假设有问题,需要调整策略。
提示:告警阈值不要设得太敏感,否则会被误报淹没。我的经验是:数据层告警用3倍标准差,模型层告警用滚动20天的IC均值下降超过50%,交易层告警用实际滑点超过假设的2倍。
6. 我对AI量化未来两年的一些判断
6.1 技术层面:多模态融合和因果推断
未来两年,我认为AI量化最大的技术增量来自两个方向。
多模态融合。现在的量化模型主要用价格和成交量数据,但市场上还有大量文本、图像、另类数据没有被充分利用。LLM的发展让文本数据的处理成本大幅下降,卫星图像、供应链数据这些另类数据的获取成本也在降低。把多模态数据融合进量化模型,是下一个明显的增量。
因果推断。现在的深度学习模型学的是相关性,不是因果性。但交易决策需要的是因果性——如果A发生,B会怎样。因果推断工具(如DoWhy、EconML)和强化学习的结合,是一个很有前景的方向。把因果结构嵌入RL,能让策略在分布外更稳健。
6.2 市场层面:策略拥挤和超额收益衰减
AI工具的普及,意味着策略拥挤会加剧。以前只有头部机构能做的AI策略,现在中小团队甚至个人都能做。这会导致两个后果:
一是因子衰减加速。任何有效的因子,被足够多的人使用后都会失效。AI让因子的发现和传播速度都加快了,衰减自然也更快。
二是市场波动结构变化。当大量策略使用相似的AI模型时,市场可能会出现新的波动模式。比如多个策略同时触发止损,会导致流动性瞬间枯竭。这种“策略共振”风险,是未来需要重点关注的问题。
6.3 个人和小团队的机会在哪里
大机构有数据、算力和人才优势,个人和小团队的机会在哪里?我的判断是:
细分市场和另类数据。大机构看不上或者覆盖不到的市场,比如小市值股票、可转债、期权组合,个人和小团队有机会。另类数据的获取和处理,也是大机构不一定做得好的地方。
策略的快速迭代。小团队的优势是灵活,能快速试错和迭代。用LLM辅助策略开发,能进一步放大这个优势。
工程效率。小团队不需要复杂的工程架构,用简单的工具链快速上线,把精力集中在策略本身。我见过太多小团队花大量时间搭基础设施,结果策略没时间研究,这是本末倒置。
我个人在实际操作中的体会是:AI是放大器,不是替代品。它放大你的研究能力、工程能力和风控能力,但如果你本身的研究框架有问题,AI只会让你更快地亏钱。先把基础打牢,再用AI加速,这个顺序不能反。
最后分享一个小技巧:每次上线新策略前,先用历史数据做一次“压力测试”——把策略放在2008年、2015年、2020年这些极端行情里跑一遍,看看最大回撤和恢复时间。如果策略在这些时期表现很差,说明它对市场 regime 的依赖太强,需要加风控或者重新设计。这个测试花不了多少时间,但能避免很多实盘上的意外。