打败随机入场
最近,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的收费方式)
一些实现细节
硬币投掷被建模为一个指示器,以便清晰地可视化投掷的发生地点(以及如果多个入场方向相同,这符合随机性预期)
为了更好地可视化止损以及它如何移动,止损价格计算和逻辑也嵌入到一个指示器中。请注意,止损计算逻辑有两个不同的阶段:
- 当交易开始时,止损价格必须设置在与收盘价的给定距离,并与之前的止损价格无关
- 当交易进行时,止损价格会在可能的情况下调整,以跟随趋势。
图表显示
代码会生成两种类型的图表:
- 单次测试运行图表(–plot选项)。通常在运行单次迭代(–iterations 1)时使用它最为合适。
- 散点图,显示运行的盈亏情况。
样本#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