1. 从信号到决策:AI在量化交易里到底替换了哪一环
很多人第一次听到"AI量化",脑子里浮现的画面是模型自己盯着K线,然后自动下单赚钱。这个想象和实际工程差得挺远。我在过去几年里接触过几个把机器学习塞进交易流程的团队,真正落地的做法,几乎都不是让AI去"预测涨跌",而是让它替换掉传统量化流水线里那几个最吃人力、最依赖人工拍脑袋的环节。
传统量化策略的骨架大致是:数据清洗 → 因子构造 → 信号生成 → 组合优化 → 风控 → 执行。这条链上,因子构造和信号生成长期靠人写规则,比如"20日均线上穿60日均线就做多"。规则的好处是可解释、可回测,坏处是市场结构一变,规则就失效,而且人能想到的规则组合数量有限。AI切入的第一个位置,就是用模型自动从原始数据里学出非线性关系,替代手工因子。Transformer这类结构之所以被反复提起,核心原因是它对长序列、多变量、跨市场的数据有天然的建模优势——价格序列、订单簿快照、宏观指标、新闻情绪,这些本质上是不同模态的时间序列,而注意力机制恰好擅长在它们之间找关联。
第二个被替换的环节是执行。大单直接砸进市场会滑点,传统做法是TWAP、VWAP这类规则拆单。强化学习在这里的价值是把"拆单"变成一个序贯决策问题:每一步根据当前盘口状态决定下一笔下多少、挂还是吃。这类问题用监督学习做不了,因为不存在"标准答案",只有"这个动作在长期看划不划算",这正是强化学习的适用场景。
第三个环节是风控与异常检测。市场里真正致命的往往不是常规波动,而是流动性骤降、相关性突变这类尾部事件。传统风控靠阈值,阈值是静态的,AI模型可以学出动态的正常边界,提前给出预警。
所以理解AI量化,先要扔掉"AI预测价格"这个执念。它更像是一套把人的经验固化成可学习、可迭代的模型的工程体系。下面我按数据、模型、强化学习决策、工程落地、风险边界这几块,把每个环节的真实做法和坑讲清楚。
2. 数据层:量化里最不性感但最决定生死的一步
2.1 为什么量化团队80%的时间花在数据上
我见过太多人一上来就研究模型结构,结果回测曲线漂亮得不像话,一上实盘就崩。十有八九问题出在数据。量化里的数据有几个特殊性质,和做CV、NLP完全不是一回事。
第一是时序泄漏。做图像分类,训练集和测试集打乱没关系;做时间序列,你绝对不能用到未来信息。举个具体的坑:你用"当日收盘价"构造了一个因子,然后拿它去预测"当日收益率",回测当然准,因为收盘价里已经包含了当天的涨跌。正确做法是所有特征在决策时点必须只依赖该时点之前的数据,这叫point-in-time数据。很多开源数据集是"修正后"的,比如财报数据会事后调整,你拿到的历史财报和当时真实披露的可能不一样,这种数据直接喂给模型就是灾难。
第二是幸存者偏差。你从今天的股票池里选历史数据回测,那些已经退市、被并购的票根本不在池子里,而它们当年恰恰可能是表现最差的。正确做法是使用包含退市标的的历史成分股数据。
第三是复权与对齐。不同数据源的复权方式不同,分钟级和日级数据的时间戳对齐规则不同,处理不好会产生大量虚假信号。
2.2 特征工程在AI时代反而更重要了
有一种误解是"有了大模型就不需要特征工程了"。在量化里恰恰相反。原始价格序列信噪比极低,直接丢给模型,模型大概率学到的是噪声。真正有效的做法是把领域知识编码成特征,再让模型去学特征之间的高阶交互。
常见的特征类别可以这样组织:
| 特征类别 | 具体例子 | 建模意图 |
|---|---|---|
| 价量特征 | 收益率、波动率、换手率、量价背离 | 刻画市场微观状态 |
| 订单簿特征 | 买卖盘不平衡、挂单撤单速率 | 捕捉短期供需失衡 |
| 横截面特征 | 行业内排名、市值分组 | 消除市场beta,提取alpha |
| 另类特征 | 新闻情绪、搜索热度、供应链关系 | 引入价格之外的信息源 |
这里有个实操心得:特征做标准化时,一定要用滚动窗口而不是全样本。用全样本算均值和方差,等于把未来信息泄漏进了历史。正确做法是每个时点只用过去N天的数据算统计量,这个细节不注意,回测和实盘的差距会大到让你怀疑人生。
2.3 数据管道的工程细节
数据管道要解决三个问题:采集、存储、版本管理。采集层面,行情数据有快照和逐笔两种,逐笔数据量大但信息全,快照数据量小但会丢细节。存储层面,时序数据用列式存储(比如Parquet)比关系型数据库高效得多,因为量化查询几乎都是"取某段时间某几个字段",列存只读需要的列。
版本管理是最容易被忽视的。模型迭代时,你必须能回答"这个模型是用哪一版数据训练的"。建议给每次数据清洗产出一个哈希标识,训练时记录这个标识。我踩过的坑是:某次清洗逻辑改了,但没记录,导致两个模型对比时根本分不清差异来自模型还是数据,白白浪费一周。
3. Transformer进量化:它擅长什么,又在哪儿翻车
3.1 注意力机制为什么适配金融时序
Transformer的核心是自注意力:序列里每个位置都能直接"看到"其他所有位置,并计算权重。放到金融场景,这意味着模型可以自动学出"今天的价格和20天前的某个事件相关"这种长程依赖。传统RNN类模型在长序列上会梯度消失,注意力机制绕过了这个问题。
但金融时序和自然语言有个本质区别:语言有语法结构,金融序列没有。一句话里词序变了意思就变了,但价格序列里"先涨后跌"和"先跌后涨"在统计上可能没多大区别。所以直接把NLP里的Transformer搬过来,效果往往一般。真正有效的改造通常包括:
- 位置编码要慎用。标准正弦位置编码假设序列有固定顺序语义,金融里更常用可学习的位置嵌入,或者干脆弱化位置信息,强调数值本身。
- 输入要包含多尺度信息。单一时间粒度的序列信息有限,实践中常把1分钟、5分钟、日线多个粒度的特征拼接后输入。
- 输出头要贴合任务。预测收益率分布比预测点值更有用,因为交易决策需要的是"不确定性有多大",而不只是"涨还是跌"。
3.2 一个可复现的简化实现思路
下面这段是骨架代码,展示如何把一个多变量价格序列喂给Transformer做特征提取。注意这里只是结构示意,真实场景要接数据管道和风控。
import torch import torch.nn as nn class QuantTransformer(nn.Module): def __init__(self, n_features, d_model=64, nhead=4, num_layers=2, seq_len=60): super().__init__() # 把原始特征投影到模型维度 self.input_proj = nn.Linear(n_features, d_model) # 可学习位置嵌入,比正弦编码更适合金融序列 self.pos_embed = nn.Parameter(torch.randn(1, seq_len, d_model) * 0.02) encoder_layer = nn.TransformerEncoderLayer( d_model=d_model, nhead=nhead, dim_feedforward=d_model * 4, dropout=0.1, batch_first=True ) self.encoder = nn.TransformerEncoder(encoder_layer, num_layers=num_layers) # 输出头:预测未来收益的均值和方差 self.head = nn.Linear(d_model, 2) def forward(self, x): # x: (batch, seq_len, n_features) h = self.input_proj(x) + self.pos_embed h = self.encoder(h) # 取最后一个时间步的表示做预测 out = self.head(h[:, -1, :]) return out[:, 0], out[:, 1] # mean, log_var训练时用高斯负对数似然损失,让模型同时学均值和不确定性:
def gaussian_nll(mu, log_var, target): # 预测分布,而不是点值 return 0.5 * (log_var + (target - mu) ** 2 / torch.exp(log_var)).mean()这个设计的意图是:交易决策不只需要方向,还需要置信度。方差大的时候仓位就该小,这是把不确定性显式建模出来的好处。
3.3 过拟合:量化里Transformer最大的敌人
金融数据信噪比极低,而Transformer参数量大,天生容易过拟合。我见过一个团队用几百万参数的模型去拟合三年的日频数据,训练集loss降到极低,验证集完全没规律。这不是模型不行,是数据量根本撑不起这个容量。
对抗过拟合的实操手段,按有效性排序:
- 降低模型容量。先用小模型(一两层、几十维)跑通,确认有信号再加容量。很多情况下小模型效果不比大模型差。
- 强正则。Dropout、权重衰减、早停都要上,早停的耐心值设小一点。
- 数据增强。金融里常用的有加噪声、时间扭曲、多市场数据混合。但要注意增强不能破坏时序因果性。
- 滚动训练。不要用全历史训练一个模型,而是滚动窗口训练,让模型适应市场状态变化。
注意:验证集必须按时间切分,不能随机切分。随机切分会让相邻日期的样本同时出现在训练和验证集里,造成严重的信息泄漏,验证指标虚高。
4. 强化学习做交易决策:从"预测"到"行动"的跨越
4.1 为什么交易天然是强化学习问题
监督学习回答的是"明天涨还是跌",但交易真正要回答的是"现在这个仓位该加还是该减"。这两个问题不一样。前者是预测,后者是决策,而决策要考虑:当前持仓、交易成本、未来可能的路径、风险约束。这正是马尔可夫决策过程(MDP)的框架:状态是市场+持仓,动作是买卖,奖励是风险调整后收益。
强化学习相比监督学习的优势在于,它直接优化"长期累积收益"这个目标,而不是优化预测准确率。预测准不等于赚钱,因为预测对了但仓位下错、或者交易成本吃掉了利润,照样亏。强化学习把交易成本、滑点都放进奖励函数里,学出来的策略天然考虑这些。
4.2 离线强化学习为什么是量化的主流选择
在线强化学习需要智能体不断和环境交互试错,但金融市场不能让你随便试——每次试错都是真金白银。所以量化里主流是离线强化学习:从历史数据里学策略,不与环境实时交互。
离线强化学习有个核心难题叫分布偏移:历史数据是用某个旧策略产生的,你学出来的新策略可能跑到数据没覆盖的状态区域,然后做出离谱决策。解决这个问题的算法思路大致分两类:
- 保守类:对没见过的动作保守估计其价值,代表是CQL(Conservative Q-Learning)。核心思想是在价值函数上惩罚那些数据里少见的动作,避免高估。
- 约束类:限制新策略不能偏离行为策略太远,代表是BCQ、TD3+BC。
因果强化学习(CRL)是近两年被讨论较多的方向,思路是把因果推断工具嵌进强化学习流程,区分"相关"和"因果"。在金融里这个区分很重要:两个因子同时涨,不代表一个导致另一个,可能都是被第三个因素驱动。如果模型学错了因果结构,市场环境一变,策略就失效。CRL试图让模型学到更稳健的因果机制,而不是表面的统计相关。
4.3 奖励函数设计:决定策略性格的地方
强化学习里,奖励函数怎么设计,直接决定学出来的策略是什么性格。常见的几种设计:
| 奖励设计 | 表达式思路 | 策略性格 |
|---|---|---|
| 绝对收益 | 期末净值变化 | 激进,可能重仓 |
| 夏普比率 | 收益/波动 | 稳健,控制回撤 |
| 带成本收益 | 收益 - 交易成本 | 换手低,偏长期 |
| 回撤惩罚 | 收益 - λ·最大回撤 | 保守,尾部保护强 |
我的经验是,奖励函数里一定要显式包含交易成本。否则学出来的策略会疯狂交易,回测里成本设得低看不出来,实盘直接被手续费和滑点吃光。成本项怎么设?用历史成交数据估一个滑点模型,按成交量和盘口深度动态计算,比固定值靠谱得多。
4.4 训练不稳定的排查思路
强化学习训练不稳定是常态,不是异常。遇到loss震荡、策略退化,按这个顺序排查:
- 检查奖励尺度。奖励数值范围太大或太小都会导致训练困难,通常归一化到[-1, 1]附近。
- 检查状态表示。状态里如果有未归一化的特征,网络很难学。
- 降低学习率。强化学习对学习率比监督学习敏感得多。
- 检查数据覆盖。如果历史数据里某些市场状态很少出现,策略在这些状态下就是瞎猜。
- 看价值估计是否发散。如果Q值越来越大,多半是过估计,需要上保守类算法。
5. 大模型与智能体:量化流程里的新角色
5.1 LLM在量化里不是用来预测价格的
把LLM直接用来预测价格,基本是行不通的。LLM的训练目标是预测下一个词,不是预测收益率,它的输出空间和金融决策空间不匹配。但LLM在量化流程里有几个真实有用的位置:
第一,非结构化数据处理。财报、公告、新闻、研报,这些文本信息传统量化很难用,因为要人工读、人工标注。LLM可以批量提取结构化信息,比如"这家公司本季度指引是上调还是下调""管理层对毛利率的表述是乐观还是谨慎"。这些提取出来的信号可以作为特征进入模型。
第二,代码与策略生成。写因子、写回测、写数据清洗脚本,这些工作LLM能大幅提效。但要注意,LLM生成的代码必须经过严格验证,尤其是涉及资金和下单的部分,不能直接信任。
第三,智能体编排。一个完整的量化流程涉及数据、因子、模型、风控、执行多个模块,用智能体框架把这些串起来,让每个模块有独立的决策和容错能力,是当前工程实践的一个方向。这里的"自主容错"指的是:某个数据源断了,智能体能自动切换到备用源;某个模型输出异常,能自动降级到保守策略。
5.2 智能体容错控制的工程要点
构建可靠的AI系统,容错设计比模型精度更重要。几个实操原则:
- 每个模块要有健康检查。数据模块检查数据新鲜度和完整性,模型模块检查输出分布是否偏离历史。
- 降级路径要预先定义。模型挂了用什么兜底?最简单的兜底是"不交易",比乱交易强。
- 决策要有可追溯日志。每一笔交易是哪个模型、哪个版本、基于什么信号做的,都要记录。出问题时这是唯一的排查依据。
- 多模型投票而非单模型独裁。多个模型对同一决策投票,分歧大时降低仓位,这是简单有效的风控。
5.3 LLM作为评判者的用法与陷阱
"LLM as judge"是评估模型输出的常见做法,在量化里可以用来评估策略描述、研报摘要的质量。但有个陷阱:LLM评判有位置偏见和长度偏见,它倾向于给排在前面的、更长的回答高分。用在量化这种对准确性要求极高的场景,必须做校准——用一批人工标注的样本验证LLM评判和人工评判的一致性,一致性不够就不能单独依赖它。
6. 回测到实盘:那道最容易被低估的鸿沟
6.1 回测漂亮实盘崩的典型原因
回测和实盘的差距,几乎每个量化团队都经历过。原因可以归成几类:
前视偏差:用了未来信息。前面讲过的point-in-time问题、标准化用全样本问题,都属于这类。
幸存者偏差:股票池不含退市标的。
交易成本低估:回测里用固定滑点,实盘滑点是动态的,大单冲击成本高得多。
流动性假设:回测假设你想成交就能成交,实盘里冷门标的可能挂半天没人接。
市场冲击:你的策略规模一大,自己的交易就会影响价格,回测里没建模这个反馈。
6.2 一个务实的验证流程
我推荐的验证顺序是:
- 样本外测试。留出最近一段完全没参与训练的数据,只测一次,不要反复调参看结果,否则样本外也变成样本内了。
- 滚动前向验证。用滚动窗口模拟真实交易:用T时刻之前的数据训练,预测T+1,然后窗口前移。这比单次样本外更接近实盘。
- 模拟盘。用实时数据但不下单,跑一段时间,看信号延迟、数据质量、系统稳定性。
- 小资金实盘。用最小可交易资金跑,重点观察实际滑点和回测假设的差距。
每一步都可能发现问题,越往后成本越高,所以顺序不能反。
6.3 实盘监控要看哪些指标
上线不是终点,是起点。实盘监控至少要盯这几类:
| 监控类别 | 关键指标 | 异常含义 |
|---|---|---|
| 策略表现 | 滚动夏普、最大回撤 | 策略失效或市场状态切换 |
| 信号质量 | 信号与收益的相关性 | 因子衰减 |
| 执行质量 | 实际滑点 vs 预期 | 流动性变化或执行逻辑问题 |
| 系统健康 | 数据延迟、下单成功率 | 工程故障 |
| 风险暴露 | 行业、风格暴露 | 隐性风险累积 |
提示:策略失效往往不是突然发生的,而是先出现信号质量下降,再出现表现下滑。盯信号质量能让你提前反应。
7. 风险边界与合规底线
7.1 模型风险不是唯一风险
AI量化引入了一类新风险:模型风险。模型在训练分布内表现好,分布外可能完全失效。金融市场的分布是不断变化的,今天有效的模型明天可能就废了。所以模型必须有分布外检测机制:当输入数据偏离训练分布时,模型应该输出"我不确定",而不是硬给一个预测。
7.2 可解释性的现实价值
监管和内部风控都要求策略可解释。一个纯黑箱模型,亏钱时你根本不知道是模型错了还是市场变了。实践中常用的折中方案是:用复杂模型生成信号,用可解释工具(如SHAP)分析信号来源,确保信号有合理的经济逻辑支撑。如果一个因子的重要性很高但你说不出它为什么有效,那大概率是过拟合。
7.3 仓位与杠杆的硬约束
无论模型多好,仓位和杠杆必须有硬约束,且这个约束独立于模型。模型说满仓,风控说最多半仓,那就半仓。把风控做成模型的一部分是危险的,因为模型可能学出绕过风控的行为。风控应该是模型之外的独立层。
8. 我在实际项目里踩过的几个坑
第一个坑是过度相信回测。早期我做过一个因子,回测夏普2以上,兴奋得不行,结果实盘三个月回撤20%。复盘发现是回测里用了修正后的财报数据,实盘用的是实时数据,两者差异巨大。从那以后我坚持所有回测必须用point-in-time数据,宁可数据少一点。
第二个坑是模型更新频率。一开始我按月更新模型,后来发现市场状态切换快的时候,一个月太慢。改成按周更新,又发现更新太频繁导致策略不稳定,因为每周的数据量不足以训练出稳健模型。最后的方案是分层更新:底层特征每周更新,顶层模型每月更新,中间加一个状态检测模块,检测到市场状态突变时触发紧急更新。
第三个坑是忽视交易成本建模。有段时间策略换手特别高,回测里成本设得低,看着赚钱,实盘一算手续费和滑点,直接亏。后来我把成本模型做细,按标的流动性、下单量、时段动态估滑点,策略换手自然就降下来了。
第四个坑是智能体容错没做好。有一次数据源临时故障,返回了空数据,智能体没检测出来,用空数据算出的信号全是零,结果那天完全没交易,错过了行情。后来加了数据完整性检查,空数据直接触发告警和降级。
这些坑的共同点是:都不是模型本身的问题,而是工程和数据的问题。AI量化做到最后,拼的不是谁的模型更花哨,而是谁的数据更干净、工程更稳健、风控更严格。模型只是整条链上的一环,把它当成全部,迟早要交学费。
如果你正准备入这个方向,我的建议是先把数据管道和回测框架搭扎实,用一个简单模型跑通全流程,确认每个环节都可靠,再考虑上复杂模型。顺序反了,后面全是返工。