量化研究 | 埃勒斯循环_成交量的高通滤波器V2

财富   2024-11-11 16:02   山西  

量化策略开发,高质量社群,交易思路分享等相关内容

上一次在第一部分,我们介绍了一种名为Ehlers环的新图表风格,它可以通过显示的特性帮助你获得预测性的洞察。这一次,我们将通过一个配对交易的例子来看Ehlers环的实际应用。配对轮换是一种策略,其目标是在同时最大化资本回报的同时最小化资金回撤。它的工作原理是在两个证券中只持有一个多头头寸,取决于任何时候哪个更强。例如,它可以应用于两个通常负相关的行业ETF,形成一种行业轮换投资。如果你的目标是击败标准普尔500指数,那么你可以选择一只股票和一个ETF SPY作为另外两个选择。在这种情况下,当股票相对于SPY表现强劲时,你会持有股票;当SPY表现更强时,你会持有SPY。关键在于知道何时从一个证券轮换到另一个证券。

我开发了Ehlers环作为一种可视化一个数据流相对于另一个数据流表现的方法。最初,我使用Ehlers环来绘制价格与成交量的对比图,然后获得对运动和方向的洞察。然而,我发现Ehlers环也是确定配对轮换策略时机的理想工具。在Ehlers环中,配对中的两个证券分别通过相同的高通滤波器和SuperSmoother滤波器进行过滤,因此结果是带限的数据流,名义上的平均值为零。过滤后的数据以标准差为单位进行缩放,以保持一致的解释。

Ehlers环可以顺时针或逆时针旋转。当你将一只股票与一个参考对象(例如,SPY)进行对比时,你希望在垂直上升运动最强时持有该股票多头,而在水平向右运动最强时持有参考对象多头。在环中,有八个条件影响时机。每种旋转方向的多头头寸条件分别在图1和图2中显示。

图1:条件,顺时针旋转。在埃勒斯循环中,有八个条件影响时机,如图所示。当绘制一只股票与参考符号(例如,SPY)相对比时,理念是在竖直上升动作最强的条件下去做多这只股票。埃勒斯循环可以顺时针或逆时针旋转。

图2:条件,逆时针旋转。埃勒斯循环可以顺时针或逆时针旋转。当绘制一只股票与参考符号(例如,SPY)相对比时,理念是在水平向右移动的最强条件下去做多参考符号。









一个配对轮换交易的例子




配对轮换最好通过例子来描述。在图3中,从2021年8月到11月的四个月里,雷神技术公司(RTX)与SPY进行了对比。在8月1日的开始,图表垂直移动,所以推荐的头寸是持有RTX多头。到了8月10日,开始了顺时针旋转,这表明要轮换为持有SPY多头。但到了8月18日,顺时针旋转的信号表明在两个证券都朝下行方向时,最好是退出市场。到了8月26日,旋转转变为逆时针,这表明应该持有SPY的多头头寸。9月8日旋转再次变为顺时针,这是一个不持有SPY多头的信号,所以最好的交易选择是持有RTX的多头。顺时针旋转持续到SPY接近-3个标准差,RTX接近2个标准差。在这段时间内持有RTX的多头头寸是最好的交易决策。Ehlers环在10月13日从最大垂直位移撤退,这表明应该持有SPY的多头。实际上,从其负的最大偏移量持有SPY多头也不是一个坏的替代交易决策。

图3:埃勒斯循环图表,RTX对比SPY。这展示了如何使用埃勒斯循环图表来帮助确定长线头寸的时机,在这个例子中是交易雷神技术公司(Raytheon Technologies Corporation,简称RTX)与SPY的对比。关于头寸的决策是基于运动的曲率和旋转方向作为时间的函数。因此,随着埃勒斯循环图随时间推进,根据循环的曲率和旋转方向,会发出买入RTX或SPY(或不持有任何头寸)的信号。这种基于埃勒斯循环的配对轮动方法的目标是最小化资金回撤并最大化资本回报。

Ehlers环的顺时针旋转持续到11月9日,当小的摆动引起关注时,但由于当时接近+2个标准差,最好的决策是退出SPY的多头头寸。到了11月12日,Ehlers环建立了逆时针旋转,这意味着持有SPY或RTX的多头都不是好时机。直到11月底都保持平仓交易位置。




绘制Ehlers环 






在变量声明后,为了计算效率,高通和SuperSmoother滤波器的系数只在数据的第一个条形图上计算。然后,Price1和Price2分别在相同的滤波器中单独过滤。结果,两者都是带限信号,名义上的平均值为零。它们的均方根(RMS)值被计算为它们平方的指数移动平均(EMA),而EMA系数0.0242对应于一年的关键周期。将每个值除以它们各自的RMS值,将它们缩放到都可以用标准差来绘制。

Price1和Price2的过滤和缩放值被传统地绘制出来。此外,它们的值被导出到一个文本文件,以便可以使用Excel绘制Ehlers环。Price1沿着水平轴绘制,Price2沿着垂直轴绘制。关于文本文件应该采取几个预防措施。首先,你的计算机必须有一个C:\Temp文件夹来存放导出的文本文件。其次,Excel文件在实时交易期间不能打开,因为尝试写入一个打开的文件会导致指标崩溃。

在Excel中绘制Ehlers环,只需高亮显示所需日期范围的B和C列,然后点击插入并选择“带有平滑线和指标的散点图”。



要点 




所以,Ehlers环是一种新的方法,可以根据Ehlers环中运动的旋转曲率和方向,作为时间的函数,来自由裁量地最小化资金回撤并最大化资本回报。值得记住的是,价格移动超过一个或两个标准差意味着有很大的反转概率。

以下是本文讨论的一些要点:

Ehlers环是一个工具,可以根据价格与成交量图表中的旋转曲率和方向,自由裁量地预测最佳轮换时机。

Price1和Price2都在相同的高通和SuperSmoother滤波器中单独过滤,成为带限信号,名义上的平均值为零。

Price1和Price2都以标准差为单位进行缩放。

通过改变数据滤波器的LPPeriod和HPPeriod,可以修改Ehlers环的形状。

减小LPPeriod的值可以减少滞后,也会减少过滤输出的平滑度。

增加HPPeriod的值会增加数据中更长波分量的贡献。

HPPeriod和LPPeriod之间的差异不应小于它们平均值的20%。

策略代码



Params

Numeric LPPeriod(20);

Numeric HPPeriod(125);

 

Vars

Series<Numeric> HP1(0);

Series<Numeric> HP2(0);

Numeric hpa1(0);

Numeric hpb1(0);

Numeric hpc1(0);

Numeric hpc2(0);

Numeric hpc3(0);

Numeric ssa1(0);

Numeric ssb1(0);

Numeric ssc1(0);

Numeric ssc2(0);

Numeric ssc3(0);

Series<Numeric> Price1(0);

Series<Numeric> Price1MS(0);

Series<Numeric> Price1RMS(0);

Series<Numeric> Price2(0);

Series<Numeric> Price2MS(0);

Series<Numeric> Price2RMS(0);

 

Events

OnBar(ArrayRef<Integer> indexs)

{

hpa1 = Exp(-1.414 * pi / HPPeriod);

hpb1 = 2 * hpa1 * Cos(1.414 * pi / HPPeriod);

hpc2 = hpb1;

hpc3 = -hpa1 * hpa1;

hpc1 = (1 + hpc2 - hpc3) / 4;

ssa1 = Exp(-1.414 * 3.14159 / LPPeriod);

ssb1 = 2 * ssa1 * Cos(1.414 * pi / LPPeriod);

ssc2 = ssb1;

ssc3 = -ssa1 * ssa1;

ssc1 = 1 - ssc2 - ssc3;

HP1 = hpc1 * (data0.Close - 2 * data0.Close[1] + data0.Close[2]) + hpc2 * HP1[1] + hpc3 * HP1[2];

 

If(CurrentBar < 3)

{

HP1 = 0;

}

Price1 = ssc1 * (HP1 + HP1[1]) / 2 + ssc2 * Price1[1] + ssc3 * Price1[2];

 

If(CurrentBar < 3)

{

Price1 = 0;

}

If(CurrentBar == 1)

{

Price1MS = Price1 * Price1;

}

Else

{

Price1MS = 0.0242 * Price1 * Price1 + 0.9758 * Price1MS[1];

}

 

If(Price1MS <> 0)

{

Price1RMS = Price1 / Sqrt(Price1MS);

}

HP2 = hpc1 * (data1.Close - 2 *data1.Close[1] + data1.Close[2]) + hpc2 * HP2[1] + hpc3 * HP2[2];

 

If(CurrentBar < 3)

{

HP2 = 0;

}

Price2 = ssc1 * (HP2 + HP2[1]) / 2 + ssc2 * Price2[1] + ssc3 * Price2[2];

If(CurrentBar < 3)

{

Price2 = 0;

}

If(CurrentBar == 1)

{

Price2MS = Price2 * Price2;

}

Else

{

Price2MS = 0.0242 * Price2 * Price2 + 0.9758 * Price2MS[1];

}

If(Price2MS <> 0)

{

Price2RMS = Price2 / Sqrt(Price2MS);

}

PlotNumeric("Price1 RMS", Price1RMS);

PlotNumeric("Zero Line", 0);

PlotNumeric("Price2 RMS", Price2RMS);

}



松鼠Quant
量化研究,原创策略,源码教学,程序化交易。分享量化交易相关内容,高质量原创内容生产。
 最新文章