
적응형 제로 레이그 엑스포네니얼 이동 평균 양적 거래 전략 (Adaptive Zero Lag Exponential Moving Average Quantitative Trading Strategy) 은 에들러스의 제로 레이그 엑스포네니얼 이동 평균 (Zero Lag Exponential Moving Average) 이념에 기반하여 개발된 양적 거래 전략이다. 이 전략은 지수 이동 평균을 기본 지표로 사용하며, 인스턴테네우스 주파수 측정 (Instantaneous Frequency Measurement) 의 적응 방식에 인스턴트 주파수 측정 (Adaptive Zero Lag Exponential Moving Average Quantitative Trading Strategy) 을 추가하여 지수 이동 평균의 주기적 변수를 동적으로 최적화한다.
이 전략의 핵심 아이디어는 John Ehlers의 Zero Lagging Filter 이론에서 유래한다. 지수 이동 평균은 널리 알려진 기술 지표이지만, 지수 이동 평균의 계산 공식에 오류 교정 인자를 추가함으로써 지수를 효과적으로 제거 할 수 있으며, 지수 이동 평균은 가격 변화를 더 민감하게 추적 할 수 있습니다.
자율적 제로 지연 EMA 전략에서, 우리는 실시간 주파수 측정 방법을 사용하여 자율적으로 제로 지연 지수 이동 평균의 주기 변수를 최적화한다. 실시간 주파수 측정은 아카이스트론과 포지션 양식으로 나뉘어, 가격 순서 변화의 지배적인 주기들을 측정할 수 있다. 우리는 실시간으로 이 두 가지 측정 방법에서 계산된 최적의 주기들을 추적하고, 동적으로 제로 지연 지수 이동 평균의 주기 변수를 설정하여 현재의 시장 환경에 더 적합하게 만든다.
빠른 라인 (Zero Lagging Index Moving Average) 위에 느린 라인 (Ordinary Index Moving Average) 을 통과할 때 더 많이 하고, 아래로 통과할 때 공백을 만들 때, 이렇게 이동 평균의 교차와 유사한 거래 전략 신호를 형성한다.
자율 적응 제로 레이그 EMA 전략은 제로 레이그 필터와 자율 적응 사이클 최적화 방법을 결합하여 다음과 같은 이점을 가지고 있다:
자율적으로 제로 라그 EMA 전략에 대한 위험은 다음과 같습니다.
이러한 위험을 제어하기 위해, 우리는 다양한 시장 환경의 파라미터 설정을 충분히 테스트하고, 스톱 스톱 포인트를 적절히 조정하고, 리트 디스크 환경을 최대한 모의하는 재검토에서 충분히 검증해야합니다.
제로 낙후된 EMA 전략에 적응하는 데에는 광범위한 최적화 공간이 있습니다. 주요 방향은 다음과 같습니다:
이러한 최적화 수단으로 전략의 승률, 수익률, 위험 조정 지표 등을 더욱 향상시킬 수 있을 것으로 보인다.
자기 적응 제로 지연 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)