이동평균 기반 로테이션 트레이딩 전략


생성 날짜: 2024-02-21 17:03:31 마지막으로 수정됨: 2024-02-21 17:03:31
복사: 0 클릭수: 648
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

이동평균 기반 로테이션 트레이딩 전략

개요

이 전략의 주요 아이디어는 장기 동향 방향에서 단기 회수 거래를하는 것입니다. 구체적으로, 200 일 간소 이동 평균을 사용하여 장기 동향 방향을 판단하고, 10 일 간소 이동 평균을 사용하여 단기 동향 방향을 판단합니다. 가격이 200 일 일선보다 높을 때 상향 시장이며, 가격이 200 일선 이하일 때 공백 시장입니다.

전략 원칙

이 전략은 200일 간단한 이동 평균선과 10일 간단한 이동 평균선을 사용하여 시장의 추세를 판단한다. 가격이 200일 선을 넘었을 때 다단계 시장에 진입한다고 간주하고, 가격이 200일 선을 넘었을 때 공백 시장에 진입한다고 간주한다. 다단계 시장에서 가격이 10일 선을 근처에 떨어지면 단기 조정이 있음을 나타냅니다.

구체적으로, 다음 조건이 충족될 때, 더 많은 진입을 한다: 가격이 200일선 이상, 가격이 10일선 이하, 이전에 포지션이 없다. 다음 조건이 충족될 때, 평형 포지션이 진출한다: 가격이 10일선 이상, 이전에 다수 포지션이 있다. 큰 손실을 방지하기 위해, FAILSAFE 스톱 손실이 설정되어, 최고점에서 10% 이상의 철회율이 발생하면, 직접적인 스톱 손실이 철회된다.

볼 수 있듯이, 이 전략의 거래 논리는 주로 평행선의 황금 포크 데드 포크에 기반하며, 장단 평균선 판단 후 트렌드 방향에 대한 회수 구매 및 트렌드 추적 스톱을 수행하며, 전형적인 트렌드 추적 전략에 속한다.

우위 분석

이 전략의 가장 큰 장점은 낮은 자본 비용으로 트렌드를 추적하여 초과 수익을 추구하는 것입니다. 구체적인 장점은 다음과 같습니다:

  1. 장기 단기 평균선 조합을 사용하여 주 하위 계층의 경향 방향을 판단하여 중장기 경향 기회를 효과적으로 고정하여 단기 시장 현상에 의해 오해되는 것을 피할 수 있습니다.

  2. 단기 회수 절단 방식을 사용하면 구매 비용을 최소화하여 높은 수익을 얻을 수 있습니다.

  3. FAILSAFE 손실 제도를 설정하여 개별 손실을 효과적으로 제어하고 계좌 자금을 안전하게 보호합니다.

  4. 엑스트레이트 (Exit) 를 추적하고, 중장기 트렌드 기회를 최대한 활용하여 초과 알파를 얻을 수 있습니다.

  5. 순전히 기계화된 거래 방식을 채택하여 주관적 감정의 영향을 피하고, 전략을 더 쉽게 실행할 수 있도록 한다.

위험 분석

이 전략에는 다음과 같은 위험들이 있습니다.

  1. 데이터 적합성을 재검토한다. 실제 시장 조건은 역사적 데이터와 차이가 있을 수 있으며, 이로 인해 실 디스크 거래 효과가 상쇄된다.

  2. 가짜 돌파 위험. 가격이 평균선 근처에 만지면 반전 회귀의 확률이 높고, 소액 손실이 발생할 가능성이 높다.

  3. 트렌드 반전 위험. 중장선 트렌드가 갑자기 반전되는 것은 흔한 현상이며, 이때 포지션을 보유하면 큰 손실이 발생할 수 있다.

대응 방법은 다음과 같습니다.

  1. 샘플을 늘리고, 더 많은 역사적 데이터를 사용하여 안정성 검증을 통해 결과를 신뢰하십시오.

  2. 최적화 변수, 평형 시스템 변수 조합을 조정하여 거래 신호 품질을 보장한다.

  3. 적절히 느슨한 중지 라인을, 가격의 일정한 회수 공간을 제공, 너무 민감한 중지 피하십시오.

최적화 방향

이 전략은 다음과 같은 부분에서 더 개선될 수 있습니다.

  1. 거래량 필터링과 같은 필터링 조건을 추가하면 가짜 돌파구로 인한 불필요한 거래를 효과적으로 줄일 수 있습니다.

  2. KDJ, MACD 등과 같은 다른 지표와 결합하여 지표 포트폴리오를 형성하여 거래 신호의 질을 향상시킬 수 있습니다.

  3. 다른 포지션 보유 시간을 테스트하고, 스톱과 스톱로스 전략을 최적화하고, 샤프율을 더 높이는 등 지표.

  4. 시장 상황에 따라 동적으로 변수를 조정하고, 적응 변수 최적화 메커니즘을 형성하여 전략을 더 거칠게 만듭니다.

  5. 알고리즘 거래 모듈을 추가하고, 기계 학습과 같은 방법을 사용하여 거래 신호를 자동으로 생성하여 인간의 개입을 줄입니다.

요약하다

이 전략의 전체적인 아이디어는 명확하고, 구현하기 쉬운 것으로, 낮은 비용으로 중장선 트렌드를 추적하여 안정적인 알파를 얻을 수 있다. 그러나 또한 일정 확률로 중장선 트렌드를 추적할 수 있는 리스크가 존재하며, 안정성을 높이기 위해 추가적인 최적화가 필요하다.

전략 소스 코드
/*backtest
start: 2024-01-21 00:00:00
end: 2024-02-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © irfanp056
// @version=5

strategy("Simple Pullback Strategy", 
     overlay=true, 
     initial_capital=100000,
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=1000, // 100% of balance invested on each trade
     commission_type=strategy.commission.cash_per_contract, 
     commission_value=0.005) // Interactive Brokers rate

// Get user input
i_ma1           = input.int(title="MA 1 Length", defval=200, step=10, group="Strategy Parameters", tooltip="Long-term MA")
i_ma2           = input.int(title="MA 2 Length", defval=10, step=10, group="Strategy Parameters", tooltip="Short-term MA")
i_stopPercent   = input.float(title="Stop Loss Percent", defval=0.10, step=0.1, group="Strategy Parameters", tooltip="Failsafe Stop Loss Percent Decline")
i_lowerClose    = input.bool(title="Exit On Lower Close", defval=false, group="Strategy Parameters", tooltip="Wait for a lower-close before exiting above MA2")
i_startTime     = input(title="Start Filter", defval=timestamp("01 Jan 1995 13:30 +0000"), group="Time Filter", tooltip="Start date & time to begin searching for setups")
i_endTime       = input(title="End Filter", defval=timestamp("1 Jan 2099 19:30 +0000"), group="Time Filter", tooltip="End date & time to stop searching for setups")

// Get indicator values
ma1 = ta.sma(close, i_ma1)
ma2 = ta.sma(close, i_ma2)

// Check filter(s)
f_dateFilter = true

// Check buy/sell conditions
var float buyPrice = 0
buyCondition    = close > ma1 and close < ma2 and strategy.position_size == 0 and f_dateFilter
sellCondition   = close > ma2 and strategy.position_size > 0 and (not i_lowerClose or close < low[1])
stopDistance    = strategy.position_size > 0 ? ((buyPrice - close) / close) : na
stopPrice       = strategy.position_size > 0 ? buyPrice - (buyPrice * i_stopPercent) : na
stopCondition   = strategy.position_size > 0 and stopDistance > i_stopPercent

// Enter positions
if buyCondition
    strategy.entry(id="Long", direction=strategy.long)

if buyCondition[1]
    buyPrice := open

// Exit positions
if sellCondition or stopCondition
    strategy.close(id="Long", comment="Exit" + (stopCondition ? "SL=true" : ""))
    buyPrice := na

// Draw pretty colors
plot(buyPrice, color=color.lime, style=plot.style_linebr)
plot(stopPrice, color=color.red, style=plot.style_linebr, offset=-1)
plot(ma1, color=color.blue)
plot(ma2, color=color.orange)