这是“构建更好的策略”系列的第三部分。在上一部分中,我们讨论了10个被广泛利用的市场无效性,并提供了一些交易策略的示例。在这一部分中,我们将分析开发基于模型的交易系统的一般过程。几乎任何事情,您都可以(至少)以两种不同的方式制定交易策略:“理想的方式”和“真实的方式”。我们从理想的开发过程开始,分为10个步骤。
理想的基于模型的策略开发
步骤1:模型
选择上一部分中列出的其中一个无效性,或者发现一个新的无效性。您可以盯着价格曲线,寻找可以由某种市场行为解释的可疑事物。或者反过来,对行为模式进行理论化处理,并检查是否可以在价格中反映出来。如果您发现新内容,请随时在此处发布!
确定模型后,确定将产生哪个价格曲线异常,并使用定量公式或至少使用定性标准对其进行描述。下一步将需要它。作为示例,我们使用上一部分中的周期性模型:
不要低估周期。有传言说,历史上最成功的基金之一Jim Simons的Renaissance Medallion基金可以通过分析周期的长度(C i),相位(D i)和幅度(a i)使用隐马尔可夫模型。不用担心,我们将在示例中使用更简单的方法。
步骤2:研究
找出假设的异常是否确实出现在您要交易的资产的价格曲线中。为此,您首先需要足够的交易资产历史数据:D1,M1或Tick数据,具体取决于异常的时间范围。需要多少数据?尽可能多,因为您想找出异常的寿命以及异常发生的市场条件。编写脚本以检测并显示价格数据中的异常。对于我们的周期模型,这将是频谱:
查看频谱在几个月和几年中的变化。与随机数据频谱进行比较(使用Zorro,您可以使用Detrend函数将价格曲线随机化)。如果您没有发现异常的明显迹象,或者与随机数据没有明显差异,请改进检测方法。如果仍然无法成功,请返回步骤1。
步骤3:算法
编写一个算法生成交易信号。市场无效性通常对价格曲线的影响很小。因此,您的算法在区分随机噪声方面必须非常出色。同时,它应该尽可能的简单,并依赖尽可能少的参数。在我们的“周期模型”中,在正弦曲线的波谷做多,波峰位置做空:
这是系统的核心。现在是第一次回测的时候了。此时的精确性能并不重要-只需确定算法是否具有优势即可。至少在某些市场时期或情况下,它可以产生一系列有利可图的交易吗?如果没有,请改进算法或编写另一种算法,以另一种方法利用相同的异常。但请不要使用任何停止,拖曳或其他铃声。他们只会扭曲结果,并给您带来幻觉,即使没有利润。您的算法必须能够通过纯逆转或至少在定时退出时产生正收益。
在这一步中,您还必须决定回测数据。通常,您需要M1或报价数据才能进行实际测试。每日数据不会。数据量取决于寿命(在步骤2中确定)和价格异常的性质。自然地,时间越长,测试就越好-但越多并不总是越好。通常情况下,追溯到10年是没有意义的,至少在您的系统利用某些实际的市场行为时至少没有意义。市场在十年中发生了巨大变化。过时的历史价格数据会产生非常误导的结果。15年前具有优势的大多数系统在当今市场上都会惨败。但是他们可以通过看似有利可图的回溯欺骗您。
步骤4:筛选器
无效性不会一直存在,任何市场都会经历随机行为时期。对于任何系统来说,至关重要的是要有一个过滤器机制来检测效率是否低下。过滤器至少与交易信号同等重要,甚至更多-但在交易系统中通常会被遗忘。这是带有过滤器的示例脚本:
我们将以主导周期为中心的带通滤波器应用于价格曲线,并测量其幅度。如果幅度高于阈值,则我们得出结论认为存在低效率,我们进行交易。现在,交易持续时间也被限制为最多10个周期,因为我们在步骤2中发现主导周期在相对较短的时间内出现和消失。
在此步骤中可能会出问题的原因是,仅仅因为它可以改善测试结果而倾向于添加过滤器。任何滤波器都必须在市场行为或所用信号算法中有合理的理由。如果您的算法仅通过添加不合理的过滤器而起作用,请返回步骤3。
第5步:优化(但不要太多!)
系统的所有参数都会影响结果,但是只有少数几个参数直接取决于价格曲线来确定交易的入场点和出场点。这些“适应性”参数应该被识别和优化。在上面的示例中,开仓由正弦曲线的相位和滤波器阈值确定,平仓由时间确定。其他参数(例如DominantPhase的滤波器常数和BandPass函数)不需要修改,因为它们的值不取决于市场情况。
适应是一个优化的过程,也是失败的巨大机会,甚至没有引起注意。通常,遗传或蛮力方法可用于在参数空间的利润峰值处找到“最佳”参数组合。为此,许多平台甚至都具有“优化程序”。尽管此方法确实可以产生最佳的回测结果,但对于系统的实时性能完全没有帮助。实际上,最近的一项研究(Wiecki等人,2016年)表明,优化参数越好,系统在实时交易中的表现就越差!这种矛盾效应的原因在于,为了获得最大的利润而进行优化会使您的系统最适合历史价格曲线中的噪声,因为噪声对结果峰值的影响远大于市场效率低下的情况。
除了产生最佳的回测结果,正确的优化还有其他目的:
- 它可以确定系统对其参数的敏感性。如果系统适合某个参数组合,但是当它们的值改变很小时就会失去优势:返回到步骤3。
- 它可以识别参数的最佳位置。最有效的地方是参数鲁棒性最高的区域,即,较小的参数变化对返回值的影响很小。它们不是峰,而是参数空间中宽阔山丘的中心。
- 它可以使系统适应不同的资产,并使其能够交易参数略有不同的资产组合。它还可以通过与实时交易平行的固定时间间隔使其适应当前市场状况,从而延长系统的使用寿命。
以下是参数优化的示例脚本:
这两个优化调用使用一个起始值(在两种情况下均为1.0)和一个范围(0.7..2.0)来确定系统两个基本参数的最佳位置。您可以在优化过程中生成的两个参数的利润因子曲线(红色条)中标识出点:
在这种情况下,优化器将为正弦相位选择一个参数值,对于当前资产(EUR / USD)的幅度阈值,选择一个参数值,约为1.0(不是0.9处的峰值)。平仓时间在此步骤中未得到优化,因为稍后将在实施风险管理时与其他平仓参数一起进行优化。
步骤6:样本外分析
当然,参数优化可以提高该策略的回测性能,因为该系统现在可以更好地适应价格曲线。因此,到目前为止的测试结果毫无价值。为了了解实际性能,我们首先需要将数据分为样本内和样本外时段。样本内时间段用于训练,样本外时间段用于测试。最好的方法是步行分析。它使用滚动窗口进入历史数据以将测试和训练时段分开。
不幸的是,WFA向系统添加了两个参数:WFA循环的训练时间和测试时间。测试时间应足够长,产生足够多的交易次数。训练时间更为关键,训练时间太短将无法获得足够的价格数据以进行有效优化,太长也会产生不好的结果,因为市场在训练期间可能已经发生变化。因此,训练时间本身就是必须优化的参数。
五个周期的前向分析(在上面的脚本中添加“ NumWFOCycles = 5; ”)将回测性能从100%的年度回报降低到更现实的60%。为了仅通过幸运地选择测试和训练时间来防止WFA仍然产生过于乐观的结果,在模拟的起点略有不同的情况下多次执行WFA也很有意义。如果系统有边缘,则结果应该不会太大不同。如果它们变化很大:请返回到步骤3。
步骤7:真实性检查
即使测试现已超出样本范围,但仅通过开发过程(即根据性能选择算法,资产,测试期和其他要素)就为结果增加了很多选择偏见。它们是由系统的真正优势引起的,还是仅由偏颇的开发引起的?确定这一点是战略制定中最困难的部分。
找出问题的最佳方法是White的Reality Check。但这也是最不实用的,因为它要求在参数和算法选择方面有严格的纪律。其他方法不那么好,但是更容易应用:
- 蒙特卡洛。通过改组而不是替换将价格曲线随机化,然后再次进行训练和测试。重复多次并绘制结果的分布图。随机化可消除所有价格异常,因此您希望性能显着降低。但是,如果实际价格曲线的结果位于随机分布峰值的东侧,则很可能也是随机性造成的。那意味着:回到步骤3。
- 变体。这与蒙特卡洛方法相反:将训练有素的系统应用于价格曲线的变体,并希望获得积极的结果。保持大多数异常的变量是过采样,下降趋势或反转价格曲线。如果该系统使用这些变体保持盈利,但不能使用随机价格,则您可能确实找到了一个可靠的系统。
- 真正的样本外(ROOS)测试。在开发系统时,请完全忽略最后一年(2015年)。甚至从您的PC上删除所有2015年价格历史记录。仅在系统完全完成后,才下载数据并运行2015测试。由于2015年数据只能以这种方式使用一次,然后被污染,因此如果2015年系统出现故障,您将无法再对其进行修改。只需放弃它即可。
步骤8:风险管理
到目前为止,您的系统在所有测试中均幸免。现在,您可以集中精力降低其风险并提高其性能。请勿再触摸输入算法及其参数。您现在正在优化平仓。现在,我们可以应用各种尾随停止机制,而不是在开发阶段使用简单的定时退出和反转退出。例如:
- 与其在一段时间后退出,不如将每小时的止损提高一定数量。这具有相同的效果,但是将尽早关闭无利可图的交易,并在稍后结束有利可图的交易。
- 当交易获胜一定数量时,将止损放置在盈亏平衡点上方一段距离处。即使锁定利润百分比并不能改善整体绩效,对您的健康也有好处。看到有利可图的交易回到亏损区域会导致严重溃疡。
以下为示例脚本,其初始定时退出被止损限制所取代,该止损限制在每个柱线处都增加:
当然,您现在必须优化并使用退出参数再次运行前向分析。如果性能没有提高,请考虑使用更好的退出方法。
步骤9:资金管理
资金管理有三个目的。首先,将您的利润再投资。其次,将资金分配到投资组合中。第三,迅速确定交易书籍是否无用。打开“资金管理”一章,阅读作者的投资建议。如果是“每笔交易投入您资本的1%”,您就会知道他为什么要写交易书籍。他可能还没有通过真实交易赚钱。
假设您在给定时间t的交易量为 V(t)。如果您的系统有利可图,那么平均而言,您的资本C将以增长因子c与V成比例地增长:
当您遵循交易书籍的建议并始终以固定比例的资本p投资,从而V (t) = p C(t)时,您的资本将以指数pc指数增长:
不幸的是,您的资金也会随机波动,称为Drawdowns。亏损与交易量V(t)成正比。在无限制提款的杠杆账户上,从统计考虑可以看出,最大提款深度D max与时间t的平方根成正比:
因此,使用固定百分比的投资:
并且在时间T = 1 /(qp)2时:
您会看到,在时间T = 1 /(qp)2左右,无论您的策略有多盈利以及如何选择p,亏损都会吞噬您的所有资本C(T)!这就是为什么1%规则是个坏建议。以及为什么我建议客户不要将交易量与其累积利润成比例地增加,而是与其平方根成比例-至少在杠杆账户上。然后,只要策略不恶化,他们就可以与追加保证金保持安全距离。
根据您是交易一种资产和一种算法还是两者的投资组合,可以使用多种方法来计算最佳投资。还有由OptimalF公式拉尔夫·文斯,凯利公式由埃德索普,或均值/方差最优化的哈里维茨。通常,您不会对您的策略进行硬编码再投资,而是从外部计算投资量,因为您可能会不时提款或入金。这要求总体积是手动设置的,而不是通过自动化过程设置的。在《黑皮书》中可以找到适当的再投资和提款公式。
步骤10:准备进行实时交易
现在,您可以定义交易系统的用户界面。确定要实时更改的参数,以及仅在系统启动时更改的参数。提供一种控制交易量的方法,以及一个“紧急按钮”,以在发生坏消息时锁定利润或套现。实时显示所有交易相关参数。添加用于重新训练系统的按钮,并提供一种将实时结果与回测结果(例如冷血指数)进行比较的方法。确保可以随时随地对系统进行监控,例如通过在线状态页面。不要试图每五分钟查看一次。但是,当您在山顶拔出手机时,会给人留下深刻的印象。阿拉拉特(Ararat)并向您的登山者解释:“只要检查一下我的交易。”
真正的策略开发
到目前为止的理论,一切都很好,但是您如何真正开发交易系统?大家都知道,理论与实践之间存在巨大差距。正如许多经验丰富的算法交易商所证明的那样,这是真正的开发过程:
步骤1:访问交易论坛,找到有关具有惊人回报的新指标的主题。
步骤2:经过长时间的编码会话后,使指示器与测试系统一起工作。如果回测结果看起来不太好,可能犯了一些编码错误,调试,不断调试。
第3步:仍然没有好结果,但是您还有更多技巧。添加尾随止损。现在结果看起来已经更好了。运行一周分析。对于这种策略,星期二是特别糟糕的一天吗?添加一个阻止在星期二进行交易的过滤器。添加更多过滤器,以防止在上午10点到12点之间交易,以及价格低于14.50美元时以及满月(周五除外)交易。等待很长时间才能完成模拟。哇,最后的回测是绿色的!
第4步:当然,您也不会被样本中的结果所迷惑。优化所有23个参数后,进行前瞻性分析。等待很长时间才能完成模拟。但结果看起来不太好。尝试不同的WFA周期。最终,以19分钟的时间段和31个循环,您将获得令人回味的回测结果!而这完全是样本!
步骤5:实时交易。
步骤6:结果看起来不太好。
步骤7:等待很长时间,使您的银行帐户恢复。在等待的过程中写一本交易书。
我已将示例脚本添加到2016脚本存储库中。在本系列的下一部分中,我们将研究机器学习系统的数据挖掘方法。我们将研究价格模式检测,回归,神经网络,深度学习,决策树和支持向量机。