이동평균선을 기반으로 한 모멘텀 전략


생성 날짜: 2024-01-23 10:38:18 마지막으로 수정됨: 2024-01-23 10:38:18
복사: 0 클릭수: 519
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

이동평균선을 기반으로 한 모멘텀 전략

개요

이 전략은 이동 평균을 기반으로 한 동적 전략이다. 그것은 다른 주기에서 간단한 이동 평균을 계산하고 그 교차 상황을 비교하여 거래 신호를 생성한다. 구체적으로, 단기 이동 평균 위에 장기 이동 평균을 가로질러 구매 신호를 생성하고, 단기 이동 평균 아래에 장기 이동 평균을 가로질러 판매 신호를 생성한다.

전략 원칙

이 전략의 핵심 논리는 동량 효과, 즉 주식 가격 경향의 지속성을 기반으로 한다. 이동 평균은 주식 가격 변화의 경향을 효과적으로 반영할 수 있다. 단기 이동 평균 위에 장기 이동 평균을 뚫을 때, 주식 가격이 상승 추세에 들어간다는 것을 나타낸다. 반대로, 단기 이동 평균 아래에 장기 이동 평균을 뚫을 때, 주식 가격이 하향 추세에 들어간다는 것을 나타낸다. 이 전략은 이 원칙에 따라 거래 신호를 생성한다.

구체적으로, 전략에는 13일 간단한 이동 평균과 34일 간단한 이동 평균이 정의되어 있습니다. 매일의 폐가 가격을 계산한 후, 이 두 가지 이동 평균을 비교한 후, 그 값의 크기의 관계입니다. 13일 라인을 통과하면 34일 라인을 통과하면, 구매 신호를 생성합니다.

전략적 이점

이 전략의 가장 큰 장점은 간단하고 이해하기 쉽고 구현하기 쉽다는 것입니다. 이동 평균은 가장 기본적이면서도 가장 많이 사용되는 기술 지표 중 하나이며, 그 원리는 간단하고 이해하기 쉽고 적용됩니다. 또한 이동 평균 조합 신호는 오랜 연습을 통해 효과적이라는 것이 입증되었습니다.

또한, 이 전략의 매개 변수 설정은 다양한 품종 및 시장 환경에 따라 조정할 수 있습니다. 예를 들어 이동 평균의 주기적 매개 변수를 변경하여 전략의 민감도를 조정할 수 있습니다. 이것은 전략의 최적화 및 조정을위한 공간을 제공합니다.

위험 분석

이 전략의 가장 큰 위험은 잘못된 신호가 더 많이 발생할 수 있다는 점과 흔들리는 시장에서 을 수 있다는 것입니다. 가격이 큰 흔들림이있을 때, 이동 평균은 종종 교차하여 잘못된 신호가 발생할 수 있습니다. 이때 이동 평균 주기의 파라미터를 조정하여 약간의 소음을 필터링해야합니다.

또한, 시장이 큰 역동으로 변할 때, 전략의 중지 손해 지점이 돌파되어 큰 손실이 발생할 수 있습니다. 이것은 중지 손해 전략을 최적화하고 적절한 중지 손해 범위를 완화해야합니다.

최적화 방향

이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.

  1. 이동 평균의 주기적 변수를 최적화하여 다양한 품종과 시장 환경에서 변수의 최적의 조합을 찾습니다.

  2. 다른 기술 지표 필터를 추가하여 MACD, KD 등과 같이 진동 시 잘못된 신호를 피합니다.

  3. 최적화 및 동적으로 조정된 스톱 전략, 스톱을 보장하면서 스톱 포인트가 너무 가까워지지 않도록 방지하고, 스톱이 뚫릴 확률이 높습니다.

  4. 매매 위험 조절을 위해 고정 투입량, 매매 비율 등과 같은 포지션 관리 장치를 추가합니다.

요약하다

이 전략은 매우 고전적인 이동 평균 교차 전략으로, 단기 및 장기 이동 평균의 관계를 계산하고 비교하여 구매 및 판매 신호를 생성한다. 이 전략의 장점은 간단하고 이해하기 쉽고, 변수가 유연하며, 초보자 학습에 적합하다. 단점은 신호가 충분히 안정적이지 않을 수 있고, 변동하는 시장에서 쉽게 수 있다. 적절한 최적화를 통해 여전히 매우 실용적인 양적 전략이 될 수 있다.

전략 소스 코드
/*backtest
start: 2023-01-16 00:00:00
end: 2024-01-22 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
// TODO: update strategy name
strategy("{STRATEGY NAME}", overlay=true)

// === TA LOGIC ===

//
//
// TODO: PUT YOUR TA LOGIC HERE
LONG_SIGNAL_BOOLEAN = crossover(sma(close, 13), sma(close, 34))
SHORT_SIGNAL_BOOLEAN = crossunder(sma(close, 12), sma(close, 21))

// === INPUT BACKTEST DATE RANGE ===
enableShorts = input(false, title="Enable short entries?")

FromMonth = input(defval = 5, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 18, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 2017)
ToMonth   = input(defval = 9, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2018, title = "To Year", minval = 2017)

start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true // create function "within window of time"

// === STRATEGY BUY / SELL ENTRIES ===

// TODO: update the placeholder LONG_SIGNAL_BOOLEAN and SHORT_SIGNAL_BOOLEAN to signal
// long and short entries
buy() => window() and LONG_SIGNAL_BOOLEAN
sell() => window() and SHORT_SIGNAL_BOOLEAN

if buy()
    strategy.entry("Long", strategy.long, comment="Long")

if sell()
    if (enableShorts)
        strategy.entry("Short", strategy.short, comment="Short")
    else
        strategy.close("Long")

// === BACKTESTING: EXIT strategy ===
sl_inp = input(10, title='Stop Loss %', type=float)/100
tp_inp = input(30, title='Take Profit %', type=float)/100

stop_level = strategy.position_avg_price * (1 - sl_inp)
take_level = strategy.position_avg_price * (1 + tp_inp)

strategy.exit("Stop Loss/Profit", "Long", stop=stop_level, limit=take_level)