请 [注册] 或 [登录]  | 返回主站

量化交易吧 /  量化策略 帖子:3365975 新帖:40

自适应算法(第四部分):附加功能和测试

好的名字都没了发表于:5 月 18 日 02:00回复(1)

概述

在开始之前,建议您阅读本系列中的上一篇文章“自适应算法(第三部分):放弃优化”。 这是理解本文所必需的。


在主要系列中操作

交易是按仓位系列进行的。 为交易的金融产品分配开立仓位,因其入场点很模糊,故把资金切分为几部分。 该算法可以预测某个区域发生逆转的概率,然而它不能确切判定价格何时逆转。 因此,为了补偿开仓时发生的错误,根据仓位序列来累积所需交易量。

在上一篇文章中,我演示了该算法如何生成开仓信号,并在若干尺度上同时分析,从而定义最大趋势尺度。 基本操作算法已讲述过了。 价格序列图表并非由一个尺度构成。 同一时刻在若干尺度上显示出趋势,而在其他尺度上则可能是横盘。 此功能应是为了获取盈利。

在此,趋势部分是片段,趋势持续概率超过 50%,而横盘部分,其趋势反转概率超过 50%。 换言之,如果前一块正在增长,那么在趋势部分中,新块也将以高于 50% 的概率增长。 在横盘图表上,增长块大概率其后会紧随下跌块。 我在文章“什么是趋势,以及基于趋势或横盘的行情结构”中详细讲述所提议的定义。

趋势-横盘

图例 1. 不同尺度上的趋势和横盘 

图例 1 在尺度为 0.00061 时 32 个块上显示出清晰可见的看跌趋势。 在尺度为 0.00131 时 32 个块上几乎不存在这种趋势。 在大多数情况下,并发的尺度上会即有趋势,也有横盘。

该算法始终在最小块上开始分析。 然而,块尺寸也许会沿点位明显增长,直到更大尺度的块能够足以包容初始大小的块,从而能够产生新序列的开始信号。 该示例如图例 2 所示。

来自块内部

图例 2. 大尺度块内的走势

图例 2 显示在其中一个块内发生了什么。 我们可以看到在大尺度块上增长很块,但如果我们看向内部,我们就能看到事件是如何发展的。 如果算法已切换到较大的操作尺度,则在此尺度的块内发生的过程有助于获得额外的收益,该收益将在以后能提高算法的稳定性。

这个操作是通过逻辑上相连的的一序列仓位来进行的。 但如果块的尺度极大增加,且初始序列不完整,则可以开始一个新的仓位序列,其独立于前一个序列,但在逻辑上与其有联系。 

我们需要一些条件,以便自前一个不完整的序列开始新序列。 如果我们在主要序列的块大小超过阈值时,简单地开始新序列,那么结果将会很糟糕。 在这种情况下,该算法将无法自适应,因为新序列开始步长是手动设置的。 遵照这种方式,该算法会在长线趋势部分上定期启动新序列,从而增加了资金负担。

长线趋势

图例 3. 大趋势片段上的小尺度振荡

图例 3 展示 2008 年 GBPUSD 的长期看跌趋势。 从这种趋势回滚到序列结束点的时间为 275 天。 更长期限也很常见。 如果该算法一直不进行交易,而是等待价格完全回滚到先前已开仓序列的价位,那将是错误的。 红色椭圆显示的区域里我们无法开始新序列,而蓝色圆圈的区域则显示出附加序列将可赢得利润。

有必要引入基本时间框概念。 在我的工作中,我考虑把时间帧设定在一个块大小。 用于分析的初始数据取自静态 M1 时间帧。 基本时间帧是算法当前所用的开仓时间帧。 该算法从第一个时间帧开始进行行情分析,并逐渐将其增加到覆盖整个工作过程的程度,具体取决于趋势走势的大小。 如果第一个时间帧的块大小等于 10 个点,则第二个时间帧的块大小等于 10*KTF。 此处,KTF 是块大小乘积比率,用于获取下一个时间帧的块。 如果 KTF=1.1 且第一个时间帧块大小为 10 个点,则块大小如下:

TF1=10 点,TF2=10*1.1=11 点,TF3=11*1.1=12.1 点,等等。

主要任务是在没有回滚的长线走势运行中防止开启新序列。 如果我们使用图例 3 中的示例,该算法将扫描所有尺度,若在趋势中期开始了第二个序列,则立刻移至最大或接近最大尺度值的位置。 在这种情况下,第二个序列的基本时间帧的块大小大致等于第一序列基本时间帧的块大小,而这没有意义。

为了令第二个序列信号保持含义,基本时间帧的块大小应超过阈值,此外第二个序列的基本时间帧上应有足够幅度的横盘走势。 该机制展示在图例 4 之中,并已完成开发。

确认序列

图例 4. 第二个序列开始的确认机制

该机制已按以下方式实现。 在第一个序列的基本时间帧超过某一阈值之后,就可以开始第二个序列了。 此后,从第二个序列的第一个时间帧开始搜索过度下跌或增长的块,从而形成第二个序列的开始信号。 它是按照第一个序列的相同方式完成的。 找到第二个序列的启动信号后(已找到足够大的趋势区域),则能确认第二个序列已启动。 为达此目的,我们需要在第二个序列的基本时间帧内找到横盘区域。 这使我们可以确保所发现的趋势区域是横盘区域的一部分,而不是第一个序列操作当中的大趋势。

如果自序列开头分析过 10 个块,并搜索趋势走势(如图例 4 所示),那么应取多少个块来搜索横盘片段? 如果严格设置该值,则算法将失去其适应性。 这意味着块的数量以某种方式取决于市场上正在发生的事情。

为了定义序列确认块数,我们需要设置范围,在其内执行搜索横盘片段。 范围设置用到两个值:

  • Bmin — 第二个序列最小块数的确认范围;
  • Bmax — 第二个序列确认范围的最大块数;
  • NPb(s2) — 第二个序列的主要块数;
  • %PV — 定义横盘的指定百分比。

Bmin 简单地定义为 Bmin=NPb(s2)/(%PV/100)

为了定义 Bmax 范围的上限,我们需要计算第二个序列的基本时间帧块的数量,它即适合于第一个序列基本时间帧的最后两个形成的块,以及第二个序列基本时间帧的块,但其尚未形成大块。 这就是 Bmax 范围上限的计算方法。 

我们来研究图例 4 上的示例。 令 %PV=50,占主导地位的块数是 NPb(S2)=9。 在这种情况下,Bmin=9/(50/100)=18。 可以发现横盘的最小块数为 18。 为了定义 Bmax,计算最后两个大块中的小块数量。 在图例 4 上,有 14 个块。 接下来,计算靠近最后一个大块右侧的小块数量。 它是由 5 块构成。 接下来,定义合计 14+5=19。 结果范围是 Bmin=18,Bmax=19。 

接下来,在第二个序列的基本时间帧的 18 到 19 个块的范围内搜索横盘片段。 若片段里下跌块的数量等于上涨块的数量,则段被认为是横盘。 横盘片段标准可以在设置中调整,由于 50% 的范围太窄。 我们可以设置为 50-55%,并假设如果占优势的块数是从 50% 到 55%,那么这一段是横盘。

在计算过程中,Bmax 也许会很大,而 Bmin 则是一个浮动值。 因此,对于不同数量的块,采用固定百分比定义横盘片段是错误的。 把该值设置为落入范围的概率,然后再将其转换为百分比会更合理。 下表 1 就是这样做的。

序列确认表

表 1. 确认序列块数百分比的计算表

若令 16 个块中相同方向块的 56.25%作为横盘片段标准。 该百分比对应于落入自第 2 到第 16 块垂直范围内所有事件的 80.36%。 这意味着在 80.36% 的情况下,该过程在 16 个块内垂直从第 2 个块穿至 16 个块。 利用该表,考虑到确认百分比均应落在所有事件的 80.36%幅度范围内,故可针对每个独有数量的块重新计算序列确认百分比。

我们可利用该表针对 Bmin-Bmax 范围内的每个块数计算相关的序列确认。

这种机制允许在前一个序列尚未闭合时开始新的仓位序列,并减少实例数量;若第二个序列的块大小等于第一个序列的块大小,而第二个序列变得无意义 。

在开始时,第二个序列的操作方式与第一个类似。 换言之,该算法包含跟踪趋势和调整当前交易尺度的所有机制。 

第二个序列一开始,该算法就开始跟踪其基本时间帧的块大小。 当其超过阈值时,根据上述条件开始第三个序列。 这样可以根据需要创建尽可能多的附加系列

它如何运作

作为示例,我们来研究图例 5 中显示的图表部分。 这与图例 3 所示相同。 对于算法,此部分非常复杂,因为它需要等待很长一段时间才能回滚平仓。

开仓

图例 5. 同时创建多个序列

图例 5 展示该算法在长期趋势下的行为。 当主要序列以“买入”开仓开始之后,由于基本时间帧块变得太大,从而令算法创建第二个和第三个序列列,而不必等待基本序列闭合。 这种方式允许使用较小尺度的价格走势,并获得额外的利润,来平滑资金的波动。

我们来研究两个价格相同的部分,并评估这两个时间点的资金回撤。 第一点位于 2008.11.13,价格为 1.45554,第一个序列已开多头仓位,然而价格与持仓相背而行。 资金包括 $8265.16。 然后价格继续下跌,并于 2009.10.10 返回到 1.45554。 但现在资金已经增加了 $1677.57,其共包括 $9942.48。 如果价格走向与我们的持仓相背,则与不使用附加序列机制的情况相比,所获得的回撤就不会太大。

当在大尺度上进行交易时,而若采用发生在较小尺度上的资产价格波动,则可大大降低风险。 自动尺度令我们能够始终以在相关尺度上进行交易,而附加序列确认机制则提供了适应当前条件的功能。


亏损仓位及决策错误的补救

趋势定义和自动尺寸方法效果很好,但并不完美。 在其操作期间,该算法在时间外开仓。 在延申趋势的开始时开仓,可能会导致仓位序列在平仓点位亏损。 平仓点无法平移,因为它是根据价格序列参数计算得出的。 趋势回滚计算已在上一篇文章自适应算法(第三部分:放弃优化”中讲述过了。 不过,它能够检测并纠正错误仓位。

利用附加序列的利润来纠正错误仓位

附加序列算法的目的之一在于纠正错误仓位。 在上一篇文章中,我展示过平均价格走势是根据所取步骤数以非线性增加。 相应地,错误开仓的平均亏损从所取步数开始以非线性增加。

平均亏损

图例 6. 亏损增加的法则取决于经历的步数

图例 6 展示一个近似法则,定义持仓的平均亏损增加。 但每个金融产品的参数略有不同,最重要的是,曲线形式或多或少保持相同,这意味着该参数可以测量。 该法则令我们能够预测错误开仓的平均亏损,并展示利用附加序列的盈利来补偿错误开仓的可能效率。

取用从附加序列中获得的部分盈利补偿错误开仓的亏损。 我在自己的设置中令此参数可自定义。 一些获得的利润将被耗费在支持算法的可靠性。 算法越优秀,令算法保持稳定的利润百分比耗费越少越好。 现在,我采用附加序列利润的 80% 来弥补亏损仓位。

一种简单的方法可被应用于检测错误开仓。 如果序列在一序列平仓参考点位得到亏损,则肯定有错误开仓。 在该序列的所有仓位中,我们找到亏损最大的仓位,并评估该仓位在当前点位的损失。 如果该仓位属于第一个序列,那么从第二个序列中抽取所获利润的 80% 来弥补该持仓的当期亏损。 如果满足条件,则该持仓被平仓。 

资金在操作期间逐渐积累。 它们将用于补偿亏损仓位。 必要时,这些资金将用于弥补持仓的亏损,并从预备金中抵扣因平仓而产生的亏损。 该算法继续积累预备金,作为下一笔亏损的补偿。 这一直持续到所有错误仓位都被平仓,或主要序列结束为止。 主序列完成后,预备金中所有未结算的资金都将清零。

第一个序列的错误开仓保留在市场中,直到第二个序列的利润能够覆盖它们,从而一起平仓后利润等于零。 对于序列的其余部分,它的操作原理相似。 第三个序列的利润用于补偿第二个序列的错误仓位,依此类推。 

图例 5 展示第一个序列的某些多头持仓未等待该序列的一般平仓点位,即以亏损平仓。 发生这样的情况,是由于亏损补偿算法激活。

因此,第二个序列中可供获利的波动始终小于第一个序列的趋势幅度。 第三个序列的趋势幅度甚至更小。 附加序列不会导致明显的净值回撤,而是会带来额外的利润,其可用于维持稳定。同时开立的附加序列数量仅取决于当前的市场状态,而非由交易商配置。 这是另一个自适应函数。 该算法本身具有分形结构。 它在不同的尺度复制自身。 与此同时,它会分别调整每个尺度的操作。

基于较小尺度波动纠正序列平仓点位

如我先前所写,序列的平仓点位(从主要趋势回滚)取决于回滚速度。 速度是按价格回滚所需的步数来衡量。 步数越高,自趋势走势的回滚则越小。 此功能与趋势出现的基本面原因相关联。 趋势创建的成交量超过了当前的流动性。 换言之,大量开仓或平仓。 引发趋势走势的条件仓位应被平仓。 这需要流动性。 如果立即平仓,则回滚为之前趋势的 100%,也就是说,将出现方向相反但完全相同的趋势走势。 但平仓的速度越慢,回滚就越少。 在这种情况下,走势是由单个或多个市场参与者引发的都无所谓。 机制是相同的。

该算法基于计算基本时间帧块的数量来调整平仓点位。 在大尺度上,这略显不足。 大尺度块具有自身的价格波动,由于块只是为方便起见而创建的价格走势的条件示意,因此也应考虑调整平仓点位。

最正确的做法是计算所有东西,并考虑所有波动。 但出于简单起见,我将以不同的方式进行操作(该算法已经相当复杂)。 我打算利用一个金融产品的附加序列盈利来调整平仓点位。 这会占用附加序列所获利润的 80%。 如果所有持仓均在参考点位平仓,我们计算该序列将会获取的利润金额(以存款货币计)。 附加序列的当前可用利润被添加到该序列的当前利润之中。 如果所获利润值在平仓点位超过或等于所计算的利润,则主要序列已完成。 回滚被认为已经结束,且该序列已完成。

平仓点位

图例 7. 根据附加序列的利润调整平仓点位

图例 7 基于附加序列的利润显示调整平仓点位。 持仓应在 1.69846 上方平仓,获利 $915.66。 当价格达到 1.60887 时,当前利润级别为 $109.35。 然而,由于大幅波动,附加序列能够赚取 $1009。 利润的 80% 可用来平仓更早的序列。 这意味着有 $807.2 可用。 检查不等式 109.35+807.2=916.55>915.66,且该序列早前已完成。

这令我们可以更准确地定义平仓点位,并降低回滚虽已结束,而序列尚未平仓的情况。

取用从其他资产交易中获得的利润来纠正错误仓位

上述算法可以降低资产波动性。 不过,该系统旨在同时操控 28 种金融产品的交易。 某些交易的金融产品可能长时间处于过度上升或下跌趋势的状态。 我们需要取用其他金融产品在第一个序列平仓时所获得的利润,以便进一步降低可盈利图表的波动性。 

若某些交易金融产品的趋势伴随着其他交易金融产品的横盘,则此操作方式是有效的。 图例 6 展示了一个近似定律,用以解释依据步数单一金融产品的平均波动幅度如何增加。 知道了法则,就有可能按同一方法预测 28 种交易的金融产品的发展。 换言之,价格经过的平均距离垂直近似等于步长乘以步数的 0.5 次幂(对于不同的金融产品和市场,幂是不同的)。 为了更加清晰,最好取 28 种交易的金融产品,并计算在 n 步内它们能够通过的平均距离,并将其显示在图表上。

那么,我们如何在单一图表上描述 28 种所交易的独立金融产品? 它们每个都有自己的波动性和不同的波动范围。 众所周知,每种交易金融产品的行为都不相同。 我们从图中可以看到,它们不只是在形式上相似。 如果我们以单一货值(例如,USD)而非点数来重新计算烛条的大小,并假设我们以固定的 USD 金额进行交易,则每种金融产品的尺度和波动性都大致相同。 在交易系统中,决定性因素是当交易金额固定时,价格在 n 步之内价格经过的垂直 USD 金额。

我们应该从点位图形转到盈利图形。 在此,我说的是进行交易时以固定金额而非固定手数。 这些是完全不同的东西。 假设每种金融产品以货币对进行交易,每个货币对金额为 $1000。 在这种情况下,根据货币对格式,我们有四类等式。 我们来根据以下等式重新计算从点位变换到 USD 的烛条大小:

  • 公式 EURUSD;
  • 公式 USDCAD;

  • 公式 eurgbp;

  • 公式 cadchf.

在等式中: 

  • EURUSD, USDCAD, EURGBP, CADCHF — 当交易预备金为 $1000 时,对应货币对的烛条尺寸以 USD 计算;
  • EURUSD(-1), USDCAD(-1), EURGBP(-1), CADCHF(-1) — 前一根烛条的收盘价;
  • EURUSD(0), USDCAD(0), EURGBP(0), CADCHF(0) — 最后一根形成的烛条的收盘价;
  • 1000 — 成交金额,以 USD 为单位。

我们来研究一下 EURUSD 及所有货币对的第一个等式,成交是以货币对里第二个位置的货币金额执行。 成交的合计金额为 $1000。 在这种情况下,定义烛条尺寸的逻辑如下: 卖出 $1000 -->> 在前一根烛条(-1 烛条)的汇率价位买入 EUR -->> 盈亏 $1000,按最后一根收盘的烛条汇率价位 (0 烛条) 执行反向 EUR 成交 -->> 取花 $1000 买入 EUR 的那根烛条 (-1 烛条) 的汇率价位,减去盈亏 $1000 后卖出 EUR 的那根零号烛条的汇率价位 -->> 针对 EUR 成交所获的盈利/亏损转换为当前 EURUSD 汇率对应的 USD 值 -->> 即为获得的盈利/亏损 USD 金额。 这就是我们如何以 USD 为单位定义烛条尺寸的方式。 

接下来,为了构建以 USD 为单位的烛条尺寸图形,将每根后续烛条的尺寸添加到前一根烛条的尺寸当中。

对于 USDCAD 和其他以 USD 居首的货币对,计算更为简单。 业务均 USD 执行。 对于交叉盘汇率,计算与 EURUSD 等式类似,除了在 EURGBP 对里,应将 $1000 转换为 GBP,然后执行交易操作,最后将所得到的以 EUR 为单位的利润转换回 USD。 对于 CADCHF,其思路与之前的选项相似,但计算是通过 USD 居于首位的货币对进行的,因此可以通过相应的方式修改等式。

在任何情况下,操作背后的思想是计算 USD 金额,它可能是每个货币对在给定幅度里交易时赚取、亏损的合计 $1000。 

在该算法中,第一个序列中每个金融产品在平仓时获取的整体利润的 80%,用来补偿某一金融产品的错误仓位(若此产品需要这种补偿的话)。 因此,整个算法按时把任何正在交易的金融产品上的“过多持仓”平仓。 其目的是尽快把错误的持仓平仓,从而令长期趋势部分不会导致大量的净值回撤。 这将减少获利能力图形的波动性。

28 个货币对

图例 8. 10,000 步中 28 个货币对的路径

图例 8 示意采用上述等式同时计算的 28 个货币对的利润图。 该图形是依据 10,000 根 H4 烛条构建的。 所分析的周期从 2004 年至 2010 年中期。 Excel 文件附在文后,如此您能够插入数据,并查看构建图表的等式。

图例 8 展示某些货币对上出现了趋势,而在另一些货币对上检测到了横盘。 这确认了一个可能性,即,所有金融产品同时进行交易而获得的利润用于错误开仓的补偿,可以降低获利能力图形的波动性。 总是会有一个交易的金融产品,该算法可据其赚钱。

不仅对于外汇市场这是种典型行为,对于有些需要预备金的股票市场也如此。 外汇市场的价格上涨和下跌通常是对称的,而股票市场则是非对称的。 外汇和股票市场的发展大致相同,唯一的不同之处在于股票市场会显示出上行背离,以及资产之间高度的相关性。 但如果我们取自不同国家交易所的交易金融产品,则相关性会显著降低,甚至达到资产之间的负相关性。

此外,我已修改了所有交易金融产品的平均烛条大小(以 USD 为单位)。 它含有 $2.26。 已知步数和平均步长,就可以评估所有金融产品的平均垂直走势。 $2.26*10,000^0.5=$226。 实际上,所有交易金融产品在 10,000 步之内平均移动了 $216.41,接近理论值。

在该算法中,第一个序列中每个金融产品在平仓时获取的整体利润的 80%,用来补偿某一金融产品的错误仓位(若此产品需要这种补偿的话)。 因此,整个算法按时把任何正在交易的金融产品上的“过多持仓”平仓。 其目的是尽快把错误的持仓平仓,从而令长期趋势部分不会导致大量的净值回撤。 这将减少获利能力图形的波动性。

图例 9 展示了它是如何操作的。 选择非相关的金融产品进行测试。 测试本身是依据 2020 年的 M1 进行的。 应该注意的是,这些设置并未进行过优化,且所有金融产品的设置均类似。 该算法可实时调整其操作。

GBPUSD+AUDNZD

EURCAD+CHFJPY

GBPUSD+AUDNZD+EURCAD+CHFJPY

图例 9. 多金融产品补偿功能

首先,测试是依据单独的货币对进行,以便评估每个货币对的获利能力图形。 然后,在启用补偿模式后,同时依据四个货币对进行测试。

我们可以看到,资金回撤最大的是 GBPUSD 共计 $4311。 在 GBPUSD 上也检测到最大获利能力,等于 $1555。 与此同时,由于测试停止,AUDNZD 出现亏损 $109。 如果测试继续下去,该货币对的交易应该也可盈利。

多金融产品补偿算法能够在测试期间同时减少四个货币对的资金回撤,从 $4311 降至 $3517,即降低 18%。 总获利能力已变为 $2015.21。 单独交易期间完成的交易总数为 1446,联合交易期间则减少到 1409,这表明补偿算法实际上不影响交易过程,但提高了操作的稳定性。

因此,利用更多的交易金融产品进行交易时,譬如同时来自世界各个交易所和市场的 1000 种交易金融产品,得到的收益图形会更为平滑(可达线性)。 我们能够同时交易股票、货币、甚至加密货币,并以适当的方式平衡每种交易金融产品的交易量。


测试

该算法应适用于任何交易金融产品。 故,我将首先展示它在 AAPL(苹果)股票上如何运作。 在该时刻,EA 无法收集金融产品的统计参数。 此功能正在开发中。 这就是为什么我需要手工配置两个参数的原因。 这些是开启和关闭一个序列的百分比。 不过,该参数值是利用集成在 EA 里的指标测量而来,而非利用优化和拟合。 EA 在将来会自行调整这些参数值。

AAPL 买入 

AAPL 买入的测试器报告

图例 10. AAPL (仅含多头仓位)

由于金融产品的统计特征对于上升和下降不是对称的,因此测试分别针对买入和卖出仓位执行。 对于“买入”仓位,参数较为激进,而对于“卖出”仓位,参数较为保守。 仅两个参数有变化。

图例 10 显示了从 2012.06.24 到 2020.12.28(7.5 年)的回测结果。 测试在 М1 上进行。 获利能力图形很平滑,净值的最大回撤为 $858,而获利则为 $1704。 开仓总数为 176,盈利因子为 18.13,这是一个优秀的信号。

有人可能会说:如果我们打算仅通过开立多头仓位来从不断上涨的 AAPL 股票中获利,不需要如此复杂的算法。 他们是对的。 我们来看看如果只允许开立空头仓位,该算法的行为。 针对苹果股票建立空头仓位似乎是一个自杀的主意,但假设该算法具有适应性。 因此,我们来看看它是否能生存。

AAPL 卖出

AAPL 卖出的报告

图例 11. AAPL (仅含空头仓位)

图例 11 显示了 AAPL 股份的算法结果,2012.06.24 到 2020.12.28,依据 M1。 它们不如“买入”仓位优秀,但是该算法仍然设法赢得了利润。 在此,最大的净值回撤为 $10533,而获利能力为 $2234。 盈利因子则要低得多,等于 1.4。 开仓总数为 944。 如果能够双向买卖,则结果会更好,这是因为错误的仓位补偿算法降低了获利能力图形的波动性。 当同时交易 28 个交易金融产品时,结果会变得更佳。 该算法的能力能够在近乎自主的模式下通过 7.5 年回测,且无需参数与历史拟合,这是一个很好的结果。

现在,重要的是它能够自适应困难的条件。 我决定针对 AAPL 进行测试是有原因的,因为这一交易金融产品对于做空交易十分困难。 我们来看看测试期间的金融产品图表。

AAPL 图表

图例 12. AAPL 图表 从 2012.06.24 至 2020.12.28

图例 12 显示 AAPL 股票的强劲增长。 在过去的 7.5 年中,该资产增长了 6.3 倍。 在这样的图表上,仅靠自动交易,且无优化的情况下获利是一项非常具有挑战性的任务。

该算法旨在同时交易 28 个金融产品。 所以,测试是在 28 个交易金融产品上进行的。 首先,我们来看看操控 FOREX 的结果。 测试中用到了以下货币对: GBPUSD, EURUSD, NZDUSD, AUDUSD, USDCAD, USDCHF, USDJPY, EURGBP, EURAUD, EURNZD, EURCAD, EURCHF, EURJPY, GBPAUD, GBPNZD, GBPCAD, GBPCHF, GBPJPY, AUDNZD, AUDCAD, AUDCHF, AUDJPY, NZDCAD, NZDCHF, NZDJPY, CADCHF, CADJPY and CHFJPY。 所有货币对都具有完全相同的设置。 该算法可实时适应所有变化。 

该测试执行条件:2008.01.01 至 2021.01.13(13 年),M1。 EA 消耗多种资源,一年的测试大约需要 12 天。 因此,整个测试间隔切分为 1 - 2.5 年的区间,然后并行进行测试。

2008-2009

2009-2010

2010-2011

2010.06.24. -2012.06..24

2012.06.24 - 2014.06.24

2014.06.24 - 2016.06.24

2016.06.24 - 2018.24.06.24

2018.06.24 - 2021.01.13

图例 13. 从 2008.01.01 至 2021.01.13 测试 28 个货币对

图例 13 同时显示 28 个货币对的测试。 正如我们所见,除了从 2012.06.24 至 2014.06.24 的时间段之外,几乎所有测试时间段的交易均以获利结束。 在此,测试完成时亏损了 $123。 这是因为测试已停止。 如果测试持续进行 13 年,则 EA 将会摆脱回撤。 持仓总数为 14,415。 该统计值明显表示所得到的结果不是随机的。 净值回撤已有足够的数值。 不过,未来的算法版本应具有改进的盈利能力和稳定性参数。 

鉴于 EA 的多功能性,因此我们来看看它在 MOEX 上如何操作交易俄罗斯公司的股票。 这些设置与应用于货币的设置相同。 不过,只允许多头开仓。 当前的 EA 版本尚无法分别调整空头和多头的开仓参数。 此功能目前正在开发之中。 该测试执行在 2013.02.01 至 2018.09.20 区间(5 年 7 个月)。 测试器中指定的杠杆为 1:5。 投资组合中包含流动性最高的金融产品: GAZP, CHMF, ALRS, HYDR, LKOH, MAGN, MGNT, MTSS, NLMK, NVTK, ROSN, RTKM, SBER, SNGS, SNGSP, TATN, VTBR, SBERP, TATNP, AFLT, FEES, GMKN, RSTI, SIBN, UPRO, MSNG, MTLR 和 PLZL。

moex

图例 14. 从 2013.02.01 至 2018.09.20,针对 28 家俄罗斯公司股票进行了测试

图例 14 显示 28 家俄罗斯公司股票的测试结果。 该算法的收益十分持久且均匀。 就像在前面的案例中一样,利润率很低,但最重要的是,它仍然保持盈利。 持仓总数为 5485。 这表明结果在本质上不是随机的。 

利润来源

开发有效的算法或模型还不够。 另一个重要的组成部分是了解其工作原理,以及利润来源。 在这种情况下,赚取的利润来源无法观测,即来自熵增。 我说的是由玻尔兹曼原理判定的熵,其特征是可能的系统状态数量和特定状态的概率。

换言之,市场中的熵近似恒定。 一个金融产品的流动性越高,该金融产品价格图表的熵就越高。 金融产品上执行的交易操作数量的增加,可能状态的数量也随之增加,并且系统会努力占据最可能的状态。 当熵本身近似恒定时,会产生熵增效应,但系统的可能状态数量会增加。

在外汇市场上可以看到熵值最高,而在低流动性资产上可以发现熵值最低。 每个特定交易金融产品的熵倾向于变成最高,但是资金的流入阻止了这种情况的发生。 资金流入增加有两个原因:资产的投资吸引力和资金投放。 每种交易金融产品的熵最终都会增长。


总汇

其获利能力十分低下,但文章展示的全自动盈利交易的模型,是在不同的行情基本面及完全不同的金融产品上进行。 测试显示的是针对 57 个交易金融产品的结果。 由于它们具有相同的参数,因此等效于单个交易金融产品 520 年的测试。

  • 我已开发完毕基本算法,能够可靠工作,且有改进空间。 所述的每个机制均应当加以改进,从而显著提高盈利能力,并降低资金回撤。 
  • 在前一篇文章中,我写了两种跟踪当前趋势的方法。 它们在“延迟开仓”段落中进行了讲述。 采用“趋势分段延迟”方法基于 28 种交易金融产品进行了测试。 这并非最佳方法,因为“基于金融产品统计特征的延迟”效果更好,但该算法尚未完成,故我仅采用了操作功能。 在算法的未来版本中,此功能会得到显著改善。
  • 为了减少错误开仓的数量,需要对数据进行额外的分析,以便初步筛选最小块大小。
  • 该算法并未考虑资产价格差异,从而导致基于这些资产的大宗价格差异。 这明显降低了外汇金融产品的盈利能力。 我们需要根据每个特定资产的大宗价格,通过投资组合来为手数大小增加平衡。
  • 还必须对多头和空头开仓的决策算法实现单独的管理,并增加对每种特定交易金融产品的统计参数和不对称性的分析。
  • 全部利润的 80% 用于维护算法的稳定性。 亏损补偿机制、决策机制,两者均需完善。 这大大提高了盈利能力。
  • 该算法无法收集每种交易金融产品的统计参数,且目前仅应用了自适应机制。 在下一个版本中,将根据交易金融产品的统计特征来调整参数,从而彻底地自动提高盈利能力。 
  • 尚未用到货币对和股票价格图表之间的差异。 该模型应通过添加现有知识点来改进。

    之前此主题的文章

    • 自适应算法(第三部分):放弃优化 – 本文随附了所讲述的 EA 的需求规范。 该版本针对 FOREX 和 MOEX 上 28 种金融产品的测试,几乎完全符合需求规格。
    • 开发自适应算法(第二部分):提高效率
    • 开发自适应算法(第一部分):寻找基本形态
    • 什么是趋势以及市场结构是基于趋势还是横盘?
    • 价格序列离散化、随机分量和噪声 – 在本文中,我解释了为何我决定分析块状图来替代烛条图。

    全部回复

    0/140

    量化课程

      移动端课程