리소스 로딩... 로딩...

100일 이동평균 최적화와 함께 트리플 표준편차 볼링거 밴드 브레이크업 전략

저자:차오장, 날짜: 2024-12-13 11:20:13
태그:MABBSMASD

img

전반적인 설명

이 전략은 볼링거 밴드 브레이크아웃을 기반으로 한 양적 거래 시스템으로, 상위 밴드에 3개의 표준 편차와 하위 밴드에 1개의 표준 편차를 사용하여, 중위 밴드로서 100일 이동 평균과 결합합니다. 이 전략은 주로 상위 밴드 이상의 가격 브레이크아웃을 감지하여 장기적인 트렌드를 포착하고 하위 밴드를 스톱 로스 신호로 사용합니다. 핵심 개념은 강력한 브레이크아웃 중에 포지션을 입력하고 가격이 하위 밴드 아래에 떨어지면 종료하여 통제된 위험 트렌드를 달성하는 것입니다.

전략 원칙

기본 원리는 볼링거 밴드의 통계적 특성에 기반합니다. 상단 밴드는 3 개의 표준 편차를 사용하며, 정상적인 분포 가정 하에서 가격의 이 수준 이상의 파업 확률은 0.15%에 불과하며, 파업이 발생하면 중요한 트렌드 형성을 시사합니다. 중단 밴드는 100 일 이동 평균을 사용하며, 단기 시장 소음을 효과적으로 필터링 할 수 있는 충분한 기간입니다. 하단 밴드는 1 개의 표준 편차를 중지 손실 라인으로 사용하며, 비교적 보수적인 설정으로 적시에 출출 할 수 있습니다. 이 전략은 가격이 상단 밴드 이상의 파업을 할 때 긴 신호를 생성하고 가격이 하단 밴드 이하로 떨어지면 출출합니다.

전략적 장점

  1. 강한 트렌드 포착 능력: 3 표준 오차 설정은 효과적으로 중요한 트렌드 브레이크 기회를 포착합니다.
  2. 합리적인 리스크 관리: 스톱 로스 라인으로 1개의 표준편차를 사용하는 것은 보수적인 리스크 관리를 제공합니다.
  3. 높은 매개 변수 적응성: 표준 오차 곱자와 이동 평균 기간은 다른 시장 특성에 맞게 조정할 수 있습니다.
  4. 체계적인 접근: 정확한 성능 추적을 위해 포괄적인 백테스팅 기능을 가진 명확한 전략 논리.
  5. 광범위한 적용 가능성: 주식 및 암호화폐를 포함한 다양한 시장에 적용 할 수 있습니다.

전략 위험

  1. 가짜 브레이크 위험: 시장은 단기적인 브레이크가 뒤따라 빠른 반전으로 인해 잘못된 신호가 나타날 수 있습니다.
  2. 상당한 마감: 매우 변동적인 시장에서 큰 마감이 발생할 수 있습니다.
  3. 지연 위험: 100일 이동 평균은 고유 한 지연을 가지고 있으며, 일부 빠른 시장 움직임을 놓칠 수 있습니다.
  4. 시장 환경 의존성: 다양한 시장에서 과도한 거래를 생성하여 높은 거래 비용을 초래할 수 있습니다.

전략 최적화 방향

  1. 부피 확인을 포함: 신호 신뢰성을 향상시키기 위해 부피 파업 확인 메커니즘을 추가합니다.
  2. 스톱 로스 메커니즘을 최적화: 더 유연한 출구 관리를 위해 후속 스톱 또는 ATR 기반 동적 스톱을 구현하는 것을 고려하십시오.
  3. 트렌드 필터를 추가합니다. 주요 트렌드 방향으로만 거래하기 위해 장기 트렌드 식별 지표를 포함합니다.
  4. 포지션 관리를 개선: 파업 강도에 따라 포지션 크기를 동적으로 조정합니다.
  5. 시간 필터를 추가합니다. 특정 시장 기간 동안 거래를 피하십시오.

요약

이것은 명확한 논리를 가진 전략을 따르는 잘 설계된 트렌드입니다. 볼링거 밴드의 통계적 특성 및 이동 평균의 트렌드 추적 특성을 통해 중요한 시장 유출 기회를 효과적으로 포착합니다. 인수 위험이 있지만 합리적인 스톱 로스 설정과 위험 통제를 통해 전략은 실용적 가치를 유지합니다. 추가 최적화 잠재력은 신호 확인, 스톱 로스 메커니즘 및 위치 관리 측면에 있습니다.


/*backtest
start: 2024-11-12 00:00:00
end: 2024-12-11 08:00:00
period: 1h
basePeriod: 1h
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/
// © MounirTrades007

// @version=6
strategy("Bollinger Bands", overlay=true, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=200)

// Get user input
var g_bb        = "Bollinger Band Settings"
upperBandSD     = input.float(title="Upper Band Std Dev", defval=3.0, tooltip="Upper band's standard deviation multiplier", group=g_bb)
lowerBandSD     = input.float(title="Lower Band Std Dev", defval=1.0, tooltip="Lower band's standard deviation multiplier", group=g_bb)
maPeriod        = input.int(title="Middle Band MA Length", defval=100, tooltip="Middle band's SMA period length", group=g_bb)
var g_tester    = "Backtester Settings"
drawTester      = input.bool(title="Draw Backtester", defval=true, group=g_tester, tooltip="Turn on/off inbuilt backtester display")

// Get Bollinger Bands
[bbIgnore1, bbHigh, bbIgnore2] = ta.bb(close, maPeriod, upperBandSD)
[bbMid, bbIgnore3, bbLow]      = ta.bb(close, maPeriod, lowerBandSD)

// Prepare trade persistent variables
drawEntry   = false
drawExit    = false

// Detect bollinger breakout
if close > bbHigh and barstate.isconfirmed and strategy.position_size == 0
    drawEntry := true
    strategy.entry(id="Trade", direction=strategy.long)
    alert("Bollinger Breakout Detected for " + syminfo.ticker, alert.freq_once_per_bar_close)

// Detect bollinger sell signal
if close < bbLow and barstate.isconfirmed and strategy.position_size != 0
    drawExit := true
    strategy.close(id="Trade")
    alert("Bollinger Exit detected for " + syminfo.ticker, alert.freq_once_per_bar_close)

// Draw bollinger bands
plot(bbMid, color=color.blue, title="Middle SMA")
plot(bbHigh, color=color.green, title="Upper Band")
plot(bbLow, color=color.red, title="Lower Band")

// Draw signals
plotshape(drawEntry, style=shape.triangleup, color=color.green, location=location.belowbar, size=size.normal, title="Buy Signal")
plotshape(drawExit, style=shape.xcross, color=color.red, location=location.belowbar, size=size.normal, title="Sell Signal")

// // =============================================================================
// // START BACKTEST CODE
// // =============================================================================

// // Prepare stats table
// var table testTable = table.new(position.top_right, 2, 2, border_width=1)
// f_fillCell(_table, _column, _row, _title, _value, _bgcolor, _txtcolor) =>
//     _cellText = _title + "\n" + _value
//     table.cell(_table, _column, _row, _cellText, bgcolor=_bgcolor, text_color=_txtcolor)

// // Draw stats table
// var bgcolor = color.black
// if barstate.islastconfirmedhistory
//     if drawTester
//         dollarReturn = strategy.equity - strategy.initial_capital
//         f_fillCell(testTable, 0, 0, "Total Trades:", str.tostring(strategy.closedtrades), bgcolor, color.white)
//         f_fillCell(testTable, 0, 1, "Win Rate:", str.tostring(strategy.wintrades / strategy.closedtrades * 100, "##.##") + "%", bgcolor, color.white)
//         f_fillCell(testTable, 1, 0, "Equity:", "$" + str.tostring(strategy.equity, "###,###.##"), bgcolor, color.white)
//         f_fillCell(testTable, 1, 1, "Return:", str.tostring((strategy.netprofit / strategy.initial_capital) * 100, "##.##") + "%", dollarReturn > 0 ? color.green : color.red, color.white)

// // =============================================================================
// // END BACKTEST CODE
// // =============================================================================

관련

더 많은