开发日志阅读约 5 分钟
我们的回测引擎内部
一个可以从头读到尾的单次遍历模拟器,46 个逐一检验前视偏差的指标,贴近真实的成交与成本,以及在你相信结果之前对它进行的压力测试。
QuantPrompt 显示的每一个数字,都来自我们自己编写和测试的模拟器。它用纯 NumPy 和 pandas 对价格 K 线做一次遍历,代码短到可以从头读到尾,所以我们能准确告诉你每个结果做了哪些假设。
订单像在真实账户中一样成交
- 信号在一根 K 线收盘时确定,在下一根 K 线开盘时成交。用刚刚用来做决定的收盘价成交,就是前视。
- 每笔交易的买卖两边都计入佣金和滑点,止损和止盈出场也计入滑点。恰好按止损价成交的止损,只存在于回测的幻想中。
- 同一根 K 线同时出现入场和出场信号时,符合当前仓位的一方生效:空仓时入场,持仓时出场。
- 你可以按可用现金的一定比例决定每笔交易的仓位,其余部分保留为现金。
- 期末仍未平仓的头寸按最后收盘价估值并显示为未平仓,而不是被悄悄平掉。
尊重市场日历的指标
夏普、索提诺和年化收益按数据中实际的 K 线密度年化:日线股票每年约 252 根,加密货币 365 根,美股小时线约 1,764 根。如果一律按 365 天计算,股票策略的夏普会被高估约 20%。
46 个指标,每个都经过前视检验
每个指标都用纯 NumPy 和 pandas 编写。一项自动化测试先在一段价格历史上计算它,再在截短后的同一段历史上计算;如果追加后续 K 线会改变任何过去的值,测试就会失败。指标仍在预热的 K 线永远不会触发交易。
与参考实现对照
在依赖它之前,我们把模拟器与一个广泛使用的开源回测库并排运行,使用 60 组随机生成的价格序列和信号,逐根 K 线比较成交价、费用和资金曲线。除了我们刻意更严格的地方(例如止损出场计入滑点)之外,两者结果一致。
在相信结果之前先做压力测试
- 每个结果都与简单买入并持有同一资产并排显示。
- 参数高原分析在相邻参数构成的 9×9 网格上重新运行策略,即在同一数据上做 81 次回测,看优势是一片宽阔的高原还是孤立的尖峰。
- 它还会把成本翻倍、分别测试前后两半区间,并计算最好的三笔交易贡献了多少利润。
- 条件分析依次去掉每条规则,并在历史最后 30% 的数据上评判它——这段数据从未参与比较时的训练。
快到可以反复运行
每次运行只下载一次价格数据,并在所有变体之间复用,因此 81 次回测的扫描只需一次下载。每次运行都会记录解析、数据、指标和模拟各花了多长时间,我们就是这样找到并修复慢的环节。
引擎掌握在自己手里,意味着我们能准确说明它的假设。无法检查的回测,只是一个你不得不相信的数字。
试试这个策略
Buy AAPL when the close crosses above its 50-day SMA, sell when it crosses below. 5% stop loss.