적응적 제로 레이그 기하급수적 이동 평균 양적 거래 전략

저자:차오장, 날짜: 2024-02-19 15:38:02
태그:

img

전반적인 설명

적응적 제로 레이그 기하급수적 이동 평균 양적 거래 전략 (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 전략은 제로 레이그 필터와 적응적 기간 최적화를 결합하여 다음과 같은 장점을 가지고 있습니다.

  1. 지연을 제거하고 더 민감한 신호를 만듭니다.
  2. 광범위한 시장에 대한 적응 기간 매개 변수
  3. 테스트 및 최적화를 위해 쉬운 몇 가지 매개 변수
  4. 더 나은 위험 통제를 위해 설정 가능한 고정 SL/TP

위험성

이 전략에는 몇 가지 위험도 있습니다.

  1. 적응 최적화 기간은 특정 시장 환경에서 실패 할 수 있습니다.
  2. 부적절한 고정 SL/TP 설정은 과도한 손실 또는 손실을 초래할 수 있습니다.
  3. 불충분한 매개 변수 최적화 테스트는 나쁜 라이브 성능으로 이어질 수 있습니다.

이러한 위험을 통제하기 위해 우리는 다양한 시장 조건에서 매개 변수를 완전히 테스트하고 SL/TP를 적절히 조정하고 백테스트에서 실시간 거래 환경을 시뮬레이션해야합니다.

최적화 방향

이 전략을 더 이상 최적화 할 수있는 충분한 공간이 여전히 있습니다.

  1. 다른 적응기 측정 방법, 예를 들어 변동성 조정 MA
  2. 부피, MA 페어링 등 추가 필터 조건
  3. 향상된 SL/TP 기술, 예를 들어 후속 정지 또는 Chandelier Exit
  4. 리스크 관리와 결합된 역동적인 포지션 크기
  5. 신호 품질을 향상시키기 위해 여러 시간 프레임 확인

이러한 최적화 방법을 통해 전략의 승률, 수익성, 위험 조정 메트릭을 더욱 향상시킬 가능성이 있습니다.

결론

어댑티브 제로 레이그 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)


더 많은