打败随机入场

打败随机入场

最近,reddit/r/algotrading 上有一些讨论,关于是否能够成功复制已发布的算法交易策略。首先,我复现了130多篇关于“预测股市”的研究论文,从头开始编写了代码,并记录了结果。以下是我学到的一些东西:

因为之前的帖子已被删除,下面是快速总结:

策略无效

  • 如果作者声称某个策略因阿尔法衰退而失效,那么这些测试都是在过去的数据上运行的,但它们仍然无效。
  • 结论:这些策略要么是过拟合,要么是 p-hacking,或者只是微小的阿尔法,但这些阿尔法由于交易佣金的存在,已经被摧毁。

Artem Kaznatcheev 在《算法交易中的复现危机寓言》中写了对复现问题的描述,接着写了关于过拟合的文章。

前两篇文章主要是理论性的(即使第一篇提到实现了130个策略),而《过拟合》则提供了实际的代码。

在这么多讨论中,如何尝试复现一些已发布的策略而不是论文,采用像《过拟合》那样的实际方法呢?例如,出版在一本知名书籍中的策略。

目标:“打败随机入场”。这是这本书第三部分第八章中的一节:

《Amazon - 交易你的财务自由之路》

Van Tharp Institute - 《交易你的财务自由之路》

该书提供了一个结构化的算法交易方法,特别强调了:仓位大小和仓位管理(即:何时退出交易)。这些要远比大多数人认为最重要的入场设置更为关键。

在第八章中,Van K. Tharp 与 Tom Basso 交谈时提到:“从你说的来看,听起来只要你有好的退出方式,并且聪明地调整仓位大小,似乎你可以通过随机入场来持续赚钱。” Tom Basso 回应说,他可能确实可以做到。

规则

  • 基于硬币投掷的入场
  • 始终在市场中——多头或空头
  • 一旦退出信号给出,立即重新进入
  • 市场波动性由10天的平均真实波幅指数(EMA ATR)决定
  • 跟踪止损,距离收盘价3倍波动性
  • 止损只能朝着交易方向移动
  • 固定仓位(1个合约)或1%风险模型(见书第12章)

结果

  • 测试10个市场
  • 固定仓位:80%的时间获利
  • 1%风险模型:100%的时间获利
  • 可靠性:38%(获胜交易的百分比)

缺失部分

  • 测试的市场
  • 测试的时间段

如果“始终在市场中”意味着“今天”关闭交易并在“明天”重新进入,或者意味着同时发出关闭/重新开仓的订单,这一点实际上最容易克服。

对于最后两项,书中提到谈话发生在1991年,并且使用的是期货。为了公平起见,将使用1991年前的期货数据。也假设使用1天的价格条形图,考虑到提到的10天指数平滑移动平均(EMA)。

最明显的问题似乎是如何正确实现算法,但在这种情况下,书籍很好地描述了简单算法及其结果。接下来,我们总结一下第12章中的“百分比风险模型”(书中称为“模型3”)。

最大亏损:限制为账户总值的x%(即:百分比风险)

每合约风险:根据给定的算法,风险为初始止损距离(波动性的3倍)乘以期货的乘数

合约数量:最大亏损 / 每合约风险

复现细节 #

数据

将使用1985至1990年的CL(原油)期货数据(即:6年完整数据)。该合约的规格如下:

  • 每点的最小变动:0.01(即:每点100个tick)
  • 每个tick的费用:10美元
  • 因此,乘数为1000美元/点(100 ticks/点 x 10美元/tick = 1000美元)

佣金

每个合约每次交易收取2.00货币单位(类似IB的收费方式)

一些实现细节

硬币投掷被建模为一个指示器,以便清晰地可视化投掷的发生地点(以及如果多个入场方向相同,这符合随机性预期)

为了更好地可视化止损以及它如何移动,止损价格计算和逻辑也嵌入到一个指示器中。请注意,止损计算逻辑有两个不同的阶段:

  • 当交易开始时,止损价格必须设置在与收盘价的给定距离,并与之前的止损价格无关
  • 当交易进行时,止损价格会在可能的情况下调整,以跟随趋势。

图表显示

代码会生成两种类型的图表:

  1. 单次测试运行图表(–plot选项)。通常在运行单次迭代(–iterations 1)时使用它最为合适。
  2. 散点图,显示运行的盈亏情况。

样本#1

测试运行图表:

**** Iteration:    1
-- PNL: 10482.00
--   Trades 49 - Won 22 - %_Won: 0.45
**** Summary of Runs
-- Total       :        1
-- Won         :        1
-- % Won       : 1.00
**** Summary of Trades
-- Total       :       49
-- Total Won   :       22
-- % Total Won : 0.45

样本#2: 100次使用1%风险模型的测试运行,10次迭代和散点图

**** Iteration:    1
-- PNL: -18218.00
--   Trades 60 - Won 24 - %_Won: 0.40
**** Iteration:    2
...
**** Iteration:  100
-- PNL: 111366.00
--   Trades 50 - Won 26 - %_Won: 0.52
**** Summary of Runs
-- Total       :      100
-- Won         :       50
-- % Won       : 0.50
**** Summary of Trades
-- Total       :     5504
-- Total Won   :     2284
-- % Total Won : 0.41

测试运行混合

对10次测试运行进行了100次迭代,混合了以下变量:

  • 固定仓位为1,或使用1%的百分比风险模型
  • 在同一根K线内执行入场/退出,或在连续K线内执行

结果总结

  • 平均而言,49%的测试运行是盈利的。固定仓位的盈利率接近50%,而百分比风险模型的盈利率波动较大,某些测试运行的盈利率最低为39%,最高为65%。
  • 平均来说,39%的交易是盈利的(波动较小)。

回顾书中的内容:

  • 固定仓位模型,80%的盈利运行
  • 1%风险模型,100%的盈利运行
  • 38%的盈利交易

因此,似乎只有最后一个项目得到了复现。

结论

正如 Artem Kaznatcheev 所指出的,复现危机可能是由于以下原因:

  • 使用了错误的数据集
  • 没有正确实现算法
  • 或者原始实现可能没有遵循自己的规则,或者并非所有细节都已经公开。

注意

无论如何,我个人仍然推荐阅读这本书。未能成功复现特定案例并不意味着这本书不好,书中展示了算法交易的实际方法。

完整脚本

享受吧!

代码也可以在以下链接找到: GitHub Gist