从一个让我愣住的问题说起#
2024 年我读过 Rishi K. Narang 的《打开量化投资的黑箱》(Inside the Black Box)。这篇不打算写书评,只提一件事:这本书给了我一张量化交易系统的地图,它把一个典型系统拆成几个组成部分——Alpha Model、Risk Model、Transaction Cost Model、Portfolio Construction Model、Execution Model,底下还有 Data 和 Research。
第一次看到这个拆法时我愣了一下。我长期做 ML Infra,「model」这个词在我这里几乎只有一个含义:一个神经网络,有权重,有 forward 和 backward。所以我的第一反应是:一个交易系统要训练五个网络?Risk Model 里面是什么结构,几层,attention 吗?
后来发现这个理解整个是歪的。而且纠正完之后,看到一个更重要的事实:一个量化交易系统从输入到输出在做的事情,和我原来理解的「训练一个模型预测股价,然后照着预测买卖」,几乎是两回事。这篇文章记录我后来两年慢慢拼出来的这张地图。框架来自那本书,但理解是我自己走错再折回来的。
一个交易系统最终要交出什么#
如果当时有人问我量化交易系统在干嘛,我的回答大概是:预测哪些股票会涨,然后买它们。
前半句没错,后半句把所有问题都藏起来了。
设一个例子。股票池 5000 只,模型给每只股票打了一个分:
1A 1.27
2B 0.83
3C 0.42
4...
5Y -0.76
6Z -1.15在很多 ML 任务里,到这里活就干完了:prediction 有了,算个指标,写报告。但交易系统的问题从这里才刚开始:
- 这个 score 是什么单位?是 expected return,是一个 ranking,还是别的什么?
- 买 top 30,还是 top 100?
- 每只等权,还是按 score 加权?
- 某个行业是不是买得太多了?
- 今天调仓会换手多少,产生多少交易成本?
- 某只股票信号很强,但流动性很差,买进去本身就把价格推上去 2%,还买吗?
- 最终需要成交 100 万股,是一次打出去,还是拆开慢慢来?
这些问题没有一个属于 prediction。但只要其中一个答错,prediction 再准,策略照样亏钱。
所以第一个要纠正的认知是:交易系统最终要回答的不是「这只股票会不会涨」,而是「在当前所有可交易资产里,我到底该持有哪些,各持多少,以及怎么把这些仓位真正交易出来」。
Prediction 只是通往这个答案的第一步。
金融里的 model 不是神经网络#
回到开头让我愣住的问题:系统里真的有五个神经网络吗?
没有。金融里说的 model 比 ML 里的宽得多,它指任何对现实某一部分的数学化、系统化描述。具体可能是一个机器学习模型,可能是一个线性模型或者统计模型,可能是一套经验公式,可能是一套规则,甚至可能就是一个 optimization problem。
Risk Model 大多数时候指的是一套 factor exposure 和协方差的描述,不是一个 Transformer;Transaction Cost Model 可能就是「spread 加一个和成交量挂钩的冲击项」这种经验公式;Portfolio Construction Model 干脆经常就是一个优化问题本身。
所以后来我给自己立了一个规矩:看到「某某 model」,先问它的输入是什么、输出是什么、回答的是什么问题,默认它是一个网络再去想结构,多半会跑偏。
Alpha:哪里可能有收益#
Alpha Model 是和 ML 工程师最贴近的一层,也是我读这本书时最没有陌生感的一层。它的任务一句话:从数据里发现未来收益、相对收益,或者其他可交易的机会。
对最常见的截面策略,这一部分长得和我熟悉的 ML workflow 几乎一样:
1market data / fundamental data / alternative data
2 ↓
3 features
4 ↓
5 ML model
6 ↓
7 score for each stock在某个时间截面,它输出的是:
1stock_1 → 0.82
2stock_2 → 0.31
3stock_3 → -0.15
4stock_4 → -0.73这个 score 可能是 expected return,可能是一个 ranking,可能是相对吸引力,也可能是未来收益的某种 proxy,取决于设计。
这一层的边界我一开始没看清:Alpha Model 的职责是回答「哪里可能有收益」,而不是「最终应该买多少」。 前者是 prediction,后者是 decision。Alpha 层的输出是一个观点,不是动作。
30 个 bet,还是 1 个 bet#
Alpha 给了我一个 top 30 名单,照着买就行了?
我以前觉得是:30 只股票,够分散了。后来才知道先要看一眼这 30 只是什么。
假设名单里 20 只是半导体,剩下 8 只也全是 AI 相关,大多数 beta 偏高,大多数是小盘股。表面上是 30 只股票、30 个独立下注,实际这个组合可能只是一个大号的「科技 / 成长 / 小盘」 bet——板块一回调,30 只「独立」的股票会一起跌。
这就是 Risk Model 存在的意义:资产数量不等于风险来源数量。 它描述的是 factor exposure、sector exposure、波动率、相关性、集中度、流动性这些维度的风险,回答的问题是「我到底承担了什么风险」。
注意这里的分工。Alpha 回答哪里可能赚钱,Risk 回答我押的是什么。Risk Model 不负责提高预测准确率——它压根就不是 prediction 意义上的模型。这两个是完全不同的问题,这一句我是被上面这种集中度的例子绊过之后才真正消化掉的。
8 bps 的 edge,为什么不够#
接下来是交易成本。这层是我以前觉得可以放到最后再减掉的东西。
Alpha Model 说这次调仓的预期 edge 是 8 bps。有 alpha,交易,好像很顺。先算完成这次调仓要花多少:
1spread + fees + slippage + market impact ≈ 10 bps方向全对,预测全准,一进一出倒贴 2 bps。这个信号不值得交易。
我原来的想法是:predicted return 归 predicted return,成本归成本,最后结算时减掉就行。但成熟系统里成本不是结算项,成本本身就是决策的输入——在决定要不要交易、交易多少之前,就得知道每次交易的价格。所以更接近真实可利用 edge 的估计,不是 predicted return,而是 predicted return 减去 cost。这两个数字之间的差,决定了一个信号值不值得变成交易。
把观点变成仓位#
现在手上有三样东西:Alpha 给观点,Risk 说押的是什么,Cost 说每次交易的价格。距离一个真正的持仓,还差一步:把它们和一堆约束放在一起,变成目标仓位。
这一步是 Portfolio Construction,也是整张地图里我认为位置最关键的一层。它把预测、风险、交易成本和各种约束组合起来,输出最终的目标持仓。
为什么它必须是独立的一层?因为真实的 portfolio 带着一堆 prediction 根本不知道的约束:
1position limit 单票仓位上限
2sector neutrality 行业中性
3factor neutrality 风格中性
4turnover limit 换手约束
5liquidity constraint 流动性约束
6gross / net exposure 总仓位与净仓位同样一个排序 A 优于 B 优于 C 一直到 Z,最终持仓完全取决于这些约束怎么设、优化怎么做。一个好的预测模型,并不会直接对应一个好的 portfolio。 预测是观点,持仓是观点、风险、成本和约束互相妥协的结果。
还有一个我当时没料到的推论:同一个 Alpha,换不同的 Portfolio Construction 方法,得到的可以是完全不同的策略——有的激进,有的保守,有的换手高,有的压着交易量不动。Alpha 决定观点从哪来,Construction 决定观点怎么表达。想通这一点之后,我才明白为什么同一个信号在不同人手里能长成完全不同的东西。
目标仓位仍然不是成交#
Portfolio Construction 输出:
1A: +1.2%
2B: +0.8%
3C: -0.7%
4...能直接发给市场吗?不能。市场不接受 portfolio,不接受一个数据结构,它只接受 orders。
Execution 层的职责就是把 target position 变成 orders,再把 orders 变成 trades。中间又是一整套新问题:每笔 order 多大、什么时候发、对手盘的流动性够不够、拆成几笔、要不要被动的挂在盘口等成交还是主动吃掉价差。算法执行的细节这里不展开,但这一层和上一层之间的接口值得单独记一句:「我想持有什么」和「我如何得到这些仓位」又是两个问题。
上一层回答目标是什么,这一层回答怎么以最小的代价到达目标。
把系统拼回来#
现在可以把前面几块拼成一张完整的图:
主流程是一条决策空间逐步收缩的流水线:从 5000 只候选股票,到一份 score 列表,再到一个带风险和成本约束的目标仓位,最后变成一串发往市场的 orders。
图里有两位不在主流程上,我觉得这个画法才是它们真实的位置。
Data 不属于任何一步,它是每一步的原料和基础设施:Alpha 需要行情和基本面,Risk 需要协方差和 exposure,Cost 需要流动性和成交数据,Execution 需要实时的 order book。
Research 也不在流水线上,它是构建和改进整个系统的方法论:提出假设、回测、验证、迭代。它的输出不是运行时的某个预测,而是这张图本身的设计。
我第一次读那本书的时候,是把这两个画成流水线上的 box 的。后来才意识到,那样画其实把它们降格了。
Prediction 只是中间表示#
拼完图,回到老本行问一个问题:ML 工程师熟悉的那个「model」,在这套系统里处在什么位置?
答案有点扎心:大多数时候,它处在 Alpha Model 这一个框里面,甚至常常只覆盖这个框的一部分。
我做 ML 这么多年形成的直觉是:
1features → model → prediction在 benchmark 任务里,prediction 就是终点,模型质量由它决定。但在交易系统里,prediction 只是一个 intermediate representation,后面还有一整条链:
1prediction → decision → allocation → execution这和 ML Systems 里很多场景是同构的:模型的输出只是下一个环节的输入,训练侧的 loss 不能保证 serving 侧的体验。在这里,prediction 的质量不能保证 trade 的质量,中间隔着 risk、cost、约束和 execution 一层一层。
所以我现在是这样理解的:机器学习解决的通常只是量化系统里的一个局部 optimization problem。 这不是贬低 ML——alpha prediction 本身可以非常困难,也是策略 edge 的重要来源——但 prediction quality 和 trading system quality 是两个层次的问题。把它们混在一起,容易产生两种误判:觉得预测指标涨了收益就该涨,或者反过来,觉得策略不赚钱就一定是模型不行。
端到端,end 在哪里#
写到这里,其实已经凑齐了我后面想讨论的问题的前置:金融场景会不会像 CV、推荐系统那样,走向越来越端到端的模型?
但这张地图先回答了一个更前面的问题:说「端到端」的时候,end 到底在哪里?
它不可能是「行情进网络、直接向交易所发订单」,也不是把风险管理、portfolio 约束、execution、compliance 全塞进一个网络。前面每一层拆开看就知道,它们解决的问题不一样,约束和成本的输入也根本不来自模型内部。
我目前真正感兴趣的是一个窄得多的问题,在主流程的最前段。传统截面模型长这样:
1raw market data
2 ↓
3handcrafted / engineered features
4 ↓
5prediction model
6 ↓
7stock score未来会不会越来越变成:
1raw / lightly processed market data
2 ↓
3large learned representation
4 ↓
5prediction
6 ↓
7stock score也就是 representation learning 把 feature engineering 这一段吃掉。这种「端到端」发生在行情到 alpha signal 之间,end 停在 score:
把这个边界画清楚,后面的讨论才不会滑掉:如果 end 定义成 stock score,那研究行情到 signal 的端到端学习是一个完全合理的问题;如果 end 定义成发往交易所的 order,那就是另外一个完全不同的问题。 score 之后还有 risk、cost、约束和 execution,它们不会因为前段变得端到端就消失。
写在最后#
过去讨论机器学习模型,我会自然地问:模型的输入是什么,输出是什么?
现在放到交易系统里,我会先问另一个问题:这个模型处在整套决策链条的什么位置,它服务谁,又把结果交给谁?
回答了这个,才有资格继续讨论:representation learning 能不能替代 feature engineering,截面模型能不能变得更端到端,prediction 和 portfolio construction 的边界会不会移动。
这些就是下一篇文章想讨论的:金融会重走 CV 和推荐系统的端到端之路吗?
参考资料#
- Rishi K. Narang, 《打开量化投资的黑箱》(Inside the Black Box)——本文系统拆解框架的来源