跳过正文
目录
  1. 教程/
  2. Backtrader 中文教程/

打败随机入场策略

1869 字

最近 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 天价格 K 线(考虑到提到的 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