볼린저 밴드와 RSI를 기반으로 한 양적 거래 전략


생성 날짜: 2023-12-20 15:39:19 마지막으로 수정됨: 2023-12-20 15:39:19
복사: 0 클릭수: 679
avatar of ChaoZhang ChaoZhang
1
집중하다
1621
수행원

볼린저 밴드와 RSI를 기반으로 한 양적 거래 전략

개요

이 전략은 브린 밴드와 상대적으로 강한 지표 ((RSI) 를 기반으로 한 양적 거래 전략을 설계했다. 이 전략은 트렌드 추적과 오버 바이 오버 소드를 결합하여 트렌드 시작 단계에서 시장에 진입하고 오버 바이 오버 소드를 통해 수익을 얻기 위해 탈퇴하는 것을 목표로합니다.

전략 원칙

이 전략은 부린을 사용하여 가격 추세와 지지 저항을 판단합니다. 부린이 경로에 가까워지면 과매매 신호로 간주되며, 부린이 경로에 가까워지면 과매매 신호로 간주됩니다. 동시에 RSI 지표와 결합하여 과매매 또는 과매매 여부를 판단합니다.

구체적인 거래 규칙은: 가격이 부린띠 아래로 내려가면 RSI가 30보다 낮으면 더 많은 입장을 취하고; 가격이 부린띠 위로 올라가면 RSI가 70 이상이면 공백 입장을 취한다. 정지 Exit을 할 때, 부린띠 중선 또는 반대 방향으로의 부린띠 궤도를 정지 지점으로 선택한다. 정지는 입장 가격의 일정한 비율로 설정된다.

전략적 이점

이 전략은 브린띠의 트렌드 추적과 RSI의 과매매 판단을 결합하여 트렌드의 시작 지점을 더 잘 파악할 수 있습니다. 또한, 중지 및 중지 전략은 위험 관리에 도움이됩니다.

불린 밴드 또는 RSI와 같은 지표를 단독으로 사용하는 것에 비해, 이 전략은 다양한 지표와 변수를 종합적으로 사용함으로써 의사 결정의 정확성을 향상시킬 수 있다. 변수가 적절하게 조정되면 거래 성과가 비교적 안정된다.

전략적 위험

이 전략은 주로 파라미터 최적화에 의존하며, 파라미터가 잘못 설정되면 큰 위험에 직면하게 된다. 예를 들어, 부린 밴드 주기 파라미터가 일치하지 않으면 트렌드를 놓치거나 가짜 신호를 생성할 수 있다. 또한, 스톱 스톱 손실 지점은 신중하게 평가되어야 한다.

이 전략은 거래 품종에도 약간의 의존성이 있습니다. 변동성이 높은 품종에 대해서는 브린 밴드 매개 변수를 조정해야 합니다. 추세가 명확하지 않은 품종에 대해서는 효과가 할인됩니다. 또한, 전략은 거래 비용, 슬라이드 및 극단적인 상황에 영향을 받습니다.

변수 최적화 테스트를 수행하고, 스톱 스톱 손실 수준을 평가하고, 다양한 품종과 시장 환경에서의 성능을 테스트하는 것이 좋습니다.

최적화 방향

이 전략은 다음과 같은 방향으로 계속 개선될 수 있습니다.

  1. 브린 띠와 RSI의 매개 변수를 평가하고 최적화하여 거래되는 품종의 특성에 더 잘 맞게 만듭니다.

  2. KDJ, MACD 등과 같은 다른 지표 판단을 추가하여 다인자 모델을 형성합니다.

  3. 스톱 스톱 손실 전략을 평가하고, 유동 스톱 또는 분기 스톱을 설정합니다.

  4. 특정 품종과 시장 환경에 따라 파라미터 동적으로 최적화

  5. 신호 품질과 위험 수준을 판단하는 기계 학습 모델을 추가합니다.

요약하다

이 전략은 브린 밴드 및 RSI 지표를 통합하여 보다 완전한 트렌드 추적 전략을 설계했다. 파라미터 최적화 및 위험 관리, 그 효과 및 안정성이 더 개선 할 여지가있다. 자신의 필요와 위험 선호에 따라 조정 및 최적화를 제안하여 더 나은 성과를 얻을 수 있습니다.

전략 소스 코드
/*backtest
start: 2023-11-01 00:00:00
end: 2023-11-30 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("BB + RSI Estrategia", overlay=true)

longitud = input(20, title="Longitud BB", minval=5, maxval=50, step=1)
multiplicador = input(2.0, title="Multiplicador BB", type=input.float, step=0.1)
timeframe_bb = input("D", title="Marco de Tiempo BB", type=input.resolution)
rsi_length = input(14, title="Longitud RSI", minval=5, maxval=50, step=1)
rsi_overbought = input(70, title="Nivel de sobrecompra RSI", minval=50, maxval=80, step=1)
rsi_oversold = input(30, title="Nivel de sobreventa RSI", minval=20, maxval=50, step=1)
take_profit = input("Central", title="Take Profit (banda)", options=["Central", "Opuesta"])
stop_loss = input(2.00, title="Stop Loss", type=input.float, step=0.10)

var SL = 0.0

[banda_central, banda_superior, banda_inferior] = security(syminfo.tickerid, timeframe_bb, bb(close, longitud, multiplicador))
rsi_value = rsi(close, rsi_length)

comprado = strategy.position_size > 0
vendido = strategy.position_size < 0

if not comprado and not vendido
    if close < banda_inferior and rsi_value < rsi_oversold
        // Realizar la compra
        cantidad = round(strategy.equity / close)
        strategy.entry("Compra", strategy.long, qty=cantidad, when=cantidad > 0)
        SL := close * (1 - (stop_loss / 100))

    if close > banda_superior and rsi_value > rsi_overbought
        // Realizar la Venta
        cantidad = round(strategy.equity / close)
        strategy.entry("Venta", strategy.short, qty=cantidad, when=cantidad > 0)
        SL := close * (1 + (stop_loss / 100))

if comprado
    // Verificar el take profit
    if take_profit == "Central" and close >= banda_central
        strategy.close("Compra", comment="TP")
        SL := 0

    if take_profit == "Opuesta" and close >= banda_superior
        strategy.close("Compra", comment="TP")
        SL := 0
    // Verificar el stop loss
    if close <= SL
        strategy.close("Compra", comment="SL")
        SL := 0

if vendido
    // Verificar el take profit
    if take_profit == "Central" and close <= banda_central
        strategy.close("Venta", comment="TP")
        SL := 0

    if take_profit == "Opuesta" and close <= banda_inferior
        strategy.close("Venta", comment="TP")
        SL := 0
    // Verificar el Stop loss
    if close >= SL
        strategy.close("Venta", comment="SL")
        SL := 0

// Salida
plot(SL > 0 ? SL : na, style=plot.style_circles, color=color.red)
g1 = plot(banda_superior, color=color.aqua)
plot(banda_central, color=color.red)
g2 = plot(banda_inferior, color=color.aqua)
fill(g1, g2, color=color.aqua, transp=97)

// Dibujar niveles de sobrecompra/sobreventa del RSI
hline(rsi_overbought, "RSI Overbought", color=color.red)
hline(rsi_oversold, "RSI Oversold", color=color.green)