듀얼 MA를 기반으로 한 적응성 백테스트 날짜 범위 선택 전략

저자:차오장, 날짜: 2024-01-05
태그:

img

전반적인 설명

이 전략의 핵심 아이디어는 사용자들의 다양한 요구를 충족시키기 위해 백테스트 날짜 범위를 유연하게 선택할 수 있는 프레임워크를 구현하는 것입니다. 그래서 그들은 자동 또는 수동으로 백테스트의 시작 및 종료 시간을 설정할 수 있습니다.

이 전략은 입력 매개 변수를 통해 날짜 범위 선택에 대한 네 가지 옵션을 제공합니다: 모든 역사 데이터, 최근 지정된 날, 최근 지정된 주 또는 날짜 범위를 수동으로 지정합니다. 이 전략은 선택된 날짜 범위에 따라 역동적으로 백테스트 창을 설정하면서 거래 논리를 변경하지 않으므로 다른 시간 창에서 성능 차이를 비교 할 수 있습니다.

전략 원칙

이 전략은 두 개의 모듈으로 구성됩니다: 백테스트 날짜 범위 선택 및 이중 MA 거래 전략.

백테스트 날짜 범위 선택 모듈

  1. 날짜 범위 선택의 네 가지 옵션을 제공합니다: 모든 역사 데이터 (ALL), 최근 지정된 날 (DAYS), 최근 지정된 주 (WEEKS), 수동 지정된 날짜 범위 (MANUAL).
  2. 역동적으로 선택된 범위의 시간표 변환을 기반으로 백테스트 시작 및 종료 시간을 설정합니다.
  3. 촛불을 필터링 하 고 선택한 날짜 범위 내에서만 백테스트를 하기 위해 시간 조건 창 (() 함수를 사용합니다.

이중 MA 거래 전략 모듈

  1. 빠른 MA 기간은 fastMA, 기본 14, 느린 MA 기간은 slowMA, 기본 28.
  2. 빠른 MA가 느린 MA를 넘을 때 긴 위치; 빠른 MA가 느린 MA를 넘을 때 긴 위치
  3. 빠른 MA 곡선과 느린 MA 곡선을 그래프합니다.

이점 분석

  1. 다양한 실험 필요를 충족시키기 위해 다양한 백테스트 날짜 범위를 제한없이 유연하게 선택합니다.
  2. 결과의 비교성을 가진 동일한 시간 프레임 내에서 다른 기간 매개 변수의 효과를 테스트 할 수 있습니다.
  3. 다른 전략의 틀로 쓰기 위해 거래 논리를 쉽게 수정할 수 있습니다.
  4. 이중 MA 전략을 이해하기 쉽고 초보자도 쉽게 이해할 수 있습니다.

위험 분석 및 해결책

  1. 이중 MA 전략은 빈번한 구매/판매 문제로 원시적입니다. 최적화를 위해 스톱 로스 등을 추가하는 것을 고려하십시오.
  2. 날짜 범위를 수동으로 설정하면 오류를 방지하기 위해 주의가 필요합니다. 경고 메시지를 표시할 수 있습니다.
  3. 긴 역사 백테스트는 테스트 사이클을 증가시킵니다. 빈번한 거래를 줄이기 위해 미끄러짐 또는 수수료를 추가하는 것을 고려할 수 있습니다.

전략 최적화의 방향

  1. 손실 위험을 줄이기 위해 스톱 로지크를 추가합니다.
  2. 더 높은 안정성을 위해 강한 인덱스 관련성으로 주식을 풀하는 주식 필터.
  3. 필터를 추가하여 특정 기간 내에 불안정한 신호를 제거하여 불필요한 거래를 줄이십시오.
  4. 가장 좋은 품종을 찾기 위해 주식 지수의 테스트 성과.

결론

유연하고 사용자 정의 가능한 날짜 범위 선택의 프레임워크로서, 장점은 사용자의 다양한 테스트 요구를 충족시키고 있습니다. 간단하지만 효과적인 이중 MA 거래 논리와 결합하여 전략을 신속하게 확인하고 비교 할 수 있습니다. 필터 또는 스톱 로스 로직을 추가하는 것과 같은 후속 최적화는 라이브 거래에 전략을 더 실용적으로 만들 수 있습니다. 요약하자면 전략 프레임워크는 좋은 확장성과 참조 가치를 가지고 있습니다.


/*backtest
start: 2022-12-29 00:00:00
end: 2024-01-04 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title = "How To Auto Set Date Range", shorttitle = " ", overlay = true)

// Revision:        1
// Author:          @allanster 

// === INPUT MA ===
fastMA = input(defval = 14, title = "FastMA", type = input.integer, minval = 1, step = 1)
slowMA = input(defval = 28, title = "SlowMA", type = input.integer, minval = 1, step = 1)

// === INPUT BACKTEST RANGE ===
useRange     = input(defval = "WEEKS", title = "Date Range", type = input.string, confirm = false, options = ["ALL", "DAYS", "WEEKS", "MANUAL"])
nDaysOrWeeks = input(defval = 52, title = "# Days or Weeks", type = input.integer, minval = 1)
FromMonth    = input(defval = 9, title = "From Month", minval = 1, maxval = 12)
FromDay      = input(defval = 15, title = "From Day", minval = 1, maxval = 31)
FromYear     = input(defval = 2019, 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 = 9999, title = "To Year", minval = 2014)

// === FUNCTION EXAMPLE ===
window() => true

// === LOGIC ===
buy  = crossover(sma(close, fastMA), sma(close, slowMA))         // buy when fastMA crosses over slowMA
sell = crossunder(sma(close, fastMA), sma(close, slowMA))        // sell when fastMA crosses under slowMA

// === EXECUTION ===
strategy.entry("L", strategy.long, when=window() and buy)        // buy long when "within window of time" AND crossover
strategy.close("L", when=window() and sell)                      // sell long when "within window of time" AND crossunder         

// === PLOTTING ===
plot(sma(close, fastMA), title = 'FastMA', color = color.aqua, linewidth = 2, style = plot.style_line)    // plot FastMA
plot(sma(close, slowMA), title = 'SlowMA', color = color.yellow, linewidth = 2, style = plot.style_line)  // plot SlowMA


더 많은