阶段6开篇:什么是回测——策略的临床试验
我的掌握程度:
先掌握这个答案
回测(Backtest)=用历史数据模拟策略的完整运行:信号生成→持仓计算→模拟撮合→计入成本→统计绩效。五大组成:①数据(复权价格、财务、股票池);②策略规则(信号→权重的明确映射,无模糊地带);③撮合假设(T+1、涨跌停、成交价格);④成本模型(佣金/印花税/滑点);⑤绩效引擎(净值、回撤、超额)。临床试验类比:策略=新药,历史数据=试验组,样本外数据=未参与试验的对照组——没有对照组的药效宣称都不可信。
先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。
从理解到使用
每一笔收益都要有可执行时间线
打印数据截止时间、信号时间、订单时间、成交时间和持仓收益区间。收盘信号不能乘当天完整收益;次日开盘成交也不能无条件拿到整个close-to-close收益。用原始价格判断可成交性,并纳入停牌与涨跌停。
本阶段实战方法 · 回测先过时序、成交与成本三道关
把信号变成策略收益时,每笔收益必须能追溯到当时能下出的订单。
- 画出时间线:数据可得→算信号→下单→成交→持仓收益;收盘信号不能倒用当天完整收益。
- 明确交易价格、T+1可卖数量、停牌涨跌停、仓位上限和实际成交量约束。
- 同时报告毛/净收益、换手、最大回撤、基准和样本外结果;对滑点与费率做压力测试。
使用边界
- 简单shift(1)只解决部分时序问题;次日开盘成交还要区分隔夜和日内收益。
- 成本应按成交金额与买卖方向计提;0.15%是教学情景,不是统一市场费率。
背景 · 从一个困惑说起
阶段5你学会了挖因子:想法、构造、检验IC。IC 0.05,看起来不错——但「IC不错」到「能赚钱」之间隔着一条大河:因子怎么变成持仓?换手多高?扣完成本还剩多少?极端行情扛得住吗?回答这些问题的唯一办法,是把策略放进历史里完整走一遍。
由此产生的问题
回测的严格定义和基本构成是什么?为什么说它是「临床试验」而不仅仅是「算历史收益」?
核心概念
回测(Backtest)=用历史数据模拟策略的完整运行:信号生成→持仓计算→模拟撮合→计入成本→统计绩效。五大组成:①数据(复权价格、财务、股票池);②策略规则(信号→权重的明确映射,无模糊地带);③撮合假设(T+1、涨跌停、成交价格);④成本模型(佣金/印花税/滑点);⑤绩效引擎(净值、回撤、超额)。临床试验类比:策略=新药,历史数据=试验组,样本外数据=未参与试验的对照组——没有对照组的药效宣称都不可信。
为什么需要它
①验证的唯一途径:逻辑推演无法回答「2015年股灾那天这个策略什么表现」,只有重放历史;②假设显性化:回测强迫你写下所有假设(成本多少、能否成交),每个假设都是未来实盘的一个风险点;③防自欺的训练场:阶段1 q-084的四大杀手(前视/成本/幸存者/过拟合)全部在回测环节埋伏——本阶段的核心任务就是把它们逐个关进笼子。
实际应用场景
回测的两种形态:向量化回测(信号矩阵→权重矩阵→收益矩阵相乘,快,适合研究)与事件驱动回测(逐日撮合模拟订单,慢而真,适合上线前验证)——阶段6先建前者,阶段7后用后者复检。
与之前知识的联系
q-010量化流水线的第③车间正式开工:阶段4的数据(原料)、阶段5的因子(信号)在回测引擎里第一次组装成完整策略。阶段1埋的所有种子(q-043涨跌停、q-044成交约束、q-053成本、q-063前视)在本阶段全部长成代码。
⚠ 常见误解
- 回测=算历史收益:算收益只是结果;回测的灵魂是「每个假设是否诚实」——同样的历史,不同的假设天差地别
- 回测收益好=策略好:先过四大杀手检查(q-084七连问),再谈收益——纸面收益是入场的门票不是终点
- 回测框架网上下载一个就行:用别人的框架而不理解其假设(成本默认值、撮合规则)=把自欺外包给了别人
🛠 本题实践任务
跑通上面30行迷你回测(数据是随机的,重点在流程)。然后回答三个问题:①shift(1)防的是什么?②成本为什么乘换手而不乘收益?③若把shift(1)删掉,夏普会变高还是变低?为什么那是自欺?
💡 提示(先自己想5分钟再看)
①前视偏差;②成本只发生在交易时;③变高——你在用「明天的信号今天买入」作弊(q-063的活案例)。
✅ 验收标准
三个问题的书面回答+一行实测(删shift前后的夏普对比)。这30行代码是你未来回测框架的种子。
在你的浏览器内运行。首次需联网下载 Python;支持标准库和 Pyodide 提供的 NumPy、pandas 等包。行情抓取、系统文件访问和部分第三方库请在本地环境运行。输出自检仅比对结果关键词,不代替逻辑审查。
Python · 独立工作线程 · 执行限时10秒
🤖 AI导师
导师会先检查你的前置知识(量化工作流、正期望、因子概念),再用案例、公式和代码帮助理解。此功能需要先启用服务。