높은 낮은 브레이커 백테스트 전략

저자:차오장, 날짜: 2023-11-27 15:37:13
태그:

img

전반적인 설명

하이 로브 브레이커 백테스트 전략 (High Low Breaker Backtest strategy) 은 주식의 역사적 최고와 최하위를 사용하여 가격이 이러한 높은 낮은 범위에서 벗어날 수 있는지 여부를 결정하는 트렌드를 따르는 전략이다. 특정 기간 동안 가장 높은 가격과 가장 낮은 가격을 계산하고, 현재 기간의 가격이 최근 기간 동안 가장 높은 가격을 초과하면 구매 신호를 생성하고, 가격이 최근 기간 동안 가장 낮은 가격 아래로 넘어갈 때 판매 신호를 생성합니다. 트렌드 추적 전략의 한 종류로서 주식 가격의 일부 트렌드 특성을 캡처 할 수 있으며 라이브 거래에 실용적인 가치를 가지고 있습니다.

전략 논리

이 전략의 핵심 논리는 특정 수의 바 (전면 50 바) 에서 가장 높은 가격과 가장 낮은 가격을 계산하는 것입니다. 가장 높은 / 가장 낮은 가격을 계산할 때, 그것은 가까운 가격 또는 실제 높은 / 낮은 가격을 사용할 수 있습니다. 다음으로 현재 바의 폐쇄 가격 또는 높은 가격이 최근 기간 동안 가장 높은 가격을 초과하는지 확인하십시오. 만약 네이고 마지막 가장 높은 가격 바에서 최소 수의 바 (전면 30 바) 보다 더 많다면 구매 신호를 생성합니다. 마찬가지로, 현재 바의 폐쇄 가격 또는 낮은 가격이 최근 기간 동안 가장 낮은 가격을 깨고 마지막 최저 가격 이후 최소 수의 바를 통과하면 판매 신호를 생성합니다.

구매 신호를 생성하면 전략은 그 가격에 장기 포지션을 입력하고, 스톱 로스 가격과 수익 가격으로 설정됩니다. 스톱 로스 가격에 닿을 때 스톱 로스로 포지션을 종료하고, 수익 가격에 닿을 때 수익을 취합니다. 판매 신호의 논리는 비슷합니다.

이점 분석

이 높은 낮은 브레이커 백테스트 전략은 다음과 같은 장점을 가지고 있습니다:

  1. 논리는 간단하고 이해하기/시행하기 쉽습니다.
  2. 그것은 주식 가격의 추세 특성을 포착 할 수 있습니다.
  3. 매개 변수는 최적화되어 최적의 매개 변수 조합을 찾을 수 있습니다.
  4. 내장된 스톱 로스 및 취득 리스크 컨트롤.
  5. 시각화는 매개 변수 조정 및 결과 분석을 크게 용이하게 합니다.

위험 분석

이 전략에는 또한 몇 가지 위험이 있습니다.

  1. 여러번의 플립플롭 거래와 과도한 거래에 유연합니다.
  2. 가격 변동에 따라 빈번하게 포지션을 개설합니다.
  3. 매개 변수가 제대로 설정되지 않으면 주요 트렌드 기회를 놓칠 수 있습니다.
  4. 가격 변동의 빈도와 규모를 고려하지 않고
  5. 다른 지표와 신호 검증이 없습니다.

다음과 같은 측면은 이러한 위험을 완화하는 데 도움이 될 수 있습니다.

  1. 정지 손실 거리를 줄여 대기 시간을 늘려
  2. 더 많은 입시 기준을 추가하여 자주 입시를 피합니다.
  3. 최적의 조합을 찾기 위해 매개 변수를 최적화합니다.
  4. 다른 지표와 함께 필터 조건을 추가합니다.

최적화 방향

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

  1. 더 체계적인 테스트를 사용하여 파라미터 최적화
  2. 다른 지표와 함께 신호 필터를 추가하십시오. 예를 들어 이동 평균.
  3. 부진 기준을 조정하기 위해 ATR를 사용하여 가격 변동성을 고려합니다.
  4. 트렌딩과 오스실레이션 시장을 구분하여 매개 변수를 조정합니다.
  5. 포지션 사이즈링 규칙을 강화하십시오. 예를 들어 상당한 손실이 발생하면 새로운 포지션을 개설하는 것을 중단하십시오.

요약

요약하자면, 높은 낮은 브레이커 백테스트 전략은 간단하고 실용적인 트렌드 추적 전략이다. 그것은 주기적인 최고/최저 가격의 가격 브레이킹을 기반으로 거래 신호를 생성한다. 전략은 단순성, 트렌드 추적 및 매개 변수 최적화 등의 장점이 있지만, 과잉 거래 및 변동 시장을 처리할 수 없는 위험도 있다. 더 이상의 최적화는 매개 변수, 신호 필터, 포지션 사이징 등을 통해 성능을 향상시킬 수 있다.


/*backtest
start: 2023-11-25 00:00:00
end: 2023-11-26 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("High/Low Breaker Backtest 1.0", overlay=true, initial_capital=1000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, max_bars_back=700)

// Strategy Settings
takeProfitPercentageLong = input(.1, title='Take Profit Percentage Long', type=float)/100
stopLossPercentageLong = input(0.15, title='Stop Loss Percentage Long', type=float)/100
takeProfitPercentageShort = input(.1, title='Take Profit Percentage Short', type=float)/100
stopLossPercentageShort = input(0.15, title='Stop Loss Percentage Short', type=float)/100


candlesBack = input(title="Number of candles back",  defval=50)
useHighAndLows =  input(true, title="Use high and lows (uncheck to use close)", defval=true)
lastBarsBackMinimum =  input(title="Number of candles back to ignore for last high/low",  defval=30)
showHighsAndLows = input(true, title="Show high/low lines", defval=true)

getIndexOfLowestInSeries(series, period) => 
    index = 0
    current = series
    for i = 1 to period
        if series[i] <= current
            index := i
            current := series[i]
    index

getIndexOfHighestInSeries(series, period) => 
    index = 0
    current = series
    for i = 1 to period
        if series[i] >= current
            index := i
            current := series[i]
    index

indexOfHighestInRange = getIndexOfHighestInSeries(useHighAndLows ? high : close, candlesBack)
indexOfLowestInRange = getIndexOfLowestInSeries(useHighAndLows ? low : close, candlesBack)

max = useHighAndLows ? high[indexOfHighestInRange] : close[indexOfHighestInRange]
min = useHighAndLows ? low[indexOfLowestInRange] : close[indexOfLowestInRange]

barsSinceLastHigh = indexOfHighestInRange
barsSinceLastLow = indexOfLowestInRange

isNewHigh = (useHighAndLows ? high > max[1] : close > max[1]) and (barsSinceLastHigh[1] + 1 > lastBarsBackMinimum)
isNewLow = (useHighAndLows ? low < min[1] : close < min[1]) and (barsSinceLastLow[1] + 1 > lastBarsBackMinimum)

alertcondition(condition=isNewHigh, title="New High", message="Last High Broken")
alertcondition(condition=isNewLow, title="New Low", message="Last Low Broken")

if high > max 
    max := high
    barsSinceLastHigh := 0

if low < min
    min := low
    barsSinceLastLow := 0 

plot( showHighsAndLows ? max : na, color=red, style=line, title="High", linewidth=3)
plot( showHighsAndLows ? min : na, color=green, style=line, title="Low", linewidth=3)

// Strategy Entry/Exit Logic
goLong =isNewHigh
longStopLevel = strategy.position_avg_price * (1 - stopLossPercentageLong)
longTakeProfitLevel = strategy.position_avg_price * (1 + takeProfitPercentageLong)

goShort = isNewLow
shortStopLevel = strategy.position_avg_price * (1 + stopLossPercentageShort)
shortTakeProfitLevel = strategy.position_avg_price * (1 - takeProfitPercentageShort)

strategy.entry("Long", strategy.long, when=goLong)
strategy.exit("Long Exit", "Long", stop=longStopLevel, limit=longTakeProfitLevel)

strategy.entry("Short", strategy.short, when=goShort)
strategy.exit("Short Exit", "Short", stop=shortStopLevel, limit=shortTakeProfitLevel)
        
plot(goShort ? shortStopLevel : na, color=yellow, style=linebr, linewidth=2)
plot(goShort ? shortTakeProfitLevel : na, color=blue, style=linebr, linewidth=2)
plot(goLong ? longStopLevel : na, color=yellow, style=linebr, linewidth=2)
plot(goLong ? longTakeProfitLevel : na, color=blue, style=linebr, linewidth=2)


더 많은