모멘텀 브레이크업 전략

저자:차오장, 날짜: 2023년 11월 15일 11:09:21
태그:

img

전반적인 설명

모멘텀 브레이크아웃 전략 (Momentum Breakout strategy) 은 시장 트렌드를 따르는 양적 거래 전략이다. 시장 가격 움직임의 추세와 강도를 결정하기 위해 역사적 가격에 기초하여 모멘텀 지표를 계산하여 시장의 중장기 트렌드를 파악하는 것을 목표로 한다. 모멘텀이 음에서 양으로 넘어가면 길게, 모멘텀이 양에서 음으로 넘어가면 짧게 된다. 이 전략은 명백한 트렌드가 있는 시장에 적합하며 과도한 수익을 얻을 수 있다.

전략 논리

이 전략의 핵심은 모멘텀 지표에 기초한다. 모멘텀 지표는 N 기간 전의 종료 가격을 빼고 현재 기간의 종료 가격이다. 최신 바가 닫을 때 N 기간 전보다 높을 때 모멘텀은 긍정적이며 상승 추세를 나타낸다. 최신 바가 닫을 때 N 기간 전보다 낮을 때 모멘텀은 부정적이며 하락 추세를 나타낸다.

전략은 먼저 mom0에 저장된 현재 종료 마이너스 18주기 전 종료인 18주기 모멘텀을 계산합니다.

mom0>0과 mom1>0이 되면, 강한 상향 모멘텀을 나타내는 긴 신호가 생성됩니다. mom0<0과 mom1<0이 되면, 강한 하향 모멘텀을 나타내는 짧은 신호가 생성됩니다.

이 전략은 가장 최근의 긴 신호와 짧은 신호의 시간을 기록합니다. 긴 신호 시간이 짧은 신호 시간보다 더 최근의 경우, 긴 위치를 유지합니다. 짧은 신호 시간이 긴 신호 시간보다 더 최근의 경우, 짧은 위치를 유지합니다.

이점 분석

이 전략의 장점은 다음과 같습니다.

  1. 논리는 간단하고 이해하기 쉽고 양적 거래의 초보자에게 적합합니다.

  2. 동력 지표는 중장기 동향을 추적할 때 상대적으로 높은 승률을 가진 시장 추세와 힘을 포착할 수 있습니다.

  3. 이중 모멘텀 필터는 가짜 파업으로 인한 손실을 방지합니다.

  4. 트렌드 포지션을 설정하고 트렌드 시장에서 초과 수익을 달성하기 위해 신호에 따라 포지션을 추가합니다.

  5. 적시에 스톱 로스 출출은 단일 거래 손실 크기를 제어하고 반전으로 인한 큰 손실을 피합니다.

위험 분석

이 전략의 몇 가지 위험은 다음과 같습니다.

  1. 상승 추세에서 단기적 인 인기를 끌 때 손실 중지 출구, 전체 추세를 포착 할 수 없습니다. 손실 중지 범위를 넓히는 것을 고려 할 수 있습니다.

  2. 다양한 시장에서 빈번하게 열고 닫는 거래는 수수료 및 미끄러짐으로 인한 비용을 증가시킵니다. 거래 빈도를 줄이기 위해 필터를 느슨하게하는 것을 고려할 수 있습니다.

  3. 트렌드 반전 후 원래 방향으로 계속 보유하면 손실이 커집니다. 반전을 감지하기 위해 트렌드 지표를 포함 할 수 있습니다.

  4. 부적절한 매개 변수 설정은 신호가 누락되거나 잘못된 신호를 생성합니다. 매개 변수를 다른 시장에 맞게 조정해야합니다.

최적화 방향

전략을 최적화하는 몇 가지 방법:

  1. 시간 프레임과 시장에 따라 운동 길이 계산을 조정하여 운동량 매개 변수를 최적화합니다. 신호 품질을 향상시킵니다.

  2. 다른 지표 필터 MACD, KD를 추가하여 트렌드 역전으로 인한 손실을 피합니다.

  3. 트렌드 시장에서 스톱 로스를 넓히고 트렌드 시장에서 스톱 로스를 강화함으로써 스톱 로스 전략을 최적화합니다.

  4. 비 트렌드에서 크기를 줄이고 더 많은 이익을 얻기 위해 트렌드에서 크기를 높이기 위해 포지션 사이징 규칙을 추가하십시오.

  5. 적응력을 향상시키기 위해 다른 제품별로 매개 변수를 개별적으로 최적화합니다.

  6. 매개 변수를 동적으로 최적화하기 위해 기계 학습 알고리즘을 통합합니다.

결론

모멘텀 브레이크아웃 전략은 직관적인 트렌드 추적 시스템이다. 중장기 트렌드를 효과적으로 파악하고 트렌딩 시장에서 좋은 수익을 얻을 수 있다. 스톱 로스 최적화와 트렌드를 판단하기 위한 다른 지표를 이용하는 위험 관리도 중요하다. 지속적인 최적화로 이 전략은 안정적인 수익 창출 양적 거래 시스템으로 발전할 수 있다.


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

//@version=4
strategy("Momentum BF 🚀", overlay=true, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// Time Frame ///////////////
_0 = input(false,  "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

///////////// Momentum /////////////
_1 = input(false, "═══════ Momentum ══════")
length = input(18)
price = close

momentum(seria, length) =>
    mom = seria - seria[length]
    mom

mom0 = momentum(price, length)
mom1 = momentum(mom0, 1)

/////////////// Strategy /////////////// 
long = mom0 > 0 and mom1 > 0
short = mom0 < 0 and mom1 < 0

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

/////////////// Stop Losses Long ///////////////
_5 = input(false,  "═══════ Stop Loss L ══════")
SL_typel = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inpl = input(8.0, title='Fixed Stop Loss %') / 100
atrLkbl = input(20, minval=1, title='ATR Stop Period')
atrMultl = input(1.5, step=0.25, title='ATR Stop Multiplier') 
atr1l = atr(atrLkbl)

longStop1l = 0.0
longStop1l := short_signal ? na : long_signal ? close - (atr1l * atrMultl) : longStop1l[1]

slLongl = in_long_signal ? strategy.position_avg_price * (1 - sl_inpl) : na
long_sll = in_long_signal ? slLongl : na

/////////////// Stop Losses Short ///////////////
_6 = input(false, "═══════ Stop Loss S ══════")
SL_types = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inps = input(7.0, title='Fixed Stop Loss %') / 100
atrLkbs = input(20, minval=1, title='ATR Stop Period')
atrMults = input(1.5, step=0.25, title='ATR Stop Multiplier') 
atr1s = atr(atrLkbs)

shortStop1s = 0.0
shortStop1s := long_signal ? na : short_signal ? close + (atr1s * atrMults) : shortStop1s[1]

slShorts = strategy.position_avg_price * (1 + sl_inps)
short_sls = in_short_signal ? slShorts : na

_7 = input(false, "══════ Longs or Shorts ═════")
useLongs = input(true, title="Use Longs")
useShorts = input(true, title="Use Shorts")

/////////////// Execution ///////////////
if testPeriod()
    if useLongs
        strategy.entry("L", strategy.long, when=long)
        strategy.exit("L SL", "L", stop = SL_typel == "Fixed" ? long_sll : longStop1l, when=since_longEntry > 0)
    if useShorts
        strategy.exit("S SL", "S", stop = SL_types == "Fixed" ? short_sls : shortStop1s, when=since_shortEntry > 0)
        strategy.entry("S", strategy.short, when=short)
    if not useShorts
        strategy.close("L", when=short)
    if not useLongs
        strategy.close("S", when=long)

/////////////// Plotting /////////////// 
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=40)
p0 = plot(close)
p1 = plot(strategy.position_size <= 0 ? na : SL_typel == "Fixed" ? long_sll : longStop1l, title="Long Stop Loss", color=color.yellow, style=plot.style_linebr, linewidth=2)
p2 = plot(strategy.position_size >= 0 ? na : SL_types == "Fixed" ? short_sls : shortStop1s, title="Short Stop Loss", color=color.orange, style=plot.style_linebr, linewidth=2)
p3 = plot(strategy.position_size <= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Long Entry", color=color.green, linewidth=2)
p4 = plot(strategy.position_size >= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Short Entry", color=color.red, linewidth=2)
fill(p0, p3, color = color.lime, transp=60)
fill(p0, p4, color = color.red, transp=60)

더 많은