날짜 범위 선택과 함께 볼링거 밴드 전략

저자:차오장, 날짜: 2024-02-05 16:04:40
태그:

img

전반적인 설명

이 전략은 볼링거 밴드 지표에 기반한 선택 가능한 역사적 날짜 범위로 동적 볼링거 밴드 거래 전략을 구현합니다. 사용자가 백테스팅의 시작 및 종료 시간을 선택할 수 있도록 해, 따라서 다른 시간대에 동적 볼링거 밴드 전략을 백테스팅하고 비교할 수 있습니다.

전략 이름

이 전략은 Bollinger Band Strategy with Date Range Selection라고 불립니다. 이 이름에는 Bollinger BandDate Range Selection이라는 키워드가 포함되어 있으며, 이 전략의 주요 기능을 정확하게 요약합니다.

전략 논리

이 전략의 핵심 원칙은 볼링거 밴드 지표의 역동적인 상부 및 하부 레일을 기반으로 거래 신호를 생성하는 것입니다. 볼링거 밴드 중부 레일은 n 일간 간단한 이동 평균이며 상부 및 하부 레일은 각각 n 일간 표준 편차의 중부 레일 플러스 및 마이너스 m 배입니다. 가격이 하부 레일을 통과하면 길게 이동합니다. 가격이 상부 레일을 통과하면 짧게 이동합니다.

이 전략의 또 다른 핵심 특징은 사용자가 백테스팅 시간 범위를 선택할 수 있도록 하는 것입니다. 이 전략은 시작 및 종료 시간을 선택할 수 있는 입력 매개 변수를 제공합니다.

구체적으로, 이 전략은 선택된 시작 및 종료 시간을 타임 스탬프 형식으로 타임 스탬프 () 함수를 통해 변환하고, 그 다음 조건 time>=start 및 time<=finish을 통해 전략의 유효한 백트 테스트 시간 창을 설정합니다. 이것은 동적 시간 범위 선택 기능을 달성합니다.

장점

이 전략의 가장 큰 장점은 동적인 볼링거 밴드 전략을 임의의 시간 범위 선택과 완벽하게 결합한다는 것입니다. 이것은 사용자가 보다 유연하고 포괄적인 방식으로 전략을 백테스트하고 검증 할 수 있습니다. 구체적인 장점은 다음과 같습니다.

  1. 트렌드 거래를 위해 시장 상승과 하락 도중 트렌드 역전 신호를 포착 할 수있는 동적인 볼링거 밴드 전략을 구현하십시오.

  2. 다른 시장 환경에서 전략 성과를 분석하기 위해 백테스팅을 위해 임의의 역사적 시간대를 선택하는 것을 지원하여 전략의 동적 최적화를 달성합니다.

  3. 볼링거 밴드 지표의 적응력과 결합하여 이 전략은 시장 조건의 광범위한 변화에 적응하기 위해 매개 변수를 자동으로 조정할 수 있습니다.

  4. 장기 및 단기 사용에 대한 조정 가능한 매개 변수를 제공하여 사용자가 전략을 더 실용적으로 만들기 위해 자신의 필요에 따라 매개 변수를 최적화 할 수 있습니다.

  5. 더 상세한 전략 분석을 위해 더 높은 정확도로 백테스팅을 위해 특정 시간 및 분을 선택할 수 있습니다.

  6. 좋은 사용자 경험을 위해 중국어와 영어를 지원합니다.

위험성

이 전략의 주요 위험은 트렌드 반전을 결정하는 볼링거 밴드 지표의 불확실성입니다. 구체적인 위험 지점은 다음과 같습니다.

  1. 볼링거 밴드 지표 자체는 시장 변동을 완벽하게 결정하지 않으며 잘못된 신호가있을 수 있습니다.

  2. 부적절한 볼링거 밴드 매개 변수 선택은 나쁜 전략 성과 또는 손실로 이어질 수 있습니다.

  3. 특수한 시장 조건에서 지표가 고장날 가능성

  4. 백테스트 날짜 범위를 잘못 선택하면 중요한 시장 조건을 놓칠 수 있습니다.

이러한 위험을 통제하고 개선하기 위해 다음과 같은 방법을 사용할 수 있습니다.

  1. 볼링거 밴드 매개 변수를 최적화하고 다양한 제품과 시간대에 적응하도록 중간 레일의 주기를 조정합니다.

  2. 거짓 신호를 줄이기 위해 확인을 위해 이동 평균과 같은 다른 지표를 사용합니다.

  3. 전략의 안정성을 평가하기 위해 더 많은 시장 기간을 테스트하십시오.

  4. 단일 손실을 제어하기 위해 중지 손실 포인트를 설정합니다.

전략 최적화의 방향

이 전략을 최적화하기 위한 몇 가지 주요 방향이 있습니다.

  1. 기계 학습 알고리즘을 결합하여 볼링거 밴드 매개 변수를 동적으로 최적화합니다.

  2. 매개 변수 안정성을 완전히 평가하기 위해 브레이크백 테스트와 같은 기능을 높여야 합니다.

  3. 스톱 로스를 이동하고 스톱 로스를 추적하는 기능과 같이 추가하여 수익을 확보하고 위험을 줄이십시오.

  4. 진입 논리를 최적화하고 거래량 급증과 같은 더 많은 확인 조건을 설정하십시오.

  5. 주식 지수 선물 중재와 같은 전략을 결합하여 전략 적용 범위를 확장합니다.

  6. 백테스팅에서 라이브 트레이딩으로 전환하기 위해 자동 거래 실행 기능을 추가합니다.

이러한 최적화는 전략의 실질적인 성과와 안정적인 수익성을 크게 향상시킬 수 있습니다.

요약

이 전략은 볼링거 밴드 전략을 임의의 역사적 시간 범위 선택과 성공적으로 통합했습니다. 이러한 매우 유연하고 역동적인 백테스팅 분석은 사용자가 다른 시장 환경에서 전략 매개 변수를 정확하게 조정하고 최적화 할 수 있습니다. 제공 된 시각화 또한 사용자 경험을 크게 향상시킵니다. 이 전략이 사용자에게 강력하고 효율적인 양적 거래 도구를 제공할 수 있습니다.


/*backtest
start: 2024-01-05 00:00:00
end: 2024-02-04 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3

strategy("BB Range", shorttitle = "BB Range", overlay=true, max_bars_back=200)

// Revision:        1
// Author:          @allanster 

// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 7, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 20, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2017)
FromHour  = input(defval = 17, title = "From Hour", minval = 00)
FromMinute  = input(defval = 00, title = "From Minute", minval = 00)

ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)
ToHour  = input(defval = 23, title = "To Hour", minval = 00)
ToMinute  = input(defval = 59, title = "To Minute", minval = 00)

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, FromHour, FromMinute)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, ToHour, ToMinute)        // backtest finish window
window()  => true
source = close
length = input(20, minval=1)
mult = input(2.0, minval=0.001, maxval=50)

basis = sma(source, length)
dev = mult * stdev(source, length)

upper = basis + dev
lower = basis - dev

upper_stop = upper * 1.05
lower_stop = lower * 0.95

buyEntry = crossover(source, lower)
sellEntry = crossunder(source, upper)

if (crossover(source, lower))
    strategy.entry("BBandLE", strategy.long, stop=lower_stop, when = window(), oca_name="BollingerBands",  comment="BBandLE")
else
    strategy.cancel(id="BBandLE")

if (crossunder(source, upper))
    strategy.entry("BBandSE", strategy.short, stop=upper_stop, when=window(), oca_name="BollingerBands",comment="BBandSE")
else
    strategy.cancel(id="BBandSE")





더 많은