전략에 따른 적응 추세

저자:차오장, 날짜: 2024-01-15 14:20:32
태그:

img

전반적인 설명

적응 트렌드 다음 전략 (Adaptive trend following strategy) 은 볼링거 밴드와 이동 평균 지표를 결합하여 트렌드 강도 요인을 동적으로 조정하고 트렌드 다음 및 스톱 손실을 달성하는 양적 거래 전략이다. 이 전략은 가격 변동성을 계산하기 위해 볼링거 밴드를 사용하여 합리적인 트렌드 강도를 동적으로 계산합니다. 다음으로 ATR 지표를 사용하여 적응 트렌드 채널을 그립하여 상승 및 하락 트렌드를 결정하고 추적합니다. 동시에 전략에는 위험을 효과적으로 제어하기 위해 내장된 스톱 손실 메커니즘이 있습니다.

전략 원칙

이 전략의 핵심 지표는 볼링거 밴드이다. 볼링거 밴드는 중간 밴드, 상위 밴드, 하위 밴드로 구성된다. 중간 밴드는 n일 간단한 이동 평균, 상위 밴드는 중간 밴드 + k x n일 표준 편차, 그리고 하위 밴드는 중간 밴드 - k x n일 표준 편차이다. 여기서 우리는 20일 중간 밴드와 2 x 표준 편차를 선택하여 볼링거 밴드를 구성한다.

그 다음 우리는 강도 인자 ( strength factor) 라고 불리는 중간 밴드 비율에 대한 대역폭 (올바위 대역 - 하위 대역) 을 계산합니다. 이 비율은 현재 시장 변동성과 트렌드 강도를 반영합니다. 우리는 강도 인자의 최대 및 최소 값을 설정하여 너무 크거나 너무 작지 않도록합니다.

합리적인 강도 요인, ATR 지표와 결합, 상위 및 하위 대역은 각각 ATR * 강도 요인 거리로 상향과 아래로 이동 적응 트렌드 채널을 형성합니다. 닫기 가격이 아래에서 상위 레일을 통해 상향으로 갈 때, 길게; 상위에서 하위 레일을 통해 상향으로 갈 때, 짧게.

또한, 전략은 또한 스톱 로스 메커니즘을 설정합니다. 긴 포지션이 형성 된 후, 가격이 포지션이 열렸을 때 가장 낮은 지점 아래로 떨어지면, 스톱 로스 출구; 짧은 포지션에도 마찬가지입니다.

전략적 장점

이 전략은 다음과 같은 장점을 가지고 있습니다.

  1. 높은 적응력. 강도 요인이 계산되는 방식은 전략이 시장 변동성에 따라 채널 너비를 동적으로 조정하여 상승 시장 트렌드에서 채널을 넓히고 변동 시장에서 채널을 좁히고 다양한 유형의 시장에 적응 할 수 있습니다.

  2. 중간 운영 빈도. 간단한 이동 평균 전략과 비교하면 볼링거 밴드 전략은 채널을 덜 자주 조정하여 불필요한 빈번한 포지션 개척 및 폐쇄를 피합니다.

  3. 정확한 진입 시점. 상부와 하부 레일의 파업은 시장 소음을 효과적으로 필터하고 트렌드 개척을 포착 할 수있는 높은 확률을 보장 할 수 있습니다.

  4. 스톱 로스 메커니즘. 내장 스톱 로스 메소드는 단일 손실을 효과적으로 제어 할 수 있습니다. 이 전략의 주요 장점입니다.

전략 위험

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

  1. 높은 매개 변수 민감성. 보린저 밴드의 기간 n 및 곱셈자 k는 결과에 큰 영향을 미치므로 최적의 매개 변수 조합을 찾기 위해 반복 테스트가 필요합니다.

  2. 볼링거 밴드 (Bollinger Bands) 가 분차할 때 트렌드를 추적할 수 없다는 것. 가격이 격렬하게 변동할 때 볼링거 밴드 (Bollinger Bands) 레일은 빠르게 확장되어 트렌드를 추적할 수 없게 된다. 전략은 다시 실행하기 전에 레일이 융합될 때까지 기다리기 위해 일시 중지되어야 한다.

  3. 때때로 잘못된 신호. 볼링거 밴드 전략은 완벽하지 않습니다, 또한 그에 따른 손실을 부담해야 하는 잘못된 신호의 특정 양이 생성 될 것입니다.

  4. 상대적으로 간단한 스톱 로스 방법. 이 전략의 스톱 로스는 변동성 등을 기반으로 한 더 복잡한 스톱 로스 방법을 포함하지 않고 포지션을 열었을 때 가장 높고 가장 낮은 가격을 고려합니다. 이는 너무 공격적이거나 보수적이거나 최적화를 필요로 할 수 있습니다.

전략 최적화 방향

이 전략은 다음과 같은 측면에서 최적화되어야 합니다.

  1. 다른 통화와 주기의 매개 변수의 영향을 테스트합니다. 전략의 매개 변수는 다른 통화와 주기에 최적화되어 전략의 적응력을 향상시킬 수 있습니다.

  2. 스톱 로스 메커니즘을 최적화한다. 스톱 로스를 이동시키고, 스톱 로스를 오시일레이팅하고, 스톱 로스를 후속으로 유도하여 스톱 로스 방법을 더 지능화 할 수 있다.

  3. 입시 신호를 필터링하기 위해 다른 지표를 포함하십시오. MACD, KDJ 등과 같은 지표를 추가하여 옆으로 변동하는 시장에서 볼링거 밴드에서 잘못된 신호를 피할 수 있습니다.

  4. 포지션 관리 메커니즘을 추가하십시오. 전략의 수익성을 향상시키기 위해 스톱 노프치 추적, 피라미드 거래, 고정 비율 포지션 등을 관리 방법을 구현하십시오.

  5. 백테스트 최적화를 수행합니다. 최적의 매개 변수를 찾기 위해 백테스트 시간 프레임을 확장하고 매개 변수를 조정하고 백테스트 보고서를 분석하여 전략 결과를 포괄적으로 조사하십시오.

결론

전반적으로, 적응 트렌드 다음 전략은 상당히 성숙한 양적 전략이다. 그것은 동적으로 추세를 캡처하기 위해 볼링거 밴드를 사용하며, ATR 지표와 결합하여 긴 및 짧은 트렌드를 판단하기 위한 적응 채널을 구축한다. 한편, 그것은 위험을 제어하기 위해 내장된 스톱 로스 메커니즘을 가지고 있다. 이 전략의 장점은 적절한 운영 빈도, 정확한 엔트리 타이밍, 그리고 좋은 위험 통제이다. 그러나 매개 변수 선택, 스톱 로스 방법, 신호 필터링과 같은 분야에서 최적화가 필요한 몇 가지 문제가 있다.


/*backtest
start: 2023-12-15 00:00:00
end: 2024-01-14 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("[Th] Adaptive Trend v1", shorttitle="[TH] Adaptive Trend", overlay=true)

Pd=input(2, minval=1,maxval = 100, title="Period")
Bw=input(50, minval=1,maxval = 100, title="Bandwidth")
minFactor = input(0.5, minval=0.1, maxval=1.0, step=0.1, title="Minimum Factor")
maxFactor = input(3.00, minval=0.2, maxval=5.0, step=0.1, title="Maximum Factor")
plot_trend=input(true, title="Plot trend")

plot_losscut = input(true, title="Plot losscut")

/////////////// Calculate the BB's ///////////////
basisBB = ema(close, 20)
devBB     = 2 * stdev(close, 20)
upperBB = basisBB + devBB
lowerBB = basisBB - devBB
//plot(upperBB)
//plot(lowerBB)

///////////// Trend ////////////////////////////

rawFactor = ((upperBB-lowerBB)/basisBB)*Bw
Factor = rawFactor > minFactor ? (rawFactor > maxFactor ? maxFactor : rawFactor) : minFactor

Up=hl2-(Factor*atr(Pd))
Dn=hl2+(Factor*atr(Pd))
TrendUp=close[1]>TrendUp[1]? max(Up,TrendUp[1]) : Up
TrendDown=close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn
TrendUpPlot=plot(plot_trend?TrendUp:na, style=line, color=green, linewidth=1)
TrendDownPlot=plot(plot_trend?TrendDown:na, style=line, color=red, linewidth=1)
Trend = close > TrendDown[1] ? 1: close< TrendUp[1]? -1: nz(Trend[1],1)
fill(TrendUpPlot,TrendDownPlot, color=Trend == 1 ? green : red, transp=80)
sig_trend_long = Trend[1] == -1 and Trend == 1
sig_trend_short = Trend[1] == 1 and Trend == -1

///////////// Loss Cut ////////////////////////////
price_cut = sig_trend_long[1] or sig_trend_short[1] or sig_reentry_long[1] or sig_reentry_short[1] ? open : price_cut[1] 
current_trend = sig_trend_long[1] ? 1 : (sig_trend_short[1] ? -1 : current_trend[1])

sig_loss_cut = sig_trend_long or sig_trend_short ? false : ( current_trend == 1 ? (price_cut > low) : (current_trend == -1 ? (price_cut < high) : false) )
has_position = sig_loss_cut ? false : ((sig_trend_long[1] or sig_trend_short[1] or sig_reentry_long[1] or sig_reentry_short[1]) ? true : has_position[1])
sig_reentry_long = not has_position and current_trend == 1 and low > price_cut
sig_reentry_short = not has_position and current_trend == -1 and high < price_cut

bgcolor(plot_losscut and ( not has_position or sig_loss_cut ) ? silver : white, transp=70)
plotshape(plot_losscut and sig_loss_cut and current_trend == 1? 1 : na, color=green, style=shape.xcross, location=location.belowbar ,size=size.tiny)
plotshape(plot_losscut and sig_loss_cut and current_trend == -1? 1 : na, color=red, style=shape.xcross, location=location.abovebar ,size=size.tiny)

LossCutPlot = plot(plot_losscut ? price_cut : na, linewidth=4, color=black, transp=60)
fill(TrendDownPlot, LossCutPlot, color=silver, transp=90)

plotshape(sig_trend_long or sig_reentry_long ? Trend : na, title="Up Entry Arrow", color=green, style=shape.triangleup, location=location.belowbar, size=size.tiny)
plotshape(sig_trend_short or sig_reentry_short ? Trend : na, title="Down Entry Arrow",color=red, style=shape.triangledown, size=size.tiny)
    
    
///////////// Strategy //////////////////////////// 
if true

    strategy.entry('long', long=strategy.long, comment='Long', when=sig_trend_long or sig_reentry_long)
    strategy.entry('short', long=strategy.short, comment='Short', when=sig_trend_short or sig_reentry_short)
    
    if(current_trend == 1)
        strategy.close('long', when=sig_loss_cut == true) 
        //strategy.exit('lc',from_entry='long', stop=price_cut)
    
    if( current_trend == -1 )
        strategy.close('short', when=sig_loss_cut == true) 
        //strategy.exit('sc',from_entry='short', stop=price_cut)


더 많은