경험적 모드 분해에 기반한 양적 거래 전략

저자:차오장, 날짜: 2023-12-22 14:41:34
태그:

img

전반적인 설명

이 전략은 임상 모드 분해 (EMD) 방법을 기반으로 다른 주파수 대역에서 가격 시리즈를 분해하고 특징을 추출하며 거래 신호를 생성하는 평균과 결합합니다. 중장기 보유에 주로 적용됩니다.

전략 논리

  1. EMD 방법을 사용하여 대역을 통과하여 가격을 필터하고 가격 변동을 추출합니다.
  2. 피크와 트로프의 이동 평균을 계산합니다.
  3. 평균선이 최고와 최저선의 특정 비율을 초과할 때 거래 신호를 생성합니다.
  4. 거래 신호를 기반으로 긴 또는 짧은

이점 분석

  1. EMD 방법은 가격 시리즈를 효과적으로 분해하고 유용한 특징을 추출 할 수 있습니다.
  2. 최고와 하위 라인은 가격 변동이 특정 진폭보다 크면만 거래 전략을 제어합니다.
  3. 평균선과 결합하면 가짜 파장을 효과적으로 필터링할 수 있습니다.

위험 분석

  1. EMD 방법의 매개 변수를 잘못 선택하면 과도하게 장착 될 수 있습니다.
  2. 트랜잭션 신호를 형성하는 데는 긴 사이클이 필요하고 고주파 거래에 적응할 수 없습니다.
  3. 급격한 가격 변동으로 시장 조건에 대처할 수 없습니다

최적화 방향

  1. 시장에 적응력을 향상시키기 위해 EMD 모델의 매개 변수를 최적화
  2. 다른 지표들을 스톱 로스로 결합하고 이윤을 취하는 신호로 결합합니다
  3. 전략 입력으로 다른 가격 시리즈를 시도

요약

이 전략은 경험적 모드 분해 방법을 사용하여 가격 시리즈에서 특징을 추출하고 추출 된 특징에 기반하여 거래 신호를 생성하여 안정적인 중장기 거래 전략을 실현합니다. 이 전략의 장점은 가격의 주기적인 특징을 효과적으로 식별하고 큰 변동 중에 거래 명령을 할 수 있다는 것입니다. 그러나 또한 특정 위험이 있으며 더 복잡한 시장 환경에 적응하기 위해 추가 최적화가 필요합니다.


/*backtest
start: 2022-12-15 00:00:00
end: 2023-12-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
////////////////////////////////////////////////////////////
//  Copyright by HPotter v1.0 12/04/2017
// The related article is copyrighted material from Stocks & Commodities Mar 2010
// You can use in the xPrice any series: Open, High, Low, Close, HL2, HLC3, OHLC4 and ect...
//
// You can change long to short in the Input Settings
// Please, use it only for learning or paper trading. Do not for real trading.
////////////////////////////////////////////////////////////
strategy(title="Empirical Mode Decomposition")
Length = input(20, minval=1)
Delta = input(0.5)
Fraction = input(0.1)
reverse = input(false, title="Trade reverse")
xPrice = hl2
beta = cos(3.1415 * (360 / Length) / 180)
gamma = 1 / cos(3.1415 * (720 * Delta / Length) / 180)
alpha = gamma - sqrt(gamma * gamma - 1)
xBandpassFilter = 0.5 * (1 - alpha) * (xPrice - xPrice[2]) + beta * (1 + alpha) * nz(xBandpassFilter[1]) - alpha * nz(xBandpassFilter[2])
xMean = sma(xBandpassFilter, 2 * Length)
xPeak =  iff (xBandpassFilter[1] > xBandpassFilter and xBandpassFilter[1] > xBandpassFilter[2], xBandpassFilter[1], nz(xPeak[1])) 
xValley =  iff (xBandpassFilter[1] < xBandpassFilter and xBandpassFilter[1] < xBandpassFilter[2], xBandpassFilter[1], nz(xValley[1])) 
xAvrPeak = sma(xPeak, 50)
xAvrValley = sma(xValley, 50)
nAvrPeak = Fraction * xAvrPeak
nAvrValley = Fraction * xAvrValley
pos = iff(xMean > nAvrPeak and xMean > nAvrValley, 1,
	     iff(xMean < nAvrPeak and xMean < nAvrValley, -1, nz(pos[1], 0))) 
possig = iff(reverse and pos == 1, -1,
          iff(reverse and pos == -1, 1, pos))	   
if (possig == 1) 
    strategy.entry("Long", strategy.long)
if (possig == -1)
    strategy.entry("Short", strategy.short)	   	    
barcolor(possig == -1 ? red: possig == 1 ? green : blue )
plot(xMean, color=red, title="Mean")
plot(nAvrPeak, color=blue, title="Peak")
plot(nAvrValley, color=blue, title="Valley")

더 많은