적응적 제로 레이그 기하급수적 이동 평균 양적 거래 전략 (Adaptive Zero Lag Exponential Moving Average Quantitative Trading Strategy) 은 존 에일러스의 제로 레이그 기하급수적 이동 평균 (Zero Lag Exponential Moving Average, ZLEMA) 의 아이디어를 기반으로 개발된 양적 거래 전략이다. 이 전략은 기하급수적 이동 평균을 기본 지표로 사용하고 급속 주파수 측정 (Instantaneous Frequency Measurement, IFM) 의 적응적 방법을 통합하여 기하급수적 이동 평균의 기간 매개 변수를 동적으로 최적화합니다.
이 전략의 핵심 아이디어는 존 에일러스의 제로 레이그 필터 이론에서 유래한다. 기하급수적인 이동 평균은 널리 알려진 기술 지표이지만, 본질적으로 지연의 문제가 있다. 에일러스는 지수적 이동 평균의 계산 공식에 오류 수정 인수를 도입하여 지연 현상을 효과적으로 제거하여 제로 레이그 EMA를 가격 변화를 추적하는 데 더 민감하게 만듭니다.
적응적 제로 Lag EMA 전략에서 우리는 ZLEMA의 기간 매개 변수를 적응적으로 최적화하기 위해 즉각적인 주파수 측정 방법을 사용합니다. IFM는 두 가지 기법으로 구성됩니다. 코시노 방법과 인파스 퀘어레이터 방법, 이는 가격 변동의 지배적인 주기를 측정 할 수 있습니다. 이 두 가지 측정으로 계산된 최적 기간의 실시간 추적을 통해 현재 시장 상태에 더 잘 맞게 ZLEMA의 기간 매개 변수를 동적으로 설정합니다.
빠른 EMA (ZLEMA) 가 아래에서 느린 EMA를 넘을 때 긴 신호가 생성됩니다. 빠른 EMA가 느린 EMA를 넘을 때 짧은 신호가 유발됩니다. 이것은 이동 평균 크로스오버 시스템과 유사한 거래 전략을 형성합니다.
적응적 제로 레이그 EMA 전략은 제로 레이그 필터와 적응적 기간 최적화를 결합하여 다음과 같은 장점을 가지고 있습니다.
이 전략에는 몇 가지 위험도 있습니다.
이러한 위험을 통제하기 위해 우리는 다양한 시장 조건에서 매개 변수를 완전히 테스트하고 SL/TP를 적절히 조정하고 백테스트에서 실시간 거래 환경을 시뮬레이션해야합니다.
이 전략을 더 이상 최적화 할 수있는 충분한 공간이 여전히 있습니다.
이러한 최적화 방법을 통해 전략의 승률, 수익성, 위험 조정 메트릭을 더욱 향상시킬 가능성이 있습니다.
어댑티브 제로 레이그 EMA 전략은 제로 레이그 필터와 동적 기간 최적화를 성공적으로 결합합니다. 파라미터가 적고 조작이 쉽기 때문에 트렌딩 시장에 특히 적합합니다. 적절한 스톱 로스, 포지션 사이징 및 기타 리스크 관리 기술과 함께 안정성과 수익성을 더욱 향상시킬 수 있습니다. 더 나은 성능을 위해이 전략을 최적화하는 잠재력이 남아 있습니다.
/*backtest start: 2024-01-19 00:00:00 end: 2024-02-18 00:00:00 period: 4h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy(title="Adaptive Zero Lag EMA v2", shorttitle="AZLEMA", overlay = true) src = input(title="Source", defval=close) Period = input(title="Period", defval = 20) adaptive = input(title="Adaptive Method", options=["Off", "Cos IFM", "I-Q IFM", "Average"], defval="Off") GainLimit = input(title="Gain Limit", defval = 10) Threshold = input(title="Threshold", type = float, defval=0.05, step=0.01) fixedSL = input(title="SL Points", defval=70) fixedTP = input(title="TP Points", defval=5) risk = input(title='Risk', defval=0.01, step=0.01) //############################################################################## //I-Q IFM //############################################################################# range = input(title="Max Period", defval=60, minval=8, maxval=100) PI = 3.14159265359 imult = 0.635 qmult = 0.338 inphase = 0.0 quadrature = 0.0 re = 0.0 im = 0.0 deltaIQ = 0.0 instIQ = 0.0 lenIQ = 0.0 V = 0.0 P = src - src[7] inphase := 1.25*(P[4] - imult*P[2]) + imult*nz(inphase[3]) quadrature := P[2] - qmult*P + qmult*nz(quadrature[2]) re := 0.2*(inphase*inphase[1] + quadrature*quadrature[1]) + 0.8*nz(re[1]) im := 0.2*(inphase*quadrature[1] - inphase[1]*quadrature) + 0.8*nz(im[1]) if (re!= 0.0) deltaIQ := atan(im/re) for i=0 to range V := V + deltaIQ[i] if (V > 2*PI and instIQ == 0.0) instIQ := i if (instIQ == 0.0) instIQ := nz(instIQ[1]) lenIQ := 0.25*instIQ + 0.75*nz(lenIQ[1]) //############################################################################## //COSINE IFM //############################################################################# s2 = 0.0 s3 = 0.0 deltaC = 0.0 instC = 0.0 lenC = 0.0 v1 = 0.0 v2 = 0.0 v4 = 0.0 v1 := src - src[7] s2 := 0.2*(v1[1] + v1)*(v1[1] + v1) + 0.8*nz(s2[1]) s3 := 0.2*(v1[1] - v1)*(v1[1] - v1) + 0.8*nz(s3[1]) if (s2 != 0) v2 := sqrt(s3/s2) if (s3 != 0) deltaC := 2*atan(v2) for i = 0 to range v4 := v4 + deltaC[i] if (v4 > 2*PI and instC == 0.0) instC := i - 1 if (instC == 0.0) instC := instC[1] lenC := 0.25*instC + 0.75*nz(lenC[1]) if (adaptive == "Cos IFM") Period := round(lenC) if (adaptive == "I-Q IFM") Period := round(lenIQ) if (adaptive == "Average") Period := round((lenC + lenIQ)/2) //############################################################################## //ZERO LAG EXPONENTIAL MOVING AVERAGE //############################################################################## LeastError = 1000000.0 EC = 0.0 Gain = 0.0 EMA = 0.0 Error = 0.0 BestGain = 0.0 alpha =2/(Period + 1) EMA := alpha*src + (1-alpha)*nz(EMA[1]) for i = -GainLimit to GainLimit Gain := i/10 EC := alpha*(EMA + Gain*(src - nz(EC[1]))) + (1 - alpha)*nz(EC[1]) Error := src - EC if(abs(Error)<LeastError) LeastError := abs(Error) BestGain := Gain EC := alpha*(EMA + BestGain*(src - nz(EC[1]))) + (1-alpha)*nz(EC[1]) plot(EC, title="EC", color=orange, linewidth=2) plot(EMA, title="EMA", color=red, linewidth=2) buy = crossover(EC,EMA) and 100*LeastError/src > Threshold sell = crossunder(EC,EMA) and 100*LeastError/src > Threshold strategy.initial_capital = 50000 if (time>timestamp(2016, 1, 1 , 0, 0)) //LONG balance = strategy.initial_capital + strategy.netprofit lots = ((risk * balance)/fixedSL)*1 strategy.entry("BUY", strategy.long, qty=lots, oca_name="BUY", when=buy) strategy.exit("B.Exit", "BUY", qty_percent = 100, loss=fixedSL, trail_offset=15, trail_points=fixedTP) //SHORT strategy.entry("SELL", strategy.short, qty=lots, oca_name="SELL", when=sell) strategy.exit("S.Exit", "SELL", qty_percent = 100, loss=fixedSL, trail_offset=15, trail_points=fixedTP)