Adaptive Moving Average Channel Breakout Strategi

Penulis:ChaoZhang, Tanggal: 2023-11-02 15:05:56
Tag:

img

Gambaran umum

Adaptive Moving Average Channel Breakout Strategy adalah strategi breakout yang mengikuti tren berdasarkan Adaptive Moving Average (AMA) dan rentang saluran adaptif untuk menghasilkan sinyal perdagangan.

Prinsip Strategi

Indikator inti dari strategi ini adalah Adaptive Moving Average (AMA), yang digunakan untuk menangkap tren harga.

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

Di mana P (t) adalah harga saat ini, dan α (t) adalah konstanta perataan antara 0 dan 1. α (t) diatur secara dinamis sesuai dengan aturan tertentu untuk mengontrol sensitivitas AMA terhadap perubahan harga. Secara khusus, α (t) proporsional dengan penyimpangan SNRT antara AMA dan harga, yang dihitung sebagai:

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

Dengan demikian, ketika fluktuasi harga meningkat, α ((t) akan meningkat untuk membuat AMA lebih responsif; ketika fluktuasi berkurang, α ((t) akan berkurang untuk membuat AMA lebih halus.

Berdasarkan AMA, strategi ini membangun rentang saluran adaptif untuk mendeteksi sinyal price breakout.

Bagian atas: H (t) = (1 + β*H (t-1)) * AMA (t)

Bagian bawah: L ((t) = (1 - β*L ((t-1)) * AMA ((t)

Di mana β adalah parameter yang dapat disesuaikan yang mengontrol lebar saluran.

  • Masuk long ketika harga menembus level atas.

  • Masuk short ketika harga pecah di bawah level yang lebih rendah.

  • Jika tidak, tetap datar.

Analisis Keuntungan

Keuntungan dari strategi ini meliputi:

  1. AMA lebih fleksibel dalam menangkap tren harga dibandingkan dengan rata-rata bergerak sederhana, terutama di pasar yang tidak stabil.

  2. Saluran adaptif dapat secara dinamis menyesuaikan lebarnya, memperluas ketika tren tidak jelas dan mempersempit ketika tren muncul.

  3. Sinyal price breakout dapat tepat waktu menangkap tren dimulai dengan tingkat kemenangan yang lebih tinggi.

  4. Logikanya sederhana dan jelas, mudah dimengerti dan otomatis untuk perdagangan kuantitatif.

Analisis Risiko

Risiko dari strategi ini meliputi:

  1. Parameter AMA yang tidak tepat dapat melewatkan tren harga atau menghasilkan sinyal palsu.

  2. Parameter saluran adaptif seperti β perlu disetel dengan hati-hati, jika tidak terlalu banyak whipsaw atau tren yang terlewatkan dapat terjadi.

  3. Price breakouts rentan terhadap false breaks, membutuhkan lebih banyak filter.

  4. Strategi ini tidak memasukkan manajemen risiko atau mekanisme stop loss.

Arahan Optimasi

Strategi dapat dioptimalkan dengan:

  1. Memperbaiki perhitungan α untuk membuat AMA lebih responsif.

  2. Menambahkan konfirmasi lebih lanjut setelah pelepasan awal untuk menghindari sinyal palsu.

  3. Menerapkan filter seperti volume atau volatilitas untuk memvalidasi validitas breakout.

  4. Menggabungkan stop loss untuk mengunci keuntungan dan mengendalikan risiko.

  5. Mengoptimalkan ukuran posisi untuk kelas aset yang berbeda.

Kesimpulan

Secara singkat, Adaptive Moving Average Channel Breakout Strategy adalah strategi breakout yang sederhana dan praktis yang mengikuti tren. Strategi ini menggunakan AMA yang fleksibel untuk melacak tren harga dan saluran adaptif untuk mendeteksi sinyal breakout. Strategi ini memiliki beberapa keuntungan tetapi juga potensi risiko. Dengan optimasi seperti penyesuaian parameter, menambahkan filter, dan meningkatkan stop, strategi ini dapat menjadi lebih kuat. Secara keseluruhan, strategi ini menyediakan model dasar yang solid untuk perdagangan kuantitatif.


/*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)

Lebih banyak