量化研究 | 线性回归调整的指数移动平均线(源码)

财富   2024-11-18 16:43   山西  

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

这里有一个新工具,它结合了线性回归指标和指数移动平均线(EMA),来过滤价格波动并帮助确定转折点。

线性回归调整的指数移动平均线(LRAdj EMA)旨在考虑线性回归偏差(即价格与线性回归指标之间的距离)。指数移动平均线(EMA)可以平滑价格数据并确定当前趋势方向。EMA是滞后指标。线性回归指标基于统计学预测价格方向。这种LRAdj EMA可以与相同周期的EMA一起使用,以识别整体趋势。不同周期的LRAdj EMA可以用来确定转折点和过滤价格波动。

计算方法: 这里展示的例子是基于10日LRAdj EMA。当前LRAdj EMA = 上一个LRAdj EMA + MLTP × (1+LRAdj×MLTP_LRAdj) × (价格 - 上一个LRAdj EMA)

乘数(加权乘数): MLTP = 2 / (时间段 + 1)

线性回归调整(LRAdj)乘数: LRAdj = (当前LR偏差的绝对值 - 最小LR偏差的绝对值) / (最大LR偏差的绝对值 - 最小LR偏差的绝对值)

其中:

使用绝对值以确保数值为正。

当前LR偏差:线性回归指标与当前收盘价之间的距离。

最小LR偏差:回顾期内线性回归指标与收盘价之间的最小距离。

最大LR偏差:回顾期内线性回归指标与收盘价之间的最大距离。

LRAdj在0和1之间波动。如果当前LR偏差接近最小LR偏差,那么LRAdj接近零。如果当前LR偏差等于最大LR偏差,LRAdj可以达到1。乘以MLTP_LRAdj,MLTP_LRAdj的值可以从1变化到5。

10,10,5是LRAdj EMA(10,10,5)的典型设置,其中第一个参数是移动平均周期,第二个参数是回顾期,第三个参数是MLTP_LRAdj乘数。根据你的交易风格和目标,可以替换其他值。

图1显示了2010年8月至12月的Russell 2000指数,以及线性回归指标LR(C,10)、LRAdj(10,10,5)和EMA(10)。LRAdj EMA和EMA交叉点 在强劲的上升趋势中,忽略看跌交叉点。看涨的LRAdj EMA和EMA交叉点(绿色箭头)可以用作长线交易的入场点。

图1:罗素2000指数。这里展示的是2010年8月至12月的罗素2000指数,以及线性回归指标LR(C,10)、LRAdj(10,10,5)和EMA(10)。

图2显示了2019年6月至11月的S&P 500指数,以及20日EMA和LRAdj EMA(20,20,5)。

图2

图3显示了2016年10月至2017年10月的NYSE Composite指数,以及50日EMA和LRAdj EMA(50,50,5)。

图3

图4显示了2012年1月至2022年4月的Dow Jones Industrial Index(DJIA),以及100日EMA和LRAdj EMA(100,100,5)。注意2014年10月的失败突破。

图4

趋势识别 图5显示了Dow Jones Industrial Average(DJIA)以及200日EMA和LRAdj EMA(200,200,1)。200日EMA和LRAdj EMA(200,200,1)捕捉了2003-2008年的牛市。

图5

图6的周线图显示了S&P 500指数,以及40周EMA和LRAdj EMA(40,40,5)。40周EMA和LRAdj EMA(40,40,5)定义了2001-2003年的熊市。

图6

LRAdj EMA交叉点 图7显示了2009年7月至11月的NYSE Composite指数,以及LRAdj EMA(10,10,3)和LRAdj EMA(50,50,3)。看涨的LRAdj EMA交叉点(绿色箭头)可以用作长线交易的入场点。

图7

图8显示了2017年12月至2019年5月的FTSE 100指数,以及LRAdj EMA(50,50,5)和LRAdj EMA(200,200,5)。看涨的LRAdj EMA(绿色箭头)和看跌交叉点(红色箭头)可以在横盘期间用作长线和短线交易的入场点。

图8









结论




LRAdj EMA提供了趋势跟踪和价格预测的功能。LRAdj EMA与传统EMA的解释方式类似,但它的反应更快。不幸的是,移动平均线交叉系统可能会产生误导信号。LRAdj EMA应该与价格分析一起使用。

策略代码



1、用户函数:

Params

    Numeric Periods;

    Numeric Pds;

    Numeric Mltp;

Vars

    Numeric Mltp1(0);

    Numeric LR(0);

    Numeric Dist(0);

    Numeric ST(0);

    Numeric Mltp2(0);

    Numeric Rate(0);

    Series<Numeric> LRAdjEMA(0);

 

Begin

    Mltp1 = 2 / (Periods + 1);

    LR = LinearRegValue(Close, Pds, 0);

    Dist = Abs(LR - Close);

    ST = (Dist - Lowest(Dist, Pds)) / (Highest(Dist, Pds) - Lowest(Dist, Pds));

    Mltp2 = ST * Mltp;

    Rate = Mltp1 * (1 + Mltp2);

     

    If(CurrentBar() == 1)

    {

        LRAdjEMA = Close;

    }

    Else

    {

        LRAdjEMA = LRAdjEMA[1] + Rate * (Close - LRAdjEMA[1]);

    }

    Return LRAdjEMA;

End


2、指标:

Params

    Numeric Periods(50);

    Numeric Pds(50);

    Numeric Mltp(3);

Vars

    Numeric LRAdjEMA(0);

Events

OnBar(ArrayRef<Integer> indexs)

{

    LRAdjEMA = lradjema2209(Periods, Pds, Mltp);

    PlotNumeric( "LinRegAdjEMA",LRAdjEMA);

}




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