最近 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 的收费方式)
实现细节
硬币投掷建模为指示器,以便可视化投掷发生的位置(如果多个入场方向相同,符合随机性预期)。
为可视化止损及其移动方式,止损价格计算和逻辑也嵌入到指示器中。止损逻辑有两个阶段:
- 交易开始时,止损价格与收盘价保持给定距离,与之前的止损价格无关。
- 交易进行中,止损价格在可能时调整以跟随趋势。
图表显示
代码会生成两种类型的图表:
- 单次测试运行图表(–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
