第五部分 · 量化研究如何产生可信结论 · 第 30 章

回测: 在历史里排练,但不要把历史当答案

回测是量化研究的实验室: 你把策略规则放进历史市场里,让它假装穿越回去重新跑一遍,看看当时真这么做会发生什么。但请先记住两句话: 回测不是时光机,更不是赚钱证明。它更像正式演出前的彩排,作用是帮你提前看到策略可能的收益、风险、换手和失效阶段。彩排越接近真实交易,参考价值越高;如果你在彩排里偷看未来、假装交易零成本、假设想买多少就能成交多少,那排出来的就不是戏,是幻觉。

主线五 本部分第 3 / 10 章

本部分的问题:一个金融判断怎样变成可证伪假设,再经过数据、回测、模型和实盘约束?

读完后,你能从问题出发完成研究闭环,而不是先找模型、再给结果编故事。

读完这一章,你会明白

  • 回测是拿当时可见的信息在历史里排练策略,不是向未来开具的赚钱证明。
  • 成交假设、交易成本、换手、容量、停牌涨跌停和退市处理,每一项都能显著改写收益。

金融现场 1. 把 3 月 31 日的财报放进 3 月 31 日交易

一位研究者用一季度净利润选股,把报表期末日期 3 月 31 日当成数据可用日。回测结果漂亮得惊人:模型总能提前买到业绩大增的公司。问题是,许多一季报要到四月甚至更晚才公开,3 月 31 日收盘前的市场根本看不到那些数字。

代码只错了一列日期,却获得了预知未来的能力。财务数据至少有三个时间:它描述哪段经营期、公司何时公告、数据库何时收录或修订。把第一个时间当成第二个,模型就会在历史里作弊,而且作弊得非常像真正的基本面能力。

可靠回测必须按公告时间对齐,还要给数据入库和下单留出延迟。凡是结果好得不合常理,第一检查项不该是调参数,而是问:这一刻的我,真的已经看见这条数据了吗?

2. 回测到底在模拟什么

一个最简回测,拆开看就是一条每天在跑的流水线: 每到一个决策时点,读取当时可见的数据,计算信号,生成目标持仓,下单,模拟成交,更新现金和持仓,记录净值。然后下一天或下一分钟,原样再来一遍。流程朴素得像一段 for 循环,很多新手的第一个回测也就几十行代码。

但正是这个看似朴素的循环,步步是坑。当时可见的数据,当时真的可见吗? 信号有没有偷看未来? 下单的那个时点,市场让不让你交易? 成交价格是真实存在过的吗? 费用扣了没有? 股票会不会恰好停牌或涨跌停? 持仓满不满足 T+1? 这串问题里任何一个答错,回测就从实验降级成故事。

所以一个像样的回测,不能只吐给你一条收益曲线就完事。它还得交出交易记录、持仓明细、现金流水、费用、换手、没成交的订单、拒单和拒单原因、行业暴露、风险指标以及相对基准的表现。只有净值曲线的回测,就像只有结论没有日志的事故复盘: 你根本定位不了收益从哪来,更判断不了它能不能在实盘复现。

3. 向量化回测和事件驱动回测

向量化回测的思路,程序员一定眼熟: 把数据整理成大矩阵,批量计算,一口气算出所有信号和收益。它像跑一个离线批处理任务: 快,所以特别适合日频选股、因子研究和快速实验。代价是交易细节被简化掉了——部分成交、订单排队、盘中状态、复杂费用,这些在矩阵里都没有位置。

事件驱动回测更像一个真实上线的系统: 行情更新、信号生成、订单提交、成交回报、撤单、风控检查,每件事都作为一条事件在系统里流转、被逐个处理。它更慢,写起来也复杂得多,但能模拟的实盘细节多得多,适合高频、日内、多资产和复杂执行策略。一个是批处理,一个是事件流,各有各的适用场景。

个人入门的合理路径,是先用向量化做研究,但心里要时刻装着它的边界。等策略从研究报告走向实盘,再逐步把事件驱动的细节加回来。千万别犯那个经典错误: 因为向量化回测的收益曲线很漂亮,就默认真实交易也会这么漂亮。

4. 调仓频率决定交易问题的难度

月频、周频、日频、分钟级——同样顶着“量化策略”四个字,它们面对的几乎是四个世界。规律只有一条: 调仓越频繁,交易成本越咬人,数据延迟越敏感,滑点越明显,对系统稳定性的要求越苛刻。

直观感受一下差距。一个月频选股策略,月末出信号、下月初调一次仓,主要操心的是财务数据、风格暴露和组合约束,工程上像一个定时任务。一个日内策略则要处理逐笔行情、盘口排队、低延迟系统和严格风控,工程上更接近实时系统。两者名片上都印着量化,工程难度却差着好几个数量级。

注意

所以新手最好从低频切入。注意,低频策略本身也绝不简单,它只是让你能先把数据、标签、成本、基准、风险这些基本功练扎实,不至于一上来就被毫秒延迟、订单簿和硬件问题按在地上摩擦。

5. 收盘价成交最容易骗人

很多入门教程的回测,默认按当天收盘价成交。一句话点破这个假设的危险: 它是未来函数最爱躲的地方。如果你的信号本身用到了当天收盘价、或者收盘后才披露的数据,回测又假设你在当天收盘那一刻成交——等于先偷看答案,再回到考场填答题卡。更诚实的假设是: 用下一交易日开盘价、成交均价,或者带滑点的价格。

就算改用下一日开盘价,也不代表你真能成交。开盘可能直接涨停,买单排到收盘也轮不到你;可能跌停,挂卖单无人问津;集合竞价的量也可能根本不够你买。用日线数据做回测,成交价格注定只能是近似,盘口里那些细碎的真实是模拟不出来的。

成熟的回测会把成交假设故意调保守: 买入价略高于基准价,卖出价略低于基准价;按成交额限制最大参与比例;遇到涨跌停和停牌直接不许成交。原则就一条: 宁可把收益估少一点,也别让回测靠不真实的成交替你赚钱。

回测最致命的错:偷看了未来 决策时点(此刻) 已知:历史数据(能用) 未知:未来数据(不能用) 用未来信息做当下决策 = 未来函数 回测里一旦用到决策时点还不知道的信息,收益就是假的 常见来源:用收盘价当天下单、复权/财报数据提前、标签泄漏

回测在某个时点做决策时,只能用那一刻已经公开的信息。一旦用到当时还不知道的未来数据(未来函数),回测收益就是幻觉,实盘一定复现不了。

6. 佣金、税费、滑点和冲击

一提交易成本,多数人只想到券商佣金。这只是冰山露出水面的一角。普通股票卖出可能有印花税,还有过户费等费用;ETF、债券、可转债、期货、期权各有各的费用结构。水面下更大的部分,是买卖价差、滑点和冲击成本——这些隐性成本常常比显性费用更致命。

10 万元本金,完整换仓 8 次要付多少成本

先用教学假设算账:把费用和滑点合在一起,买入、卖出每边均按成交额的 0.1% 计费。卖掉 10 万元旧股,再买入 10 万元新股,总成交额 20 万元,成本是 200 元,相当于净值的 0.2%。净值大致不变时,一年完整换仓 8 次,总成交额约 160 万元,成本 1600 元,约占本金 1.6%;20 次约 4%,50 次约 10%。这里的 0.2% 是完整卖旧买新一轮的成本,不能再乘买卖成交额之和。核对账单时,应分别用买入金额乘买入费率、卖出金额乘卖出费率;实际费率和最低收费以交易品种及账户约定为准。

先把两个术语说明白。滑点,是你预期成交的价格和实际成交价格之间的差。冲击成本更扎心: 你的交易本身在推动价格——你买,价格被你买上去;你卖,价格被你砸下来。一个策略如果频繁买卖小盘低流动性股票,纸面上那点收益,很容易被滑点和冲击联手吃干抹净。

所以回测至少要做几档成本敏感性分析: 低成本、中等成本、高成本各跑一遍。判断标准很直白: 一个策略如果只在极低成本假设下赚钱,费用稍微调高一档就转亏,那它的商业价值约等于零。

7. 策略到底有多爱动

换手率衡量组合买卖有多勤快。每月把全部持仓整个换一遍,和每年只换掉一小部分,是两种完全不同的生物: 成本、容量和执行难度都不一样。高换手策略要活下去,必须有更强的信号、更低的成本和更好的执行,三样缺一不可。

来算一笔账感受下。假设一个策略年化毛收益 20%,年换手 20 倍,每边费用按成交额的 0.1% 计算。先别急着算,得先定义换手口径:如果 20 倍指买入与卖出成交额之和除以平均净值,费用约 2%;如果指完整换仓 20 次,每次同时卖旧买新、总成交额约为净值的 40 倍,费用约 4%——这里还没加入额外冲击。只给买入成交额时,也不能漏掉卖出那一边。如果策略的毛收益本来就来自频繁的小机会,成本这一项就足以决定生死。

换手还不止影响成本,也影响税费和运营稳定性。调仓越频繁,撞上停牌、涨跌停、部分成交和资金占用的概率越大。很多信号在纸面上聪明绝顶,最后因为换手太高,被判了“不值得交易”。

8. 小钱能赚,大钱不一定能赚

容量回答一个朴素的问题: 这个策略最多能装下多少钱? 一个信号在 100 万资金上灵光,不代表在 10 亿资金上还灵光。资金越大,交易越藏不住,冲击成本越高,能买的资产越受限制。

小盘股、低成交额、窄价差的机会,通常容量有限。你买一点,能成交;买很多,价格被你自己推上去。卖的时候同理: 卖一点能退出,卖很多就把价格砸穿了。所以容量不是策略之外的附加题,它就是策略收益的一部分。

回测里可以用参与率约束粗略估计容量,比如每只股票每天的成交量参与比例不超过 5% 或 10%。如果策略需要吃掉当天成交量的一半才能凑够目标仓位,那回测出来的收益,基本可以当科幻小说看。

9. 幸存者偏差和退市处理

幸存者偏差是回测里最常见的高估来源之一,而且隐蔽得很。你今天拿到的股票列表,是“活到现在”的股票;拿它回测过去,就自动漏掉了历史上退市的、长期停牌的、烂到消失的股票。剩下来的样本天然更健康,回测收益自然更好看——这不是策略厉害,是样本在开赛前就把输家清出了场。

退市处理是另一个魔鬼细节。某些股票退市前连续跌停、流动性枯竭,实盘里你根本卖不掉。如果回测假设你在退市前按理论价格轻松离场,就把尾部风险严重低估了。

正确做法只有一条: 保留历史上当时真实存在的全部可投资样本,并按真实规则处理退市、停牌、ST、涨跌停和流动性。回测越愿意直面坏情况,越能保护实盘。

10. 历史答案背得太熟

过拟合用考试的话说,就是把历年真题的答案背得滚瓜烂熟,一进新考场就懵。模型记住了历史噪声,却没学到未来还用得上的规律。量化里过拟合格外容易发生,因为数据维度高、尝试次数多、市场噪声大。只要参数试得够多,总能凑出一条历史收益曲线很好看的组合。

过拟合有几个经典症状,值得记进备忘单: 参数稍微一动收益就崩;收益集中在少数几笔交易或少数年份;样本内很好、样本外很差;扣完成本就消失;逻辑解释牵强附会;回撤阶段完全无法解释。命中两条以上,就要高度怀疑。

防御手段是成体系的: 减少自由度、保留样本外、做滚动验证、做参数稳定性检查、记录所有实验(包括失败的)、使用简单基准、优先选择有经济解释且交易成本合理的策略。没有哪一招能单独救命,组合起来才有效。

数据挖掘玩到什么地步算过头,看一个真实段子就够了。2021 到 2022 年美联储加息周期里,交易员们发现美联储主席鲍威尔记者会开场白有“规律”:开场说 Good afternoon,市场随后偏跌;说 Hello everyone,市场随后偏涨。这个“开场白指标”在海外社交媒体上病毒式传播,甚至有人做成 TradingView 上的现成指标“押注开场第一词”。可这套东西是个彻头彻尾的数据挖掘伪信号:一年只有 8 次议息会议,样本小到统计上毫无力量;所谓“规律”没有因果机制;它流行的全部原因只是那一小段行情里恰好连续应验了几次。等知道的人多了,信号自然失效——这正是多重检验的活教材:你测试一万个规则,总能挑出几个“历史显著”的,但绝大多数只是随机噪声被抽样框放大了。把这条记住:回测里站起来的规律要能讲出因果故事,讲不出的一律按噪声处理——拿开场白当信号,和拿冰淇淋销量预测溺水人数一样,是噪声的圣杯。

训练、验证、测试:一条只能向前的河 训练集 模型在这里学参数 随便用,用多少遍都行 验证集 用来调超参和选模型 可反复用,但会"被用脏" 测试集 封存到最后一刻 只用一次,报告它 时光 测试集的信息流回前段 = 回测被判作弊 顺序变体:时间序列必须按时间切,不能随机打乱——那是另一种偷看未来

切分不是比例问题,是流向问题:训练集随便用,验证集用来挑超参所以会慢慢被用脏,测试集封存到最后只用一次。任何信息从右往左回流,回测就在作弊;时间序列还必须按时间切,随机打乱等于另一个方向的作弊。

未来函数在你的回测里会怎么开始 典型的不小心: 回复一天的结果来更新信号 比如:你今天要产生交易信号,但你调用了今天的收益来计算波动特征;而这个今天的收益是决策时点后才结算出来的 正确路子:遵守一个'T-1'的时间点规则 在这天产生交易信号前,你只能使用仅当下可见的数据——通常意味着要用 T-1 日(即昨天收盘后)就已经可见的数据 伤害不在情节中,在声势:一个微小的对齐错位,不被察觉的情况下从一个小时掉到一年,就会带来庞大的收益幻觉 最常见的未来函数出现因有:使用“最新发布”的表,而不是“发布日”的表

未来函数不是张三李四的错误,是逻辑上最容易犯的——复权后的价格反凭着净、宏观数据按今天版本对齐昨天,财报按最新口径回填,任何一个都足以拆掉整个回测。

11. 回测报告应该交代什么

一份合格的回测报告,相当于给策略做一次全身体检,项目清单至少包括: 数据来源、股票池、回测区间、基准、调仓频率、成交价格假设、费用和滑点、涨跌停停牌处理、持仓约束、收益风险指标、换手率、容量估计、样本外表现。一项都不能缺。

还要把收益摊在时间轴上看: 策略在哪些阶段赚钱、哪些阶段亏钱。只甩一个最终年化收益,等于只给体检报告首页的总评。你要看它在牛市、熊市、震荡市分别什么表现,看最大回撤发生时市场是什么环境,看超额收益稳不稳定。

鉴别报告成色只需一句话: 如果里面没有成本、没有基准、没有回撤、没有换手、没有样本外,那不是研究报告,只是宣传材料。量化研究的专业性,首先体现在你愿不愿意把不利信息也摆上桌面。

小结

这一章的正文不是让你记住几个孤立名词,而是要把它们放回同一条因果链里。读完后,先用自己的话复述下面几条判断,再顺着“小节回看”检查是否能解释每一步。

  • 回测是拿当时可见的信息在历史里排练策略,不是向未来开具的赚钱证明。
  • 成交假设、交易成本、换手、容量、停牌涨跌停和退市处理,每一项都能显著改写收益。

小节回看

  • 1. 把 3 月 31 日的财报放进 3 月 31 日交易
  • 2. 回测到底在模拟什么
  • 3. 向量化回测和事件驱动回测
  • 4. 调仓频率决定交易问题的难度
  • 5. 收盘价成交最容易骗人
  • 6. 佣金、税费、滑点和冲击
  • 7. 策略到底有多爱动
  • 8. 小钱能赚,大钱不一定能赚
  • 9. 幸存者偏差和退市处理
  • 10. 历史答案背得太熟
  • 11. 回测报告应该交代什么

自测

为什么按当天收盘价成交容易出未来函数?

如果信号也用到了当天收盘后才知道的信息,又假设当天收盘成交,就等于先看了答案再进场交易。

容量为什么会影响策略收益?

资金越大越难以原价成交,冲击成本和流动性约束会把纸面上的机会一口口吃掉。

下一章为什么接在这里

量化里的机器学习: 模型不是越复杂越好

从线性模型、树模型、深度学习和金融噪声讲清模型在量化中的位置。