简介
很多流行的交易策略是基于对不同图形化模式的使用: 头肩,双顶/双底,等等。有些策略还会分析图表上极值点的背离。当自动化这样的交易系统时,就会有需要找到、处理和解释图表上的峰谷值,现有的工具不能使赫兹量化总是根据建立的标准来找到极值点,本文展示了根据价格变化,在价格图表上找到和处理极值点的有效算法和程序方案。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
1. 已有的搜索极值点的工具
1.1. 分形和类似的工具
分形(Fractals)是用于找到极值点的流行工具,它们可以在5个柱的序列中找到价格的高点和低点(图 1)。极值点在价格变化强弱的情况下都可以定义,如果正确选择了时段,分形可能会显示很好的结果,尽管它们被市场条件的影响很大。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
图 1. 使用分形的结果: 当存在趋势时,极值点的相对距离大小是从 140 到 420 个点值(pips) (a), 在平盘时期,相对的大小不大于 50 个点值 (b)
在第二种情况下,极值点的相对大小 (从一个极值点到另一个的价格变化) 可能只有几个点值,这样较小的峰谷值通常在人工交易时不做考虑。在时段之间切换并不会改变这些较小的极值点 — 它们在长期平盘时依然出现。
也可能会出现相反的情况: 没有找到所有的极值点。如果出现了剧烈的市场波动,在短期之内出现了很多峰谷值,它们也不能被发现,分形只能在当前时段由5个柱定义的时间段之内侦测到两个极值点。所以,赫兹量化无法推荐在自动交易中使用分形指标来侦测所有或者主要关键的极值点。
在文章"Thomas DeMark 对技术分析的贡献" 一文中指出了分形指标的同样缺点。如果我们选择了一个大的范围来搜索极值点,它们中的很多都会被忽略掉。如果范围太小,又会找到一些微小的极值点。在任何情况下,当处理结果时,赫兹量化或者必须总是人工优化参数来消除那些微小的高价和低价,或者开发一个特别的算法来做这件事。
1.2. 当搜索极值点时使用移动平均
使用平均线,例如移动平均,作为自动化搜索极值点的基础看起来是可行的。搜索是在指定数量的柱上进行的,看价格偏离平均线是否大于预先定义的距离点数。该工具可以排除掉微小的峰谷值,看起来比分形更好。但是,它还是没有解决在高低价格距离很近时侦测的问题 (图 2, a).
编辑切换为居中
添加图片注释,不超过 140 字(可选)
图 2. 当搜索极值点时使用移动平均: 两个极值点定义为一个 (a), 距离移动平均很近的极值点就被忽略了 (b)
赫兹量化可以一起使用移动平均和分形,移动平均用于排除掉微小的极值点,而分形用于在指定的区段中进行搜索。但是,这种方法还是不能解决所有的问题,我们还是需要不断选择最佳的范围参数,否则,两个很近的极值点将只能发现一个 (图 2, a).
使用这种方法还有另一个问题,在强烈波动中,移动平均根据时段可能会忽略掉信号,在这种情况下(图 2, b), 接近两个峰值的谷值和接近移动平均的部分没有被侦测出来,这样的情形在市场上很罕见,但是它们确实提出了正确选择移动平均范围的问题。
所以,这种搜索极值点的方法以及它们上面所述的修改方案都是有缺点的,需要进一步的编程方案。让我们详细探讨当搜索极值点时出现的问题,以及来解决它们的算法。
2. 搜索极值点时遇到的问题和乱局
2.1. 选择用于搜索峰值和谷值的变化范围
已有的策略和技巧可能显式或者隐式地使用了极值点。寻找极值点常常是一项必须的任务:不同的人可能会在同一张图表上找到不同的峰值和谷值。让我们看看一个著名的图形模式 – 双顶。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
图 3. 双顶模式
两个图表 (图 3) 中包含了相同的模式,但是,赫兹量化可能会根据极值点范围的不同侦测到或者未能找到它。在第一个图表上,第一个峰值之后是底部,其后又是第二个峰值。对应地,如果峰值之间没有底部,我们就不能侦测到双顶模式了,该模式会被定义为一个普通的极值点。当底部不明显时,也会发生同样的事情,它会影响到双顶模式而使它难以侦测。当然,在第一个图表上侦测模式与第二个图表相比要容易,而它们之间的仅有区别就是它们相邻极值点的区别。
让赫兹量化讨论另一个例子: 有些策略会在一系列极值点(包括高点和低点)的位置高于前面的点时定义向上的趋势,下行趋势的定义也类似。在图4中, 我们可以使用极值点来定义趋势的方向。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
图 4. 相同图表上价格的相反方向走势: 向上趋势 (a), 向下趋势 (b)
同一个图表上同时包含了向上趋势和向下趋势,在第一种情况中(图 4, a), 极值点 1, 2, 3 和 4 明显显示了牛市趋势,然而,如果我们使用极值点 2, 5, 6 和 3 (图 4, b), 我们将看到一个熊势趋势。所以,有可能使用不同的极值点来取得其中一个可能的结果,考虑到这个,我们可以得出结论,变化范围对极值点的位置有最大影响。
2.2. 有效分离临近的顶部或者底部
当定义极值点时还会产生另一个问题,为了有效定义和分离两个或者更多的顶部,它们之间应该有底部,这在第一个例子(寻找顶部和底部)和第二个例子都是对的,尽管这里的例子更有趣一些,根据所描述的策略,赫兹量化可以在下面的图表中(图 5, 6) 在找到极值点后侦测到趋势。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
图 5. 在长线投资中侦测顶部和底部
编辑切换为居中
添加图片注释,不超过 140 字(可选)
图 6. 侦测小的顶部和底部
如果没有底部把顶部分开(或者相反), 策略就无法根据指定的标准来工作,即使可以在图表上看到向上的趋势。让赫兹量化探讨一个典型例子,在向上的趋势中,每个顶部都比之前的一个更高,如果它们之间没有底部或者不能清楚看到,就只有最高的顶点定义为一个极值点,如果相对平均线(例如移动平均线)来定义极值点, 还是需要有分离相邻两个顶部或者底部的任务,为了分出两个顶部,我们应该使用它们之间的一个极值点。
所以,赫兹量化可以在显式或者隐式使用极值点的所有策略中使用以下假定: 无论是向前(向将来)还是向后,价格都会从顶部移动到底部,再由底部移动到顶部。如果我们不使用这个假定,那么根据观察的角度,价格图表上的两个顶部:
-
或者被侦测出来,
-
或者只有最高的顶部被侦测到,
-
或者它们中的哪个都没有侦测到。
对于底部也是同样。这个假定使我们可以使用选定的变化范围来开发准确的搜索极值点的算法。
2.3. 定义第一个极值点
第三个问题也是与价格变化相关的,并且发生于定义第一个极值点的时候。对于任何交易技巧或者策略,最近的极值点比更早的极值点更加重要,赫兹量化已经发现,定义一个极值点就会影响邻近顶部和底部的位置,所以,如果我们在离当前时间一定距离选择一个极值点,取得的结果比距离更远的历史数据影响更大,并且被最近价格波动的影响会最小。这个问题在使用之字转向指标(ZigZag)的时候也会出现,最近极值点的位置不很依赖于最近的价格波动。
然而,这种情形在从图表末端搜索极值点时就完全不同了,在这种情况下,我们应该首先在距离图表末端最近的地方找到一个顶部或者底部,然后所有其他的极值点就能清晰定义了。根据使用的策略和选择的变化范围,可以使用三个选项:
-
找到最近的顶部,
-
找到最近的底部,
-
找到最近的极值点(顶部或者底部).
让我们讨论找到最近的极值点,在选择了某个变化范围之后,赫兹量化就能准确定义最近的第一个极值点了。然而,这会出现一定的延迟,可能对策略的运行有负面的影响。为了 "看到" 一个极值点,我们需要根据相对那个点的变化范围定义价格的改变,价格的变化需要花费一些时间,所以就有了延迟。我们也可以使用最后的已知价格作为一个极值点,尽管不太可能它真的会变成顶部或者底部。 在这种情况下,看起来使用另外的比例作为变化范围的一部分来寻找其它的极值点比较合理,例如,让我们选择 0.5 的数值, 选择的另外的比例值定义了从当前值到最近底部的最小价格 (对于最近的顶部就是最高价格),这使我们可以把这个底部 (顶部) 定义为一个极值点,如果当前的价格和最近顶部(底部)的差距小于指定的数值,这样的极值点就不成立。在这种情况下,侦测到的第一个极值点可能就是顶部或者底部。同时,我们也解决了过早检测到极值点的问题,以及随后对它们的分析和(如有必要)开展交易。 让我们探讨一个例子,变化范围设为140个点值(pips),将要使用一个另外的比例来侦测极值点。在第一个例子中,它等于 0.9 (图 7, a), 在第二个例子中, 它是 0.7 (图 7, b)。在此,另外的比例值定义了使我们侦测第一个极值点的最小的价格变化点数,在第一个例子中,变化是 126 个点值,而在第二个例子中,它是 98 个点值,在两个例子中使用的是同一张图表。垂直线指出了进行计算时当前的时段。时段内侦测到的极值点以点状显示。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
图 7. 额外比例在定义极值点中的影响: 对于值等于 0.9 (126 个点值), 第一个极值点是在变化 205 个点值找到的 (a), 对于值等于 0.7 (98 个点值), 第一个极值点是在变化120个点值找到的, 而其余的两个点是根据指定范围找到的 (b) 对于第一种情况,选择的额外比例值定义的第一个底部范围是205个点值, 而最小的价格变化是点值,对于第二种情况,如果额外的比例值等于0.7 (98个点值), 第一个底部定义在距离当前价格120个点值的位置。随后的两个极值点事根据指定的变化范围等于140个点值来侦测到的。相应地,第一个底部和随后的顶部的差距略微超过140个点值。第二个底部也是根据价格相对侦测到的顶部超过140个点值来定义的。 赫兹量化可以看到,额外比例会明显影响第一个侦测到的极值点的位置,它也可能会影响到它的类型。对于不同的数值(从 0 到 1), 在相同的图表上可能侦测到顶部或者底部,第二个例子中侦测到的前两个极值点 (图 7 b), 就没有在第一个例子中侦测到。 对于更低的比例值,第一个极值点会更快找到。在第二个例子中 (图 7 b), 是用额外比例等于0.4, 第一个侦测到的极值点可以提前5个柱定义 (在当前的时段下是提前5分钟).
3. 搜索极值点任务的算法方案和它们的实现
3.1根据变化范围来寻找极值点的算法让赫兹量化从选择价格范围来构建极值点开始,显然,柱的大小和极值点的参数非常依赖于时段而有很大变化,存在以及没有顶部/底部也会被趋势、一天中的时间以及其它一些因素所影响。已有的指标,例如分形和类似的工具,使我们可以在任何时段中不论趋势存在与否而找到极值点。如果我们在搜索顶部和底部值的时候使用了移动平均,极值点相对移动平均也许只差两点,也可能差100点。我们在日内交易中应该注意两个点的极值吗?也许不应该。对于一个长线投资,我们同样不会关心小于20个点的极值,不论时段如何, 这就是为什么我们需要“变化范围(variation range)”一词,意思是最小值。移动平均可以作为参考点,使得我们可以定义极值点的距离以限制它的最小值。然而,移动平均的周期数会明显地影响所侦测的顶部和底部的位置,使得难以选择某个周期数作为参考。 所以,让我们现在假定价格从顶部跌到底部然后再回来,这个变化范围就用来定义两个相邻极值点的最小价格变化 - 顶部和底部的距离。如果一些极值点已经被定义,其邻近点的距离应该不小于指定的变化范围,这使得我们可以不管时段和趋势来定义极值点。该工具对于日内交易和长线投资都非常适合, 让我们探讨它的运行算法。首先,让我们使用相同的图表显式地定义极值点,只是在第一个图表上,变化范围是60个点值 (图 8), 而在第二个图表上是30个点值(图 9)。让我们假定第一个极值点已经被侦测到 (点 1) 儿我们正搜索前面的极值点。
编辑
添加图片注释,不超过 140 字(可选)
图 8. 使用60个点值的变化范围
编辑
添加图片注释,不超过 140 字(可选)
图 9. 使用30个点值的变化范围 对极值点的搜索是从图表的末端开始进行的 (从点1)。在第一种情况下,在显示的范围内找到了4个极值点,在第二种情况下,在同样的时间间隔内找到了10个极值点。当在图表的指定部分加大变化范围时,极值点根本没有侦测出来,所以,在选择极值点的搜索范围时我们应该现实些,要考虑到市场的波动和时段。这里,范围是进行搜索的柱的数量。 记住以上我们所说过的,让我们介绍搜索极值点的迭代算法。为什么要迭代?第一个顶部后面总应该有个底部,然后是第二个顶部,等等。如果没有找到第二个顶部 (图表没有向上方移动), 就重新定义底部的位置,然后再转向时间序列中更远的地方。第一个顶部的位置 (其它极值点也一样) 也可以使用同样的方法修改。赫兹量化也应该去掉同一个柱被定义为同时是顶部和底部的情况。 当然,这种方法需要大量的计算,我建议在搜索几个极值点的时候使用它,点的数量越少,程序运行就越快,计算速度也受到搜索范围的影响。这种搜索是要验证的,因为它使您在最近的价格波动中找到影响最大的某些顶部和底部,如果您需要找到多个极值点,我推荐使用之字转向指标(ZigZag)。 3.2指标的实现 下面展示的迭代算法代码使用了少量的迭代以获得更好的效率,这种简化不会造成极值点侦测质量的很大损失,主要的输入参数 — 搜索极值点的点数范围和变化范围。 input int bars=500; // 搜索极值点的范围 input double delta_points=160; // 定义的最小的顶部和底部距离点数的变化范围 input double first_extrem=0.9; // 额外的用语搜索第一个极值的比例 input double reload_time=5; // 时间间隔,重新计算指标值的秒数 程序体重包含了三个嵌套的循环,用于定义四个极值点。在程序的这个部分中只包含定义第一个底部和相关极值点,定义第一个顶部和相关极值点是使用类似方法实现的。 double High[],Low[];