세 번 겹치는 스토카스틱 모멘텀 전략

저자:차오장, 날짜: 2024-01-26 12:15:20
태그:

img

전반적인 설명

트리플 오버라핑 스토카스틱 모멘텀 전략 (Triple Overlapping Stochastic Momentum strategy) 은 전형적인 단기 거래 전략이다. 세 개의 다른 매개 변수 설정을 가진 스토카스틱 모멘텀 인덱스 (SMI) 인디케이터를 계산하고 세 개 모두 동시에 과소매 또는 과소매 조건을 표시 할 때 거래 신호를 생성합니다. 멀티 타임프레임 분석을 결합함으로써이 전략은 시장 소음을 효과적으로 필터링하고 신호 품질을 향상시킬 수 있습니다.

전략 논리

이 전략의 핵심 지표는 스토카스틱 모멘텀 인덱스 (SMI) 이다. SMI는 다음과 같이 계산됩니다.

SMI = 100 * EMA(EMA(Close - Midpoint of High-Low Range, N1), N2) / 0.5 * EMA(EMA(High - Low, N1), N2)

여기서 N1과 N2는 매개 변수 길이가 됩니다. SMI는 -100에서 100 사이로 변동합니다. 0 이상의 값은 닫기가 일일 범위의 상반부에 있음을 나타냅니다. 0 이하의 값은 닫기가 하반부에 있음을 나타냅니다.

전통적인 스토카스틱 오시레이터와 유사하게, 과잉 구매 (예를 들어 40) / 과잉 판매 (예를 들어 -40) 수준은 잠재적 인 반전 신호를 나타냅니다. SMI가 이동 평균선 이상 / 아래를 넘을 때 상승 및 하락 신호가 생성됩니다.

이 전략은 세 가지 SMI 지표와 다른 매개 변수 집합을 사용합니다. 구체적으로:

  • SMI1: %K 기간 10, %K 느림 기간 3
  • SMI2: %K 기간 20, %K 느림 기간 3
  • SMI3: %K 기간 5, %K 느림 기간 3

거래 신호는 세 가지 SMI가 동시에 과소매 또는 과소매 조건을 표시할 때 생성됩니다. 이것은 잘못된 신호를 필터링하고 신뢰성을 향상시킵니다.

장점

  • 강력한 신호를 위한 다중 시간 프레임 분석
  • SMI는 전통적인 스토카스틱보다 사용성을 향상시킵니다.
  • 삼중 덮개 가 단일 지표 보다 신뢰성 을 향상
  • 최적화를 위한 유연한 매개 변수
  • 단기/고 빈도 거래에 적합합니다.

위험성

  • 여러 지표가 신호를 늦출 수 있습니다.
  • 높은 거래 빈도는 비용을 증가시킵니다.
  • 백테스트 부착
  • 매개 변수는 시장 체제 변경으로 실패 할 수 있습니다.

위험 완화:

  • 지연을 줄이기 위해 매개 변수를 최적화
  • 거래 비용을 낮추기 위해 보유 기간을 조정
  • 안정성을 검증하기 위해 통계적 테스트를 수행합니다.
  • 동적으로 매개 변수를 조정

개선

  • 다른 SMI 매개 변수 조합을 테스트
  • 매개 변수 안정성을 평가하기 위해 통계 메트릭을 추가
  • 부피, 볼링거 밴드 등과 같은 지원 지표를 포함합니다.
  • 환경에 기반한 동적 매개 변수 전환
  • 스톱 로스 전략을 최적화

결론

트리플 오버라핑 스토카스틱 모멘텀 전략은 세 개의 SMI 지표를 고유 한 매개 변수와 함께 덮어넣어 여러 시간 프레임에 걸쳐 강력한 신호 생성을 결합합니다. 단일 오시레이터와 비교하면이 멀티 지표 접근 방식은 더 많은 소음을 필터하고 일관성을 향상시킵니다. 향후 매개 변수 최적화, 통계 검증, 보조 지표 등을 통해 더 많은 정교화를 할 수 있습니다.


/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("Stochastic Momentum multi strategy", "Stochastic Momentum Index multi strategy", overlay=false)

q = input(10, title="%K Length")
r = input(3, title="%K Smoothing Length")
s = input(3, title="%K Double Smoothing Length")
nsig = input(10, title="Signal Length")
matype = input("ema", title="Signal MA Type")  // possible: ema, sma, wma, trima, hma, dema, tema, zlema
overbought = input(40, title="Overbought Level", type=float)
oversold = input(-40, title="Oversold Level", type=float)

trima(src, length) => sma(sma(src,length),length)
hma(src, length) => wma(2*wma(src, length/2)-wma(src, length), round(sqrt(length)))
dema(src, length) => 2*ema(src,length) - ema(ema(src,length),length)
tema(src, length) => (3*ema(src,length) - 3*ema(ema(src,length),length)) + ema(ema(ema(src,length),length),length)
zlema(src, length) => ema(src,length) + (ema(src,length) - ema(ema(src,length),length))

smi = 100 * ema(ema(close-0.5*(highest(q)+lowest(q)),r),s) / (0.5 * ema(ema(highest(q)-lowest(q),r),s))
sig = matype=="ema" ? ema(smi,nsig) : matype=="sma" ? sma(smi,nsig) : matype=="wma" ? wma(smi,nsig) : matype=="trima" ? trima(smi,nsig) : matype=="hma" ? hma(smi,nsig) : matype=="dema" ? dema(smi,nsig) : matype=="tema" ? tema(smi,nsig) : matype=="zlema" ? zlema(smi,nsig) : ema(smi,nsig)

p_smi = plot(smi, title="SMI", color=aqua)
p_sig = plot(sig, title="Signal", color=red)

// plotchar(crossover(smi, sig), title= "low", location=location.bottom, color=green, char="▲", size= size.tiny)
// plotchar(crossunder(smi, sig), title= "high", location=location.top, color=red, char="▼", size= size.tiny)

/////////////////////////////2
q2 = input(20, title="%K Length 2")
r2 = input(3, title="%K Smoothing Length 2")
s2 = input(3, title="%K Double Smoothing Length 2")
nsig2 = input(10, title="Signal Length 2")
matype2 = input("ema", title="Signal MA Type 2")  // possible: ema, sma, wma, trima, hma, dema, tema, zlema
overbought2 = input(40, title="Overbought Level 2", type=float)
oversold2 = input(-40, title="Oversold Level 2", type=float)

trima2(src2, length2) => sma(sma(src2,length2),length2)
hma2(src2, length2) => wma(2*wma(src2, length2/2)-wma(src2, length2), round(sqrt(length2)))
dema2(src2, length2) => 2*ema(src2,length2) - ema(ema(src2,length2),length2)
tema2(src2, length2) => (3*ema(src2,length2) - 3*ema(ema(src2,length2),length2)) + ema(ema(ema(src2,length2),length2),length2)
zlema2(src2, length2) => ema(src2,length2) + (ema(src2,length2) - ema(ema(src2,length2),length2))

smi2 = 100 * ema(ema(close-0.5*(highest(q2)+lowest(q2)),r2),s2) / (0.5 * ema(ema(highest(q2)-lowest(q2),r2),s2))
sig2 = matype2=="ema" ? ema(smi2,nsig2) : matype2=="sma 2" ? sma(smi2,nsig2) : matype2=="wma 2" ? wma(smi2,nsig2) : matype2=="trima 2" ? trima2(smi2,nsig2) : matype2=="hma 2" ? hma2(smi2,nsig2) : matype=="dema 2" ? dema2(smi2,nsig2) : matype2=="tema 2" ? tema2(smi2,nsig2) : matype2=="zlema 2" ? zlema2(smi2,nsig2) : ema(smi2,nsig2)

p_smi2 = plot(smi2, title="SMI 2", color=aqua)
p_sig2 = plot(sig2, title="Signal2", color=red)

// plotchar(crossover(smi2, sig2), title= "low2", location=location.bottom, color=green, char="▲", size= size.tiny)
// plotchar(crossunder(smi2, sig2), title= "high2", location=location.top, color=red, char="▼", size= size.tiny)

/////////////////////////////3
q3 = input(5, title="%K Length 3")
r3 = input(3, title="%K Smoothing Length 3")
s3 = input(3, title="%K Double Smoothing Length 3")
nsig3 = input(10, title="Signal Length 3")
matype3 = input("ema", title="Signal MA Type 3")  // possible: ema, sma, wma, trima, hma, dema, tema, zlema
overbought3 = input(40, title="Overbought Level 3", type=float)
oversold3 = input(-40, title="Oversold Level 3", type=float)

trima3(src3, length3) => sma(sma(src3,length3),length3)
hma3(src3, length3) => wma(2*wma(src3, length3/2)-wma(src3, length3), round(sqrt(length3)))
dema3(src3, length3) => 2*ema(src3,length3) - ema(ema(src3,length3),length3)
tema3(src3, length3) => (3*ema(src3,length3) - 3*ema(ema(src3,length3),length3)) + ema(ema(ema(src3,length3),length3),length3)
zlema3(src3, length3) => ema(src3,length3) + (ema(src3,length3) - ema(ema(src3,length3),length3))

smi3 = 100 * ema(ema(close-0.5*(highest(q3)+lowest(q3)),r3),s3) / (0.5 * ema(ema(highest(q3)-lowest(q3),r3),s3))
sig3 = matype3=="ema" ? ema(smi3,nsig3) : matype3=="sma 3" ? sma(smi3,nsig3) : matype3=="wma 3" ? wma(smi3,nsig3) : matype3=="trima 3" ? trima3(smi3,nsig3) : matype3=="hma 3" ? hma3(smi3,nsig3) : matype=="dema 3" ? dema3(smi3,nsig3) : matype3=="tema 3" ? tema3(smi3,nsig3) : matype3=="zlema 3" ? zlema3(smi3,nsig3) : ema(smi3,nsig3)

p_smi3 = plot(smi3, title="SMI 3", color=aqua)
p_sig3 = plot(sig3, title="Signal3", color=red)

// plotchar(crossover(smi3, sig3) and crossover(smi2, sig2) and crossover(smi, sig), title= "low3", location=location.bottom, color=green, char="▲", size= size.tiny)
// plotchar(crossunder(smi3, sig3) and crossunder(smi2, sig2) and crossunder(smi, sig), title= "high3", location=location.top, color=red, char="▼", size= size.tiny)
plotchar (((smi3 < sig3) and (smi2 < sig2) and (smi < sig)), title= "low3", location=location.bottom, color=green, char="▲", size= size.tiny)
plotchar (((smi3 > sig3) and (smi2 > sig2) and (smi > sig)), title= "high3", location=location.top, color=red, char="▼", size= size.tiny)

// === BACKTEST RANGE ===
FromMonth = input(defval = 8, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 2014)
ToMonth   = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2018, title = "To Year", minval = 2014)

longCondition = ((smi3 < sig3) and (smi2 < sig2) and (smi < sig))
shortCondition = ((smi3 > sig3) and (smi2 > sig2) and (smi > sig))

// buy = longCondition == 1 and longCondition[1] == 1 ? longCondition : na
buy = longCondition == 1 ? longCondition : na
sell = shortCondition == 1? shortCondition : na

// === ALERTS ===
strategy.entry("L", strategy.long, when=buy)

strategy.entry("S", strategy.short, when=sell)

alertcondition(((smi3 < sig3) and (smi2 < sig2) and (smi < sig)), title='Low Fib.', message='Low Fib. Buy')
alertcondition(((smi3 > sig3) and (smi2 > sig2) and (smi > sig)), title='High Fib.', message='High Fib. Low')


더 많은