리소스 로딩... 로딩...

적응형 이동 평균 채널 브레이크업 전략

저자:차오장, 날짜: 2023-11-02 15:05:56
태그:

img

전반적인 설명

적응 이동 평균 채널 브레이크아웃 전략은 적응 이동 평균 (AMA) 과 거래 신호를 생성하기 위한 적응 채널 범위를 기반으로 트렌드를 따르는 브레이크아웃 전략이다. 현재 가격 트렌드 방향을 결정하고 적절한 입출에 대한 가격 브레이크아웃 신호를 감지하기 위해 적응 채널 수준을 결정하기 위해 AMA를 사용합니다.

전략 원칙

이 전략의 핵심 지표는 가격 트렌드를 파악하는 데 사용되는 적응 이동 평균 (AMA) 이다. AMA는 다음과 같이 계산됩니다.

AMA (t) = α (t-1) * P (t) + [1 - α (t-1) ] * AMA (t-1)

여기서 P (t) 는 현재 가격이고 α (t) 는 0과 1 사이의 평형 상수이다. α (t) 는 가격 변화에 대한 AMA의 감수성을 제어하기 위해 특정 규칙에 따라 동적으로 조정된다. 구체적으로, α (t) 는 AMA와 가격 사이의 편차 SNRT에 비례하며, 이는 다음과 같이 계산된다.

SNRT = (P(t) - AMA(t-1)) / AMA(t-1)

따라서, 가격 변동이 증가함에 따라, α (t) 는 AMA를 더 민감하게 만들기 위해 증가할 것이고, 변동이 감소할 때, α (t) 는 AMA를 더 부드럽게 만들기 위해 감소할 것입니다.

AMA를 기반으로 전략은 가격 파격 신호를 감지하기 위해 적응 가능한 채널 범위를 구축합니다. 상위 및 하위 채널 레벨은 다음과 같습니다.

위쪽: H(t) = (1 + β*H(t-1)) * AMA(t)

아래쪽: L (t) = (1 - β*L (t-1)) * AMA (t)

여기서 β는 채널 폭을 제어하는 조정 가능한 매개 변수입니다. 마지막으로 전략은 채널 레벨의 가격 파열에 기반한 거래를 생성합니다.

  • 가격이 상위 레벨을 넘을 때 장면을 입력합니다.

  • 가격이 하위 수준 아래로 떨어질 때 단위로 들어가세요.

  • 그렇지 않으면, 평평하게 있으세요.

이점 분석

이 전략의 장점은 다음과 같습니다.

  1. AMA는 단순한 이동 평균에 비해 가격 동향을 포착하는 데 더 유연합니다. 특히 변동적인 시장에서요.

  2. 적응 채널은 그 폭을 동적으로 조정할 수 있습니다. 트렌드가 불분명할 때 확장하고 트렌드가 나타나면 좁아집니다.

  3. 가격 파업 신호는 높은 승률을 가진 트렌드를 적시에 파악할 수 있습니다.

  4. 논리는 간단하고 명확하고, 양적 거래에 이해하기 쉽고 자동화됩니다.

위험 분석

이 전략의 위험은 다음과 같습니다.

  1. 부적절한 AMA 매개 변수는 가격 추세를 놓칠 수도 있고 잘못된 신호를 생성할 수도 있습니다.

  2. β와 같은 적응 채널 매개 변수는 신중하게 조정해야합니다. 그렇지 않으면 너무 많은 윙사 또는 놓친 트렌드가 발생할 수 있습니다.

  3. 가격 파업은 가짜 파업에 취약해서 더 많은 필터를 필요로 합니다.

  4. 이 전략은 위험 관리나 스톱 로스 메커니즘을 포함하지 않습니다.

최적화 방향

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

  1. AMA를 더 반응적으로 만들기 위해 α 계산을 개선합니다.

  2. 거짓 신호를 피하기 위해 초기 탈출 후 추가 확인을 추가합니다.

  3. 부피나 변동성 같은 필터를 적용해서 유출 유효성을 검증합니다.

  4. 이윤을 확보하고 위험을 통제하기 위해 후속 스톱 손실을 포함합니다.

  5. 다른 자산 클래스에 대한 포지션 크기의 최적화

결론

요약하자면, 적응형 이동 평균 채널 브레이크아웃 전략 (Adaptive Moving Average Channel Breakout Strategy) 은 트렌드를 따르는 간단하고 실용적인 브레이크아웃 전략이다. 유연한 AMA를 사용하여 가격 트렌드를 추적하고 적응형 채널을 사용하여 브레이크아웃 신호를 탐지한다. 이 전략은 몇 가지 장점이 있지만 잠재적 위험도 있다. 매개 변수 조정, 필터 추가 및 스톱 개선과 같은 최적화로 더 견고해질 수 있다. 전반적으로 양적 거래에 대한 탄탄한 기본 모델을 제공한다.


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

//@version=4

// CryptoStatistical - 2019
// AMA Strategy Channel Breakout Strategy from E. Durenard - Professional Automated Trading 
// https://www.amazon.com/Professional-Automated-Trading-Theory-Practice/dp/1118129857

strategy(title="[CS] AMA Strategy - Channel Break Out", shorttitle="AMA_ChannelBreakout_Strategy", initial_capital = 1000, overlay=true, pyramiding = 0, calc_on_every_tick=false, calc_on_order_fills=false, commission_type= strategy.commission.percent, commission_value = 0.08, currency=currency.USD)
testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(6, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

testPeriodBackground = input(title="Color Background?", type=input.bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=95)

testPeriod() =>  true

price = input(title='Price Source:', type=input.source, defval=close)

ama = price
hb = price
lb = price

// Static model parameters
minfactor = 0.
maxfactor = 1.
deviation_max = 1.
deviation_min = 1.
beta_hb = 1.
beta_lb = 1.
snr = 1.

normalized_atan= 0.
alpha = 0.5
// Suggested snr-factor from .5 upto 3.1 by .3 to find best parameter
snrfactor = input(title='SNR Factor:', type=input.float, minval=0.6, maxval=3.3, step=0.3, defval=2.1)

// Sensitivity Lookback search for the best perdiod from 5 to 20
lookback = input(title='Sensitivity Lookback:', type=input.integer, defval=5)

// Suggested Beta from .5 below 4.5 by .3, usually in the range 1.2, 1.5
beta = input(title='Beta:', type=input.float, minval=0.6, maxval=4.5, step=0.3, defval=2.1)

offsetlabel = input(title='Offset Label:', type=input.float, minval=0.001, maxval=0.03, step=0.001, defval=0.001)

// pi/2
pi2 = 1.5707963267948966

// Zero-lag resampled moving average (Durschner nwma)
f_nwma(_src, _period) =>
    fast = _period/2
    lambda = _period/fast
    alpha = lambda * (_period - 1)/(_period - lambda)
    average1 = wma(_src,_period)
    average2 = wma(average1,fast)
    nwma = (1+alpha)*average1 - alpha*average2

ama := alpha[1]*price + (1-alpha[1])*nz(ama[1])

deviation_max := alpha[1]*max((price[0] - price[1])/price[1],0) + (1-alpha[1])*nz(deviation_max[1])
deviation_min := -alpha[1]*min((price[0] - price[1])/price[1],0) + (1-alpha[1])*nz(deviation_min[1])

beta_hb := beta*deviation_max
beta_lb := beta*deviation_min
hb := (1 + beta_hb[1])*ama
lb := (1 - beta_lb[1])*ama

snr := if price > hb
    ((price - ama[1])/ama[1])/beta_lb
else
    if price < lb
        -((price - ama[1])/ama[1])/beta_hb
    else
        0

normalized_atan := (atan(snrfactor*snr) + pi2)/(2*pi2)
alpha := f_nwma(minfactor + (maxfactor - minfactor)*normalized_atan, lookback)

plot(ama, color=color.black)
plot(hb, color=color.green)
plot(lb, color=color.red)

// Buy Condition Var
bc = false
// Sell Condition Var
sc = false
d = color.black

// Buy Condition
if(price > hb)
    bc := true
    d := color.green

// Sell Condition
if(price < lb)
    sc := true
    d := color.red

if(testPeriod())
    strategy.entry("Long", strategy.long, when = bc)
    strategy.entry("Short", strategy.short, when = sc)

alertcondition(bc, title='BuyCondition', message='Buy')
alertcondition(sc, title='SellCondition', message='Sell')

plotshape(title='Buy', series=bc ? price * (1 - offsetlabel) : na, text='A1B', style=shape.labelup, location=location.absolute, color=d, textcolor=color.white, offset=0)
plotshape(title='Sell', series=sc ? price  * (1 + offsetlabel) : na, text='A1S', style=shape.labeldown, location=location.absolute, color=d, textcolor=color.white, offset=0)

더 많은