볼링거 밴드 이동 평균에 기초한 단기 반전 양적 전략

저자:차오장, 날짜: 2023-12-19 16:17:47
태그:

img

전반적인 설명

이 전략은 볼링거 밴드 지표에 기반한 단기 반전 거래 전략입니다. 가격의 비정상적 분산이 있을 때 반전 거래 기회를 찾기 위해 이동 평균, 표준편차 및 볼링거 밴드를 결합합니다.

전략 원칙

  1. 이동 평균과 표준편차를 계산합니다. 이동 평균을 계산하기 위해 sma (sma) 함수와 표준편차를 계산하기 위해 stdev (stdev) 함수를 사용하십시오.

  2. 이동 평균과 표준편차에 따라 볼링거 대역의 상부 및 하부 레일을 계산합니다. 상부 레일은 가격+표준편차입니다.1과 하부 레일은 가격 표준편차입니다.1.

  3. 가격이 상부 또는 하부 레일을 뚫을 때, 그것은 가격이 비정상적이라는 것을 나타냅니다. 이 시점에서, 우리는 역 거래를 결정합니다.

  4. 구체적으로, 가격이 하부 레일보다 낮다면, 우리는 길게 갈 것이고, 가격이 상부 레일보다 높다면, 우리는 짧게 갈 것입니다.

이점 분석

  1. 비정상적인 가격을 판단하기 위해 볼링거 대역 채널을 사용하십시오. 이는 역 거래의 기초를 제공합니다.

  2. 이동평균 인수와 결합하면 소란한 거래가 효과적으로 필터링 될 수 있습니다.

  3. 표준 오차 인수를 도입하면 비정상 가격 판단을 위해 볼링거 대역 채널이 더 역동적입니다.

  4. 이 전략은 상대적으로 적은 마이너스와 일정 안정성을 가지고 있습니다.

위험 분석

  1. 볼링거 밴드 지표는 가격의 비정상적인 상황을 완전히 결정할 수 없습니다. 잘못된 브레이크가 발생할 수 있습니다.

  2. 거래 빈도는 너무 높을 수 있습니다. 거래 빈도를 제어하기 위해 매개 변수를 적절히 조정하는 것이 좋습니다.

  3. 상부 및 하부 볼린저 밴드의 파업 신호는 오랫동안 지속될 수 있습니다. 더 나은 반전 효과를 얻기 위해 적절한 매개 변수 조정이 필요합니다.

  4. 위험을 통제하기 위해 적절한 스톱 로스를 도입해야 합니다.

최적화 방향

  1. 더 합리적인 볼링거 밴드 채널을 얻기 위해 이동 평균 주기와 표준편차 매개 변수를 최적화하십시오.

  2. 일부 신호를 필터링하기 위해 EMA와 MACD와 같은 보조 요소를 증가시킵니다.

  3. 스톱 손실 및 위치 제어 메커니즘을 도입합니다.

  4. 위치 크기와 위치 제어 조치를 최적화합니다.

요약

이 전략은 볼링거 밴드 지표를 통해 비정상적인 가격을 판단하고 이동 평균과 표준 편차 매개 변수와 함께 반전 거래를합니다. 그것은 특정 안정성을 가지고 있습니다. 우리는 매개 변수 최적화, 보조 요소 도입, 스톱 손실 관리 및 위치 제어와 같은 방법을 통해 전략의 최대 유출을 추가로 줄이고 안정성을 향상해야합니다.


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

//@version=3
strategy("BCE Version of EMA, SMA Mean Reversion", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
 
// Inputs
st_yr_inp = input(defval=2017, title='Backtest Start Year')
st_mn_inp = input(defval=01, title='Backtest Start Month')
st_dy_inp = input(defval=01, title='Backtest Start Day')
en_yr_inp = input(defval=2025, title='Backtest End Year')
en_mn_inp = input(defval=01, title='Backtest End Month')
en_dy_inp = input(defval=01, title='Backtest End Day')
sma_lookback = input(defval=100, title="Lookback Period For SMA")
ema_lookback = input(defval=10, title="Lookback Period For EMA")
long_diff_perc = input(defval=6, title="Percentage Deviation From SMA to go Long")/100
short_diff_perc = input(defval=20, title="Percentage Deviation From SMA to go Short")/100
ema_filter_bars = input(defval=4, title="The number of bars the EMA must rise/fall")
lng_allwd = input(defval=true, title="Allow Longs?")
srt_allwd = input(defval=true, title="Allow Shorts?")
use_stop = input(defval=true, title="Use Stoploss?")
stop_perc = input(defval=30, title="Stop Loss Percentage")/100
 
// Dates
start = timestamp(st_yr_inp, st_mn_inp, st_dy_inp,00,00)
end = timestamp(en_yr_inp, en_mn_inp, en_dy_inp,00,00)
can_trade = time >= start and time <= end
// Indicators Setup
sma = sma(close, sma_lookback)
ema = ema(close, ema_lookback)
 
// Strategy Calcuations
close_stdev = stdev(close, sma_lookback)
sd1_upper = close + (close_stdev * 1)
sd1_lower = close - (close_stdev * 1)
close_diff = (close - sma) / sma
 
// Entries and Exits
longCondition = close > sma and open > sma
if (time >= start and time <= end)
    if (longCondition)
        strategy.entry("Long", strategy.long)
    if use_stop
        stop_price = close * (1 - stop_perc)
        strategy.order("Long Stoploss", false, stop=stop_price)
 
shortCondition = close < sma and open < sma
if (shortCondition)
//    strategy.entry("Short", strategy.short)
//    if use_stop
//        stop_price = close * (1 + stop_perc)
//        strategy.order("Short Stoploss", true, stop=stop_price)
//if (time >= start)    
    strategy.close("Long", when=close < sma and open < sma)
//strategy.cancel("Long Stoploss", when=sma < sma[1])
//    strategy.close("Short", when=close > sma and open > sma)
//strategy.cancel("Short Stoploss", when=close_diff<=0)
 
// Plotting
sma_col = sma > sma[1] ? green : red
ema_fill = close_diff <= -long_diff_perc ? lime : close_diff >= short_diff_perc ? maroon : aqua
p_sma = plot(sma, color=sma_col, linewidth=3)
p_ema = plot(ema, color=black, linewidth=2)
p_sd1 = plot(sd1_upper, color=black, linewidth=1, transp=85)
p_sd2 = plot(sd1_lower, color=black, linewidth=1, transp=85)
fill(p_sd1, p_sd2, title='STDEV Fill', color=silver, transp=80)
fill(p_sma, p_ema, title='EMA > Mean Percentage', color=ema_fill, transp=80)

더 많은