이중 이동 평균 트렌드 추적 전략

저자:차오장, 날짜: 2023-12-21 11:45:35
태그:

img

전반적인 설명

이중 이동 평균 트렌드 추적 전략 (Dual Moving Average Trend Tracking strategy) 은 주식 가격 추세를 추적하는 양적 거래 전략이다. 이 전략은 가격 트렌드의 방향을 결정하기 위해 이중 기하급수적 이동 평균 시스템을 사용하고 ADX 지표를 결합하여 중장기 가격 추세를 파악하여 트렌드의 강도를 판단합니다.

전략 원칙

이 전략은 주로 가격 트렌드의 방향을 결정하기 위해 이중 기하급수적 이동 평균 시스템에 기반을 두고 있다. 이 전략은 서로 다른 매개 변수와 함께 빠르고 느린 두 개의 EMA를 사용하며, 빠른 EMA1는 가격 변화에 더 빠르게 반응하고 느린 EMA2는 가격 변화에 더 느리게 반응한다. 빠른 라인이 느린 라인의 위로 넘어가면 가격이 상승하기 시작했다는 것을 나타내는 구매 신호이며, 빠른 라인이 느린 라인의 아래에 넘어가면 가격이 떨어지기 시작했다는 것을 나타내는 판매 신호이다.

또한, 전략은 또한 ADX 지표를 도입하여 트렌드의 강도를 판단합니다. ADX는 트렌드의 강도를 판단하기 위해 가격 변동을 계산합니다. ADX가 상승하면 트렌드가 강화되고 ADX가 떨어지면 트렌드가 약화된다는 것을 의미합니다. 전략은 ADX 지표를 통해 거래 필터 조건을 설정하여 트렌드 강도가 상대적으로 강할 때만 거래 신호를 발산합니다.

특히 전략의 신호 생성 규칙은 다음과 같습니다.

  1. 빠른 선이 느린 선 위에 넘어가면 길게, 빠른 선이 느린 선 아래에 넘어가면 짧게
  2. ADX>25일 때만 장과 단을 허용합니다.

이것은 더 약한 트렌드 강도를 가진 유효하지 않은 신호를 효과적으로 필터링하여 거래 시스템의 안정성을 더욱 향상시킬 수 있습니다.

전략 의 장점

이 전략은 다음과 같은 주요 장점을 가지고 있습니다.

  1. 중장기 가격 동향을 파악합니다.: 이중 EMA 시스템은 중장기 가격 동향을 효과적으로 결정할 수 있으며 단기 시장 소음의 간섭을 피할 수 있습니다.

  2. 가짜 뷰트 필터: ADX 지표를 통해 트렌드 강도를 판단함으로써 트렌드 전환점에 대한 거짓 파업으로 인한 불필요한 손실을 피합니다.

  3. 큰 매개 변수 최적화 공간: 빠른 및 느린 라인 매개 변수, ADX 매개 변수 및 더 많은 매개 변수 조합을 통해 더 나은 거래 결과를 얻을 수 있는 최적화에 대한 여지가 있습니다.

  4. 높은 적응력: 이 전략은 대부분의 주식과 시간 프레임에 적합하며 다양한 시장에서 검증되었습니다.

  5. 적용하기 쉽다: 이 전략은 단순한 이동 평균 지표만을 필요로 하며, 적은 자원을 소비하고, 프로그래밍이 쉽고, 실용적인 적용 비용이 낮습니다.

전략 의 위험

이 전략은 또한 다음과 같은 영역에 주로 집중된 몇 가지 위험을 가지고 있습니다.

  1. 트렌드 역전 위험: 어떤 트렌드 전략도 트렌드 반전 지점을 완벽하게 결정할 수 없으며 실제 트렌드가 실제로 반전될 때 더 큰 손실을 입을 수밖에 없습니다.

  2. 최적화 위험 이상: 극단적으로 매개 변수를 최적화하면 전략이 역사적 데이터에 과도하게 적응하게 될 수 있습니다. 이는 전략의 안정성과 실질적인 효과를 줄일 것입니다.

  3. 블랙 스완 이벤트 위험: 큰 예기치 않은 사건은 원래 가격 트렌드 모델을 깨고 이동 평균 지표가 실패하도록 만듭니다. 손실을 제어하기 위해 수동 개입 또는 스톱 손실 설정을 필요로합니다.

위의 위험을 해결하기 위해 우리는 다음 측면에서 최적화 할 수 있습니다:

  1. 가격 전환점을 결정하기 위해 추가 지표를 도입하십시오. 예를 들어, 가격 전환점이 나타날 때 증폭되는 거래량을 도입하십시오.

  2. ADX 매개 변수를 적절히 완화하여 트렌드의 초기 단계에서 기회를 잡을 수 있도록하십시오. MACD 및 기타 보조 판단 지표도 도입 할 수 있습니다.

  3. 여러 그룹 훈련 및 매개 변수 조합의 테스트를 수행하고 안정성과 실용적인 효과를 가진 조합을 선택하십시오. 이것은 단일 매개 변수 그룹의 과도한 최적화 위험을 피합니다.

전략 최적화의 방향

또한 이 전략이 최적화 될 수 있는 몇 가지 방향도 있습니다.

  1. 스톱 로스 메커니즘을 도입: 트렌드가 역전될 때 손실을 적극적으로 중지하여 과도한 손실을 피할 수 있는 이동 스톱 손실 또는 비율 스톱 손실을 설정합니다.

  2. 거래량 지표를 결합: 예를 들어 거래량, 가격 전환점에 거래량이 증가할 때 잘못된 신호를 피할 수 있습니다.

  3. 매개 변수 자기 적응 최적화: 고정된 정적 매개 변수보다는 실시간 시장 변화에 따라 지표 매개 변수를 적응적으로 조정할 수 있도록 해 전략의 안정성을 크게 향상시킬 수 있습니다.

  4. 기계 학습을 도입: 기계 학습 알고리즘을 사용하여 많은 양의 역사적 데이터를 분석하여 이동 평균 및 ADX의 매개 변수를 결정하고 심지어 미래의 가격 움직임을 예측합니다. 이것은 이동 평균 전략의 진화의 한 방향입니다.

  5. 크로스 사이클 최적화: 다른 거래주기 매개 변수를 다르게 설정할 수 있고, 각 주기에 최적의 구성을 테스트할 수 있습니다.

요약

일반적으로 이중 이동 평균 트렌드 추적 전략은 성숙하고 안정적인 전략 아이디어입니다. 이 전략은 이중 EMA 시스템을 통해 중장기 가격 추세를 포착하고 ADX 지표를 통해 신호를 필터링하여 주식 가격 추세를 효과적으로 포착하고 단기 시장 소음의 간섭을 피할 수 있습니다. 동시에이 전략은 또한 특정 위험을 가지고 있으며 매개 변수 조합 및 스톱 손실 방법을 최적화해야하며 전략 안정성을 향상시키기 위해 더 많은 보조 지표와 기계 학습 알고리즘을 도입 할 수 있습니다. 요약하면 이중 이동 평균 트렌드 추적 전략은 균형이 좋으며 중장기 투자자에게 적합한 양적 전략 아이디어입니다.


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

//@version=3
strategy("Kitaec Strategy4", shorttitle = "Kitaec str4", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot")
len = input(14, defval=14, minval=1, maxval=1000, title="Smoothing")
len2 = input(14, defval=14, minval=1, maxval=1000, title="Smoothing2")
len3=input(550)
src = close
ema1=ema(src, len)
ema2=ema(ema1, len2)
d=ema1-ema2
zlema=ema1+d

ema21=ema(src, (len/3)*2)
ema22=ema(ema21, (len2/3)*2)
d2=ema21-ema22
zlema2=ema21+d2

ema31=ema(src, len3)
ema32=ema(ema21, len3)
d3=ema31-ema32
zlema3=ema31+d2

fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//MAs
//ma1 = security(tickerid, "60", vwma(src, len)[1])
//ma2 = security(tickerid, "120", vwma(src, len)[1])
//plot(ma1, linewidth = 2, color = blue, title = "MA")
//plot(ma2, linewidth = 2, color = red, title = "MA2")

// ADX
lenadx = 14
lensig = 14
limadx = 18

up = change(high)
down = -change(low)
trur = rma(tr, lenadx)
plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, lenadx) / trur)
minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, lenadx) / trur)
sum = plus + minus 
adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), lensig)
adx2 = ema(adx, 14)
adx2i = ema(adx2,14)
dadx2 = adx2 - adx2i
zladx2 = adx2 + dadx2
plus2 = ema(plus, 14)
plus2i = ema (plus2, 14)
dplus2 = plus2 - plus2i
zlplus2 = plus2 + dplus2

minus2 = ema(minus, 14)
minus2i = ema (minus2, 14)
dminus2 = minus2 - minus2i
zlminus2 = minus2 + dminus2

vwma = vwma(close, 150)
vwma2 = ema(vwma, 9)
vwma2i = ema(vwma2, 9)
dvwma2 = vwma2 - vwma2i
zlvwma2 = vwma2 + dvwma2


rmax=rma(src, len)
rmax2=rma(rmax, len2)
rmd=rmax-rmax2
zlrmax=rmax+rmd
rmaxz=rma(src, (len/3)*2)
rmaxz2=rma(rmaxz, (len2/3)*2)
rmzd=rmaxz-rmaxz2
zlrmaxz=rmaxz+rmzd
rmaxcol2=zlrmaxz[1] > zlema2[1] ? red:lime
rmaxcol= zlrmax[1] > zlema[1] ? red:lime


rmazlema3=rma(zlema3, 100)
plot(rmazlema3, color=gray, linewidth=2)
plot(zlema, color=green)
plot(zlema2, color=yellow)
plot(zlema3, color=teal, linewidth=2)
plot(ema2, color=na)
plot(rmax, color=rmaxcol2, linewidth=3)
plot(zlrmax, color=rmaxcol, linewidth=3)


//Trading
size = strategy.position_size
lot = 0.0 
lot := size != size[1] ? strategy.equity / close * capital / 100 : lot[1]

if zlrmax[1] < zlema[1]
    strategy.entry("Buy", strategy.long, needlong ? lot : 0, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
if zlrmax[1] > zlema[1]
    strategy.entry("Sell", strategy.short, needshort ? lot : 0, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))


더 많은