第四部分 · 量化研究从因子开始 · 第 10 章
回测与机器学习:在历史里排练
回测是量化研究的实验室:把策略规则放进历史市场里跑一遍,看当时这么做会发生什么。但它是排练,不是时光机,更不是赚钱证明——偷看未来、忽略成本、假设无限成交,结果就会变成幻觉。这一章先讲怎么做一次可信的回测,再讲量化里的机器学习:模型为什么不是越复杂越好,以及金融数据和图像文本有什么根本不同。
读完这一章,你会明白
- 回测是在历史中按当时可见信息排练策略,不是证明未来一定赚钱。
- 成交假设、交易成本、换手、容量、停牌涨跌停和退市处理会显著改变收益。
- 量化模型首先服务于问题定义,不是先选酷模型再找金融任务。
- 线性模型、树模型和深度学习各有边界,金融低信噪比会放大过拟合风险。
本图从“回测到底在模拟什么”走到“个人应该怎么开始金融 ML”,用于先看第 10 章的关键路径,再回到正文补细节。
1. 回测到底在模拟什么
最简单的回测流程是: 每到一个决策时点,读取当时可见数据,计算信号,生成目标持仓,下单,模拟成交,更新现金和持仓,记录净值。下一天或下一分钟重复这个过程。
这个流程看起来像一个循环,但每一步都可能出错。当时可见数据是否真的可见? 信号是否用到了未来? 下单时间是否允许交易? 成交价格是否真实? 费用是否扣掉? 股票是否停牌或涨跌停? 持仓是否满足 T+1? 这些都决定回测是否可信。
好的回测不会只输出收益曲线,还会输出交易记录、持仓、现金、费用、换手、未成交订单、拒单原因、行业暴露、风险指标和相对基准表现。只有净值曲线的回测,很难定位收益来自哪里。
2. 向量化回测和事件驱动回测
向量化回测把数据整理成矩阵,用批量计算快速得到信号和收益。它适合日频选股、因子研究和快速实验。优点是快,缺点是容易把交易细节简化掉,比如部分成交、订单排队、盘中状态和复杂费用。
事件驱动回测更像真实交易系统。行情更新、信号生成、订单提交、成交回报、撤单、风控检查都作为事件发生。它更慢、更复杂,但能模拟更多实盘细节,适合高频、日内、多资产和复杂执行策略。
个人入门可以先用向量化做研究,但要知道它的边界。当策略从研究走向实盘时,需要逐步加入事件驱动细节。不要因为向量化回测收益漂亮,就以为真实交易也会如此。
3. 调仓频率决定交易问题的难度
月频策略、周频策略、日频策略、分钟策略面对的世界不一样。调仓越频繁,交易成本越重要,数据延迟越敏感,滑点越明显,系统稳定性要求越高。
一个月频选股策略可以用月末信号、下月初调仓,主要关心财务数据、风格暴露和组合约束。一个日内策略可能需要逐笔行情、盘口排队、低延迟系统和严格风控。两者都叫量化,但工程难度完全不同。
新手最好从低频开始。低频策略也很难,但它让你先把数据、标签、成本、基准和风险学清楚,不用一开始就被毫秒延迟、订单簿和硬件问题淹没。
4. 收盘价成交最容易骗人
很多入门回测默认按收盘价成交。这个假设很危险。如果你的信号使用当天收盘价或收盘后才知道的数据,又假设当天收盘成交,就形成未来函数。更合理的做法可能是用下一交易日开盘价、成交均价或带滑点的价格。
即使用下一日开盘价,也不代表真实能成交。开盘可能涨停买不到,跌停卖不出,或者集合竞价成交量不够。用日线数据做回测时,成交价格只能是近似,不能模拟所有盘口细节。
成熟回测会让成交假设保守一些。比如买入价格略高于基准价,卖出价格略低于基准价;或者根据成交额限制最大参与比例;遇到涨跌停和停牌则不能成交。宁可少估收益,也不要让回测靠不真实成交赚钱。
回测在某个时点做决策时,只能用那一刻已经公开的信息。一旦用到当时还不知道的未来数据(未来函数),回测收益就是幻觉,实盘一定复现不了。
5. 佣金、税费、滑点和冲击
交易成本不只是券商佣金。普通股票卖出可能有印花税,还有过户费等费用;ETF、债券、可转债、期货、期权费用结构不同。除此之外,买卖价差、滑点和冲击成本常常比显性费用更重要。
滑点是预期成交价和实际成交价之间的差。冲击成本是你的交易本身推动价格。一个策略如果频繁买卖小盘低流动性股票,纸面收益很容易被滑点和冲击吃掉。
回测至少要做几档成本敏感性分析: 低成本、中等成本、高成本。如果策略只在极低成本假设下赚钱,稍微提高费用就亏损,那它的商业价值很弱。
6. 策略到底有多爱动
换手率衡量组合买卖频率。每月把全部持仓换一遍,和每年只换一小部分,对成本、容量和执行难度影响巨大。高换手策略需要更强信号、更低成本和更好执行。
假设一个策略年化毛收益 20%,年换手 20 倍,单边总成本每次 0.1%。这里必须先定义换手口径: 如果 20 倍指单边买入成交额除以平均资产,显性成本约 2%;如果指完整换仓 20 次,每次同时卖旧买新,双边成交约 40 倍,成本约 4%,还没算冲击。如果毛收益主要来自频繁小机会,成本会决定生死。
换手也影响税费和运营稳定性。策略频繁调仓,更容易遇到停牌、涨跌停、部分成交和资金占用。很多看似聪明的信号,因为换手太高,最终不值得交易。
7. 小钱能赚,大钱不一定能赚
容量是策略能承载多少资金。一个信号在 100 万资金上可行,不代表在 10 亿资金上可行。资金越大,交易越难隐藏,冲击成本越高,可买资产越受限制。
小盘股、低成交额、窄价差机会通常容量有限。你买一点可以成交,买很多就把价格推上去;卖一点可以退出,卖很多就把价格砸下来。容量不是附加问题,而是策略收益的一部分。
回测可以用参与率约束来粗略估计容量。比如每只股票每天成交量的参与比例不超过 5% 或 10%。如果策略需要吃掉当天成交量的一半才能达到目标仓位,回测收益就很不现实。
8. 幸存者偏差和退市处理
幸存者偏差是回测最常见的高估来源之一。如果你只用现在还存在的股票回测过去,就会漏掉历史上退市、长期停牌或表现很差的股票。剩下来的样本天然更健康。
退市处理也会影响结果。某些股票在退市前连续跌停、流动性枯竭,你不一定能按理论价格卖出。如果回测在退市前轻松卖掉,就低估了尾部风险。
正确做法是保留历史上当时存在的全部可投资样本,并按真实规则处理退市、停牌、ST、涨跌停和流动性。回测越接近坏情况,越能保护实盘。
过拟合是模型记住了历史噪声,却没有学到未来可持续规律。量化里过拟合很容易发生,因为数据维度高、尝试次数多、市场噪声大。你试了足够多参数,总能找到一条历史收益曲线很好看的组合。
常见过拟合信号包括: 参数稍微变动收益就崩,收益集中在少数几笔交易或少数年份,样本内很好样本外很差,扣成本后消失,逻辑解释牵强,回撤阶段无法解释。
防过拟合的方法包括减少自由度、保留样本外、做滚动验证、做参数稳定性检查、记录所有实验、使用简单基准、优先选择有经济解释且交易成本合理的策略。
9. 回测报告应该交代什么
一份合格回测报告至少要写清楚: 数据来源、股票池、回测区间、基准、调仓频率、成交价格假设、费用和滑点、涨跌停停牌处理、持仓约束、收益风险指标、换手率、容量估计、样本外表现。
还要展示策略在哪些阶段赚钱、哪些阶段亏钱。只给最终年化收益没有意义。你要看牛市、熊市、震荡市分别表现,看最大回撤发生时市场环境,看超额收益是否稳定。
如果报告里没有成本、没有基准、没有回撤、没有换手、没有样本外,那不是研究报告,只是宣传材料。量化研究的专业性,首先体现在愿意把不利信息也摆出来。
10. 模型不是越复杂越好
你有深度学习基础,所以很容易问: 能不能把股票数据喂给 Transformer,让模型自己学出赚钱规律? 可以研究,但不能把金融市场当成 ImageNet。金融标签噪声很大,样本不独立,分布会变,交易成本会吃掉微弱优势,模型一复杂就更容易过拟合。量化里的机器学习不是炫模型,而是把预测、组合、交易和风控接成一个能赚钱的系统。
在量化里,模型不是第一步。第一步是定义问题: 你要预测什么? 未来 1 日收益、未来 20 日超额收益、股票排序、波动率、成交概率、还是风险暴露? 问题不同,数据、标签、损失函数和评价指标都不同。
如果目标是选股排序,你可能更关心 RankIC、分层收益和组合超额收益,而不是普通回归的 MSE。如果目标是判断明天能不能成交,你更关心成交概率和拒单风险。如果目标是控制风险,预测误差方向可能比收益预测更重要。
很多失败量化项目从一开始就错了: 先选一个酷模型,再到处找数据喂进去。更稳的顺序是: 金融问题、可交易假设、标签定义、数据口径、简单基线、复杂模型、组合和执行。
11. 线性模型为什么还活着
线性模型看起来朴素,但在量化里非常常见。原因有三点: 可解释、稳定、容易加约束。一个线性模型会给每个因子一个权重,你能看出模型大概在奖励估值、质量、动量还是流动性。
例如多因子打分可以写成: 分数 = 0.3 × 价值因子 + 0.2 × 质量因子 + 0.2 × 动量因子 - 0.1 × 波动因子。真实模型会更复杂,但直觉就是把多个因子合成一个预期收益分数。
线性模型的弱点是表达能力有限,不容易捕捉非线性和交互效应。比如低估值在某些行业有用,在另一些行业可能是价值陷阱;动量在高流动性股票上有效,在低流动性股票上可能被成本吃掉。这些关系可能需要非线性模型处理。
12. 不让模型太相信自己
金融特征很多,噪声也很多。如果模型对每个特征都自由给很大权重,很容易把历史噪声当成规律。正则化就是给模型加约束,不让权重随便变得过大或过复杂。
L2 正则会惩罚大权重,让模型更平滑;L1 正则会把一些权重压到 0,起到特征选择作用。树模型里也有类似思想,比如限制树深、叶子样本数、学习率和子采样。深度学习里有 dropout、权重衰减、早停等方法。
正则化不是为了让样本内收益少一点,而是为了让模型在未来还能用。量化研究宁愿要一个样本内没那么惊艳、样本外更稳定的模型,也不该追求历史曲线完美贴合。
13. 树模型和梯度提升
树模型能处理非线性和特征交互。它可以学到类似“当估值低、质量高、过去动量不差时更看好”这样的规则。随机森林、GBDT、XGBoost、LightGBM、CatBoost 都属于常见树模型家族。
树模型在表格数据上经常很强,所以量化股票截面数据里也常见。它们能处理不同尺度特征,对异常值相对稳健,还能输出特征重要性。很多中低频量化研究会用梯度提升树作为强基线。
但树模型也会过拟合。金融数据里每天几千只股票、几百个特征,看似样本很多,但真正独立信息没有那么多。树太深、参数太多、调参太频繁,很容易记住某段历史里的偶然结构。
14. 深度学习能不能做量化
深度学习当然可以用于量化,尤其在高维数据、序列建模、文本、订单簿、组合表示学习上有研究价值。新闻文本、公告、研报、财报原文、盘口序列、分钟级多资产数据,都可能使用神经网络提取表示。
但深度学习在金融里有几个天然困难。第一,信噪比低,标签里大量随机波动。第二,分布漂移强,市场制度、参与者和风格会变。第三,样本有效独立性低,相邻日期和同一行业股票高度相关。第四,模型复杂后很难解释风险暴露。
所以,深度学习不是不能用,而是要更严格。你需要强基线、样本外、滚动验证、交易成本、容量估计、特征泄漏检查和风险归因。一个神经网络回测好看,如果解释不清赚的是什么钱,上线就很危险。
15. 横截面模型和时间序列模型
横截面模型在同一天比较很多股票,目标是排序。输入是当天每只股票的特征,输出是未来一段相对收益或排名。指数增强、多因子选股常用这种思路。
时间序列模型则关注同一个资产随时间变化,例如预测指数、期货、外汇或单只股票未来走势。它更像传统时间序列预测,会用滞后收益、波动率、宏观变量、仓位数据等。
二者可以结合。比如一个模型先用时间序列提取每只股票的历史状态,再在横截面上排序。深度学习里的序列编码器和截面注意力机制就可能这么用。但越复杂,越要防止泄漏和过拟合。
16. 损失函数要和赚钱目标对齐
普通回归常最小化 MSE,分类常最小化交叉熵。但量化赚钱通常不直接等于 MSE 最小。你可能不需要准确预测每只股票收益是多少,只需要把相对更好的排在前面。
因此,排序损失、相关性损失、分组收益、组合层面的目标函数都可能更贴近量化任务。有些研究会直接优化 RankIC 或近似排序目标,也有研究把交易成本和风险约束纳入训练或后处理。
不过,直接优化收益也有风险。收益目标噪声很大,模型可能学到历史偶然交易路径。实际流程里,常常先让模型做预测或排序,再由组合优化器把预测变成仓位,并用风险模型和成本模型约束。
17. 特征重要性不等于因果解释
机器学习模型常输出特征重要性。它能告诉你模型在历史训练中依赖了哪些变量,但不能直接证明这些变量因果上导致收益。一个特征重要,可能是因为它代理了行业、市值、流动性或某段市场风格。
比如模型发现“成交额”很重要,不一定说明成交额越大越能赚钱。它可能只是区分大盘股和小盘股,或者帮助模型避开流动性太差的股票。解释特征重要性时,要结合中性化、分层、分市场阶段和金融逻辑。
深度学习解释更难。注意力权重、梯度归因、SHAP 等工具可以辅助理解,但不能替代金融审查。模型解释的目标不是做漂亮图,而是确认策略没有靠未来数据、不可交易样本或隐含风险暴露赚钱。
18. 线上模型会衰减
金融模型上线后,效果常常会衰减。原因可能是市场环境变化、竞争者学习、交易成本变化、数据源变化、模型过拟合、执行质量下降,也可能只是正常统计波动。
因此,实盘模型需要监控。你要跟踪预测分布、因子覆盖率、缺失率、IC、分层收益、换手、持仓暴露、成交成本、滑点、回撤和相对基准。如果输入数据突然异常,模型输出再漂亮也不能信。
机器学习工程里有数据漂移、概念漂移、模型监控;量化里也一样,只是后果直接变成钱。一个模型不是训练完就结束,而是进入持续验证、再训练、降权、停用和复盘流程。
19. 个人应该怎么开始金融 ML
个人学习不要第一步就追最复杂网络。更好的路线是: 先用简单因子和线性模型建立完整回测;再用树模型做强基线;最后在确实有高维序列或文本需求时尝试深度学习。
第一个机器学习项目可以是月频选股排序。股票池选沪深 300 或中证 500,特征用估值、动量、波动、质量和流动性,标签用未来 20 日相对收益,模型从 Ridge、ElasticNet、LightGBM 开始,评价 RankIC、分层收益、换手和扣费后超额。
这条路线不炫,但能训练真正重要的能力: 数据对齐、泄漏检查、样本外验证、成本建模、风险归因和报告复盘。等这些基本功扎实后,深度学习才有意义。
小结
这一章的正文不是让你记住几个孤立名词,而是要把它们放回同一条因果链里。读完后,先用自己的话复述下面几条判断,再顺着“小节回看”检查是否能解释每一步。
- 回测是在历史中按当时可见信息排练策略,不是证明未来一定赚钱。
- 成交假设、交易成本、换手、容量、停牌涨跌停和退市处理会显著改变收益。
- 量化模型首先服务于问题定义,不是先选酷模型再找金融任务。
- 线性模型、树模型和深度学习各有边界,金融低信噪比会放大过拟合风险。
小节回看
- 1. 回测到底在模拟什么
- 2. 向量化回测和事件驱动回测
- 3. 调仓频率决定交易问题的难度
- 4. 收盘价成交最容易骗人
- 5. 佣金、税费、滑点和冲击
- 6. 策略到底有多爱动
- 7. 小钱能赚,大钱不一定能赚
- 8. 幸存者偏差和退市处理
- 9. 回测报告应该交代什么
- 10. 模型不是越复杂越好
- 11. 线性模型为什么还活着
- 12. 不让模型太相信自己
- 13. 树模型和梯度提升
- 14. 深度学习能不能做量化
- 15. 横截面模型和时间序列模型
- 16. 损失函数要和赚钱目标对齐
- 17. 特征重要性不等于因果解释
- 18. 线上模型会衰减
- 19. 个人应该怎么开始金融 ML
自测
为什么按当天收盘价成交容易出未来函数?
如果信号也用了当天收盘后才知道的信息,就等于先看答案再成交。
容量为什么会影响策略收益?
资金越大越难以原价成交,冲击成本和流动性约束会吃掉纸面机会。
为什么金融 ML 不能直接照搬普通监督学习流程?
因为金融数据有时间可见性、低信噪比、分布漂移、样本相关和交易成本等特殊问题。
线性模型在量化里为什么仍然常用?
它可解释、稳定、容易约束,适合多因子合成和风险暴露审查。