全部文章

开发日志阅读约 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.

打开一个已填好此描述的新回测。

参考来源

测试你自己的想法

用简单的话描述一个策略,看看它在计入成本后的历史表现。

开始回测

更多日志