ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

AI驱动量化交易实战:因子挖掘、回测框架与风险管理

AI驱动量化交易实战:因子挖掘、回测框架与风险管理

1. 拆解“AI驱动量化交易”的真实技术版图

“未来已来 AI 驱动的量化交易”这个标题,乍一看像是某场行业峰会的主题演讲,或者某个资管团队对外路演的slogan。但如果你真在一线写过策略、跑过回测、盯过实盘,就会知道这句话背后藏着的不是一个概念,而是一整套正在被重构的工程体系。我从几年前开始接触规则型量化策略,后来逐步把机器学习的组件引入到信号生成和风控环节,踩过的坑不比写过的策略少。这篇文章不打算给你画大饼,而是想把“AI驱动”这四个字拆开,看看它到底在量化交易的哪些环节真正产生了价值,哪些环节只是包装,以及一个普通开发者或者小团队想切入这个方向,应该从哪里下手。

先说清楚这篇文章适合谁看。如果你是完全没接触过量化交易的新手,我会在必要的地方补基础概念,保证你能跟上;如果你已经有一套基于技术指标或统计套利的规则型策略,正在考虑要不要引入机器学习,那这篇文章的架构拆解和避坑经验会对你有直接帮助;如果你是做AI工程出身、想了解金融场景落地的人,里面关于特征工程和回测陷阱的部分应该能让你少走弯路。核心关键词会围绕AI驱动、量化交易、因子挖掘、回测框架、风险管理这几个方向展开,不堆砌,但该出现的地方一定会出现。

我先把结论性的判断放在前面:AI在量化交易中的价值,目前最扎实的落点集中在三个环节——因子挖掘与特征构造、信号组合与仓位优化、以及风控与异常检测。而在“端到端直接预测价格”这个方向上,虽然研究热度很高,但实际落地到稳定盈利的案例,远比宣传中说的要少。理解这个分布,能帮你把有限的精力投到回报最确定的地方。

2. 为什么是AI,为什么是现在

2.1 传统规则型策略的天花板在哪里

规则型策略的核心逻辑是人先把规律想清楚,再写成代码去执行。比如双均线交叉、布林带突破、动量排序,这些策略的优点是逻辑透明、容易解释、回测和实盘的偏差相对可控。但它的天花板也很明显:人的观察带宽有限。一个交易员或者研究员,能同时跟踪的因子数量大概在几十个量级,能手工构造的交互项就更少。而市场里真正驱动价格变化的变量,可能有几百上千个维度,且它们之间的关系是非线性的、时变的。

我早期写过一套基于动量加波动的择时策略,逻辑很干净,回测夏普也不错。但实盘跑了几个月之后发现,在特定市场状态下它会连续回撤,而我事后复盘时能看出“当时应该切换逻辑”,但规则里没有这个切换条件,因为我在写策略时根本没预见到那种状态。这就是规则型策略的典型困境:你能写下来的规则,都是你已经想到的;而市场会不断给你没想到的情况。

2.2 AI补的是哪块短板

机器学习模型,尤其是树模型和神经网络,擅长的恰恰是从高维数据里自动发现非线性关系和交互效应。你不需要事先告诉它“当A和B同时满足时该怎样”,它会在训练过程中自己学到这些组合模式。这就把研究员从“手工构造规则”中解放出来,转向“构造特征和设计学习目标”这个更高层的任务。

但这里有个关键认知:AI不是替代了规则,而是把规则的粒度从“人可解释的几条”细化到了“模型内部成千上万条”。它并没有让问题变简单,只是把问题的难点从“想逻辑”转移到了“喂数据”和“防过拟合”。很多人以为上了AI就能躺赚,实际上是你把手工调参的辛苦,换成了数据清洗和模型验证的辛苦,总量没减少,只是性质变了。

2.3 当前技术栈的成熟度判断

从工具链角度看,现在确实是切入的好时机。数据处理有成熟的列式存储和计算框架,模型训练有梯度提升树和深度学习框架,回测有相对完善的事件驱动引擎。这些组件在几年前要么不存在,要么需要自己造轮子。现在你可以把精力集中在策略逻辑本身,而不是基础设施上。

但成熟度是分层的。数据层面和回测层面相对成熟,模型层面和实盘执行层面仍然粗糙。尤其是从回测到实盘的迁移,涉及滑点建模、冲击成本估计、订单执行算法等一系列问题,这些环节的AI化程度还很低,主要靠工程经验和保守假设来兜底。所以我的建议是:把AI用在它已经证明有效的环节,对还没证明的环节保持警惕。

3. 核心环节拆解:AI到底用在哪

3.1 因子挖掘:从人工构造到自动搜索

因子是量化策略的原材料。传统做法是研究员根据金融逻辑手工构造因子,比如动量因子、价值因子、波动率因子。AI介入之后,出现了两条新路径:一是用遗传规划等方法自动搜索因子表达式,二是用自编码器或表示学习从原始数据中提取隐含因子。

我试过遗传规划那条路,用符号回归去搜索因子公式。实测下来,它能找到一些人类不会想到的组合,比如“成交量的某种非线性变换除以波动率的滞后项”这类表达式。但问题也很明显:搜索出来的因子很多是过拟合的产物,在样本外表现不稳定。我的处理方式是,把搜索空间限制在有金融含义的操作符和变量上,同时对每个候选因子做严格的样本外检验和多重假设检验校正。这样虽然搜索效率降低了,但找到的因子可靠性高很多。

另一条路是用自编码器做特征提取。把一篮子资产的收益率矩阵输入自编码器,让它在低维空间中重建,编码层的输出就可以当作因子使用。这种方法的优势是能捕捉资产之间的联动结构,但缺点是解释性差,而且对训练数据的分布变化很敏感。我的经验是,这类因子适合作为组合中的补充,不适合作为核心信号来源。

3.2 信号组合:从线性加权到非线性融合

有了因子之后,下一步是把多个因子的信号组合成一个最终的交易信号。传统做法是等权加权或者用历史IC加权,本质上是线性组合。AI在这里的价值是用非线性模型学习因子之间的交互关系。

举个例子,动量因子和反转因子在不同市场状态下有效性是相反的。线性模型没法表达“当波动率低时用动量、当波动率高时用反转”这种条件逻辑,但树模型可以。我用梯度提升树做过因子融合,输入是十几个因子的截面值,输出是下一期的预期收益排序。相比线性加权,信息系数有提升,但提升幅度没有想象中大,大概在百分之十几的量级。

这里有个容易踩的坑:因子融合模型的训练目标要和最终的投资目标对齐。如果你用均方误差去预测收益率,模型会偏向于拟合大收益的样本,但组合优化真正关心的是排序质量。所以我后来改用排序损失或者IC相关的目标函数,效果更稳定。

3.3 仓位优化:从均值方差到强化学习

仓位优化是决定“每个标的买多少”的环节。经典的均值方差优化对输入参数极其敏感,预期收益的微小变化会导致权重剧烈波动。AI在这个环节的应用,目前比较有前景的是强化学习。

强化学习的思路是把交易过程建模成序贯决策问题:状态是当前的市场特征和持仓,动作是调仓比例,奖励是风险调整后的收益。智能体通过与环境交互来学习最优策略。我做过一段时间的尝试,用深度确定性策略梯度算法在模拟环境中训练调仓策略。实测下来,它在控制回撤方面确实比固定权重的方案好,但训练过程非常不稳定,对奖励函数的设计极其敏感。

注意:强化学习在金融场景的落地,最大的障碍不是算法本身,而是环境模拟的保真度。你的模拟环境如果和真实市场偏差大,训练出来的策略在实盘就会失效。所以我的建议是,强化学习适合作为辅助工具,用来生成候选权重,再结合规则做最终决策,而不是完全交给模型。

3.4 风控与异常检测:AI最被低估的应用

很多人谈AI量化,注意力都在信号生成上,但我认为风控才是AI目前最扎实、最值得投入的落点。原因很简单:风控问题的定义更清晰,数据标注更容易,而且容错空间更大——风控模型误报的代价是少赚,而信号模型误判的代价是亏钱。

具体来说,可以用无监督学习做市场异常状态检测。比如用孤立森林或者自编码器重构误差来识别当前市场是否处于历史罕见的 regime。当检测到异常状态时,自动降低仓位或者切换到防御模式。我用这种方法在几次市场剧烈波动前捕捉到了预警信号,虽然不能精确预测方向,但“降低暴露”这个决策本身就避免了大幅回撤。

另一个应用是用分类模型预测“当前持仓在未来一段时间内触发止损的概率”,从而提前减仓。这个问题的标签容易构造,特征也相对稳定,模型效果比预测收益率要好得多。

4. 实操落地:从零搭建一个AI量化原型

4.1 数据准备与特征工程

数据是整个流程的地基。我建议从日频数据开始,因为日频数据的信噪比相对高,交易成本的影响也更容易建模。数据来源可以是公开的行情数据,包含OHLCV和基本的财务指标。

特征工程是决定模型上限的关键。我的做法是分三层构造特征:

  • 第一层是原始特征:收益率、成交量、波动率、换手率等基础统计量。
  • 第二层是变换特征:对原始特征做滞后、差分、滚动统计(均值、标准差、偏度、峰度)、排名百分位等处理。
  • 第三层是交互特征:用树模型的特征重要性筛选出前若干重要特征,两两做乘除或条件组合。

这里有个实操细节:所有特征的计算必须严格避免未来信息泄露。比如滚动统计的窗口只能包含当前时点及之前的数据,排名百分位只能在截面上计算而不能跨时间计算。我见过太多回测表现很好但实盘一塌糊涂的案例,根源都是特征里混入了未来信息。

# 以滚动波动率为例,展示正确的计算方式 # 假设 df 是包含 date, asset_id, return 的 DataFrame df = df.sort_values(['asset_id', 'date']) df['vol_20d'] = df.groupby('asset_id')['return'].transform( lambda x: x.rolling(window=20, min_periods=15).std() ) # 注意:rolling 默认包含当前时点,这是正确的 # 如果要用 shift 避免用到当日信息,需明确 shift(1)

4.2 模型训练与验证

模型选择上,我建议从梯度提升树开始,比如 LightGBM 或 XGBoost。原因有三:一是对特征尺度不敏感,省去了标准化的工作;二是能自动处理缺失值;三是训练速度快,方便快速迭代。神经网络可以作为后续尝试,但不建议一上来就用。

验证方式必须用时序交叉验证,不能用随机K折。具体做法是把时间轴分成若干段,用前面的段训练、后面的段验证,滚动前进。这样才能模拟真实的“用历史预测未来”的场景。

# 时序交叉验证的示意逻辑 # 假设数据按时间排序,共 N 期 # 训练集:第 1 到 t 期,验证集:第 t+1 到 t+h 期 # 然后 t 向前滚动,重复上述过程

标签构造上,我建议用未来N期的收益率排序而不是绝对收益率。排序标签对极端值更鲁棒,也更贴近组合构建的实际需求。N的取值要和调仓频率匹配,如果是周频调仓,N取5个交易日左右比较合适。

4.3 回测框架的关键配置

回测是验证策略的必经环节,但也是最容易自欺欺人的环节。我总结了几条必须遵守的原则:

  • 交易成本不能忽略:至少包含佣金和印花税,滑点按成交额的千分之一到千分之三估计,具体取决于标的流动性。
  • 不能使用未来数据:包括财务数据的公布滞后、指数成分股的调整时间等,都要在回测中正确模拟。
  • 样本外测试要彻底:留出一段完全没参与任何调参的数据作为最终检验,这段数据的结果才是你对策略真实能力的估计。

我用过的事件驱动回测引擎,核心逻辑是按时间顺序推送市场事件,策略根据当前可见信息做出决策,订单在下一个时点成交。这种模式比向量化回测慢,但更接近实盘。

4.4 从回测到实盘的过渡

回测和实盘之间的差距,主要来自三个方面:滑点估计偏差、市场冲击、以及策略容量。滑点方面,我建议在回测中使用比预期更保守的假设,比如实际预期滑点是千分之一,回测里用千分之二,这样实盘如果比预期好就是惊喜,比预期差也不至于失控。

市场冲击是指你的交易行为本身会影响价格,尤其是资金量较大的时候。一个粗略的估计方法是:冲击成本与交易量占日均成交量的比例成正比。如果单笔交易量超过日均成交量的百分之一,就需要认真考虑冲击成本了。

策略容量是指策略能容纳的最大资金量。一个在十万级别资金上表现很好的策略,放到千万级别可能就失效了,因为交易成本会吃掉大部分收益。所以在策略设计阶段就要考虑容量问题,优先选择流动性好的标的。

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

5.1 回测很好实盘很差,怎么排查

这是最经典的问题。我的排查顺序是:先查数据泄露,再查成本假设,最后查市场状态变化。

数据泄露的排查方法是,把策略中所有用到数据的时点标注出来,逐一确认是否在决策时点之前可获得。特别容易出问题的地方包括:财务数据的公布日期、指数成分股的纳入剔除日期、以及各种滚动统计的窗口边界。

成本假设的排查相对简单,把回测中的成本参数调高,看策略是否还能盈利。如果成本翻倍后策略就亏损,说明策略的收益来源太脆弱。

市场状态变化的排查需要对比回测期和实盘期的市场特征分布。如果实盘期的波动率、相关性结构等明显偏离回测期,那策略失效可能是 regime 变化导致的,需要考虑加入自适应机制。

5.2 模型过拟合的识别与处理

过拟合的典型表现是:训练集表现极好,验证集表现一般,样本外表现差。识别方法除了看不同数据集的表现差异,还可以看特征重要性的稳定性——如果每次训练出来的重要特征差异很大,说明模型在拟合噪声。

处理过拟合的手段包括:减少特征数量、增加正则化强度、降低模型复杂度、增加训练数据量。我的经验是,特征数量的控制比模型复杂度的控制更重要。与其用一个复杂模型配几百个特征,不如用简单模型配十几个经过严格筛选的特征。

5.3 特征重要性与策略逻辑的一致性检查

即使模型表现好,也要检查它学到的逻辑是否合理。方法是看特征重要性排序,以及用部分依赖图观察关键特征与预测值的关系。如果发现某个特征的重要性异常高,但金融逻辑上说不通,那很可能是数据问题或者泄露。

我遇到过一次,模型对某个成交量衍生特征极度依赖,排查后发现这个特征的计算里用到了当日收盘后的数据,属于未来信息泄露。修正之后模型表现下降了不少,但至少是真实的。

5.4 实盘监控与模型衰减应对

模型上线不是终点,而是起点。我建议建立一套监控体系,跟踪以下指标:信号的信息系数、组合的换手率、实际成交价与预期价的偏差、以及模型预测值的分布变化。

当信息系数连续多期低于阈值,或者预测值分布发生明显偏移时,说明模型可能衰减了,需要重新训练或者调整。我的做法是设置一个自动预警,当指标触发阈值时通知人工介入,而不是完全自动切换,因为自动切换本身也可能引入新的风险。

常见问题可能原因排查方向处理建议
回测夏普高但实盘亏损数据泄露或成本低估检查特征时点、提高成本假设修正泄露、保守估计成本
模型训练集表现远好于验证集过拟合看特征重要性稳定性减特征、加正则、增数据
策略突然失效市场状态变化对比当前与历史的波动率、相关性加入regime检测、降低仓位
换手率异常高信号噪声大或调仓逻辑问题检查信号自相关性平滑信号、加交易约束
成交价与预期偏差大滑点估计不足分析实际成交数据调整执行算法、拆分订单

6. 工具选型与团队配置建议

6.1 技术栈的取舍

数据处理我用的是列式存储加计算框架的组合,优点是读取快、内存效率高。回测引擎我倾向于自己搭一套轻量级的事件驱动框架,而不是用现成的重型平台,因为自己搭的框架对细节的控制力更强,出问题也容易排查。模型训练用梯度提升树的实现,配合超参数搜索工具做调优。

版本管理方面,策略代码、数据版本、模型文件必须严格对应。我见过因为模型文件和特征版本不匹配导致实盘信号错误的案例,排查了大半天才发现是版本问题。建议用配置管理工具把这三者绑定,每次实验记录完整的版本信息。

6.2 小团队的分工模式

如果是两三个人的小团队,我建议的分工是:一个人负责数据和特征工程,一个人负责模型和回测,第三个人负责实盘执行和监控。如果只有两个人,那就一个人管数据加特征,另一个人管模型加实盘,但实盘监控必须两个人交叉检查。

关键原则是:写策略的人和盯实盘的人不能是同一个人。因为写策略的人对自己的逻辑有盲区,盯盘的人需要保持独立的判断。这个原则在小团队里尤其重要,因为资源有限,一旦实盘出问题,需要有独立视角的人来快速定位。

6.3 从原型到生产的检查清单

在把策略从研究环境推到实盘之前,我会过一遍这个清单:

  • 数据泄露检查是否完成,所有特征的时点是否确认无误
  • 回测成本假设是否保守,是否做了成本敏感性分析
  • 样本外测试是否独立,是否没有参与任何调参
  • 策略容量是否估算过,当前资金量是否在容量范围内
  • 实盘监控指标是否配置,预警阈值是否合理
  • 回滚方案是否准备好,出问题时能否快速切回安全状态

这个清单看起来繁琐,但每一条都是我用真金白银换来的教训。跳过任何一条,都可能在某一天以意想不到的方式反噬。

7. 我对这个方向的一些个人判断

做了几年下来,我越来越觉得“AI驱动”这个词被用得太宽泛了。真正有价值的不是“用了AI”,而是“用AI解决了原来解决不了的问题”。如果一个规则型策略已经能稳定盈利,硬套一个神经网络上去,除了增加复杂度和维护成本,未必有实质提升。反过来,在因子挖掘、风控检测这些规则难以覆盖的环节,AI的介入确实打开了新的空间。

另一个体会是,这个领域的竞争最终会回归到数据和工程能力上。模型架构的差异,在充分调优之后往往没有想象中那么大,但数据质量、特征构造的细致程度、回测框架的保真度,这些“脏活累活”才是区分策略好坏的关键。我见过太多人把时间花在尝试最新模型上,却不愿意花半天时间检查一个特征的计算逻辑,结果本末倒置。

最后分享一个我一直在用的习惯:每上一个新策略,先拿小资金跑至少一个完整的市场周期,期间不做任何参数调整,纯粹观察它的真实表现。这个过程很煎熬,尤其是看到回撤的时候,但它能给你最真实的反馈。回测里的漂亮曲线是廉价的,实盘里的每一笔盈亏才是真的。这个习惯让我避开了好几个“回测很美、实盘很惨”的陷阱,也让我对策略的真实能力有了更清醒的认知。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进