평활화된 변동성 목표 밴드 전략


생성 날짜: 2024-01-29 16:22:14 마지막으로 수정됨: 2024-01-29 16:22:14
복사: 0 클릭수: 591
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

평활화된 변동성 목표 밴드 전략

개요

이 전략은 가격의 평평한 변동률을 기반으로 가격 목표대를 생성하고, 가격이 목표대를 뚫었을 때 거래 신호를 생성한다.

전략 원칙

이 전략은 우선 일정 주기 동안의 가격의 평균 변동폭을 계산하고, 지수 이동 평균을 통해 변동폭을 부드럽게 처리하여 부드러운 변동률을 생성한다. 부드러운 변동률을 계수로 곱하면 목표 대역의 범위를 얻는다. 가격이 목표 대역을 돌파하면 구매 신호를 생성하고, 가격이 목표 대역을 돌파하면 판매 신호를 생성한다.

구체적으로, 전략은 smoothrng 함수를 통해 평평한 변동률 smrng을 계산하고, smrng 값에 따라 목표 대역의 상하 궤도 hband과 lband을 계산한다. 이 기초에 따라 긴 위치 조건 (longCondition) 과 짧은 위치 조건 (shortCondition) 을 설정한다. 긴 위치 조건이 충족되면 구매 신호가 발생하며, 짧은 위치 조건이 충족되면 판매 신호가 발생한다.

우위 분석

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

  1. 가격 변동률을 사용하여 거래 신호를 구성하여 시장 변화를 효과적으로 추적 할 수 있습니다.

  2. 지수 이동 평균 평평한 변동률을 통해 잡음을 필터링하여 더 신뢰할 수있는 거래 신호를 생성합니다.

  3. 타겟 밴드 범위는 변동률 계수를 통해 조정할 수 있으며, 전략이 더 유연하다.

  4. 가격 돌파 판단과 함께, 트렌드가 변할 때 거래 기회를 잡을 수 있다.

위험 분석

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

  1. 시장이 비정상적으로 변동할 때, 평형 변동률은 실제 변동 상황을 정확하게 반영하지 않을 수 있으며, 이로 인해 잘못된 신호가 발생합니다. 파라미터를 조정하여 모델을 최적화 할 수 있습니다.

  2. 타겟 밴드 범위는 부적절하게 설정되면 거래 빈도가 너무 높거나 신호가 부족할 수 있습니다. 최적의 범위를 찾기 위해 다양한 매개 변수를 테스트 할 수 있습니다.

  3. 돌파 신호 판단에는 시간 지연이 있으며, 이는 초기에 또는 너무 늦게 입학을 초래할 수 있다. 다른 지표와 함께 확인할 수 있다.

최적화 방향

이 전략은 다음과 같은 방향으로 최적화될 수 있습니다.

  1. 다른 가격 데이터 주기들을 테스트하여 변동률을 계산하는 가장 적합한 주기 파라미터를 찾습니다.

  2. 다른 이동 평균 알고리즘을 시도해 보세요.

  3. 거래량이나 다른 지표들을 도입하여 브레이크 신호를 확인한다.

  4. 단위 손실을 제어하기 위해 스톱 또는 트레일링 스톱을 설정합니다.

  5. 최적화된 변동률 계수 mult의 값은 최적의 목표 대역 범위를 결정한다.

요약하다

이 전략의 전체적인 아이디어는 명확하고, 가격 변동률을 통해 목표대를 구성하고, 가격 돌파구를 활용하여 거래 신호를 생성하여 시장 변화의 추세를 효과적으로 추적할 수 있다. 그러나 또한 변수 최적화, 확인 지표 등의 수단을 통해 전략을 더 안정하고 신뢰할 수 있도록 하는 개선의 여지가 있다.

전략 소스 코드
/*backtest
start: 2023-01-22 00:00:00
end: 2024-01-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("1SmSm1 Strategy", shorttitle="1SmSm1", overlay=true)

// Source
src = input(defval=close, title="Source")

// Sampling Period
per = input(defval=100, minval=1, title="Sampling Period")

// Range Multiplier
mult = input(defval=3.0, minval=0.1, title="Range Multiplier")

// Smooth Average Range
smoothrng(x, t, m) =>
    wper = (t * 2) - 1
    avrng = ema(abs(x - x[1]), t)
    smoothrng = ema(avrng, wper) * m
    smoothrng

smrng = smoothrng(src, per, mult)

// Range Filter
rngfilt(x, r) =>
    rngfilt = x
    rngfilt := x > nz(rngfilt[1]) ? ((x - r) < nz(rngfilt[1]) ? nz(rngfilt[1]) : (x - r)) : ((x + r) > nz(rngfilt[1]) ? nz(rngfilt[1]) : (x + r))
    rngfilt

filt = rngfilt(src, smrng)

// Filter Direction
upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])

downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])

// Target Bands
hband = filt + smrng
lband = filt - smrng

// Breakouts
longCondition = (src > filt) and (src > src[1]) and (upward > 0)
shortCondition = (src < filt) and (src < src[1]) and (downward > 0)

strategy.entry("Buy", strategy.long, when = longCondition)
strategy.entry("Sell", strategy.short, when = shortCondition)

// Plotting
plot(filt, color=upward > 0 ? color.lime : downward > 0 ? color.red : color.orange, linewidth=3, title="Range Filter")
hbandplot = plot(hband, color=color.aqua, transp=100, title="High Target")
lbandplot = plot(lband, color=color.fuchsia, transp=100, title="Low Target")

// Fills
fill(hbandplot, lbandplot, color=color.aqua, title="Target Range")

// Bar Color
barcolor(longCondition ? color.green : shortCondition ? color.red : na)

// Alerts
alertcondition(longCondition, title="Buy Alert", message="BUY")
alertcondition(shortCondition, title="Sell Alert", message="SELL")