Optimalisasi Portofolio Strategi Rata-rata Pergerakan yang Dihaluskan


Tanggal Pembuatan: 2024-01-26 14:57:08 Akhirnya memodifikasi: 2024-01-26 14:57:08
menyalin: 1 Jumlah klik: 583
1
fokus pada
1617
Pengikut

Optimalisasi Portofolio Strategi Rata-rata Pergerakan yang Dihaluskan

Ringkasan

Strategi ini didasarkan pada kombinasi rata-rata bergerak yang halus dengan indikator stokastik, dengan tujuan untuk menangkap lebih banyak peluang dalam tren. Ini terutama menggunakan rata-rata bergerak indeks dari dua periode yang berbeda untuk membentuk sinyal strategi, yang dikombinasikan dengan persilangan garis K dan garis D dalam indikator stokastik sebagai pilihan waktu masuk untuk mengharapkan tingkat keuntungan yang lebih tinggi dalam tren.

Prinsip Strategi

Strategi ini menggunakan dua rata-rata bergerak halus 12 periode dan 26 periode. Ketika garis cepat melewati garis lambat dari bawah, lakukan lebih banyak; Ketika garis cepat melewati garis lambat dari atas ke bawah, kosongkan. Untuk memfilter sinyal palsu, ia meminta garis cepat dan garis lambat berorientasi, garis cepat hanya dapat melakukan lebih banyak di atas garis lambat, garis cepat hanya dapat kosong di bawah garis lambat.

Garis K dalam indikator Stochastic bersilang dengan garis D sebagai pilihan saat masuk. Garis K bersilang dengan garis D dari arah bawah garis overbought, melakukan overbought; Garis K bersilang dengan garis D dari arah bawah garis oversold, melakukan overbought.

SMO menentukan arah tren, Stochastic memfilter Noise dan memilih waktu masuk. Kombinasi mereka memungkinkan lebih banyak peluang untuk mendapatkan keuntungan dalam tren.

Keunggulan Strategis

  • Strategi rata-rata bergerak yang halus sendiri memiliki karakteristik yang lebih baik dan lebih mudah untuk melacak tren
  • Filter Noise menggunakan indikator Stokastik untuk meningkatkan probabilitas keuntungan
  • Kombinasi garis cepat dan lambat, dan kembali ke garis cepat di dekat garis lambat untuk mendapatkan kesempatan bermain yang lebih baik
  • K-line dan D-line cross-combination dalam Stochastic Indicator digunakan untuk lebih memilih entry point yang lebih baik

Jadi, strategi ini dapat dilakukan secara acak dan selektif untuk mengambil kesempatan, sehingga menghasilkan tingkat keuntungan yang lebih tinggi.

Analisis risiko

  • Berisiko lebih besar untuk pergi dalam waktu singkat. Ketika jalur cepat kembali ke jalur lambat, sinyal dapat ditolak atau terjebak
  • Karena sifatnya yang dinamis, tidak dapat beradaptasi dengan cepat ketika pasar berbalik tajam, yang dapat menyebabkan kerugian besar

Untuk mengurangi risiko ini, kita dapat mengatur stop loss, atau menggunakan kombinasi parameter moving average yang lebih longgar.

Arah optimasi

Strategi ini dapat dioptimalkan lebih lanjut dalam beberapa hal:

  1. Uji kombinasi parameter moving average yang berbeda untuk menemukan yang lebih baik
  2. Uji Kombinasi Berbagai Parameter Stokastik
  3. Meningkatkan strategi stop loss
  4. Peningkatan stop loss dinamis berdasarkan volatilitas
  5. Optimasi kombinasi untuk parameter siklus yang berbeda untuk menguji varietas yang berbeda
  6. Parameter optimasi untuk menguji algoritma pembelajaran mesin

Dengan menguji kombinasi parameter yang berbeda, parameter yang lebih kuat dapat ditemukan; sekaligus menetapkan strategi stop loss dapat secara efektif mengurangi risiko dan meningkatkan stabilitas strategi.

Meringkaskan

Strategi ini mengintegrasikan keunggulan rata-rata bergerak yang halus dengan indikator Stochastic, dapat mengikuti tren secara berurutan, dan memilih waktu masuk yang lebih baik. Ini mudah dioperasikan, dapat dikontrol risiko, dan memiliki nilai praktis yang besar.

Kode Sumber Strategi
/*backtest
start: 2024-01-18 00:00:00
end: 2024-01-25 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// author SoftKill

strategy(title="Price EMA with stock", shorttitle="EMA STOCH", overlay=true)
src = input(title="Source", type=input.source, defval=close)

src_0 = src[0]
src_1 = src[1]
src_2 = src[2]
src_3 = src[3]
src_4 = src[4]

len50 = input(50, minval=1, title="Length")
src50 = input(close, title="Source")
out50 = ema(src50, len50)
len100 = input(100)
src100 = input(close, title="Source")
out100 = ema(src100, len100)

len1 = input(1, minval=1, title="Length")
src1 = input(close, title="Source")
out1 = sma(src1, len1)

length = input(5, minval=1)
OverBought = input(80)
OverSold = input(20)
smoothK = 3
smoothD = 3

k = sma(stoch(close, high, low, length), smoothK)
d = sma(k, smoothD)
cu = crossover(k,OverSold)
co = crossunder(k,OverBought)

sma_down = crossunder(out1, out50)
sma_up = crossover(out1,out50)

//if (not na(k) and not na(d))
  //  if (co and k < OverSold)
    //    strategy.entry("StochLE", strategy.long, comment="StochLE")
    //if (cu and k > OverBought)
     //   strategy.entry("StochSE", strategy.short, comment="StochSE")

crossCandle_4 = crossover(src[4],out50)
crossCandleUnder_4= cross(src[4],out50)
crossCandle_3 = crossover(src[3],out50)
crossCandleUnder_3= crossunder(src[3],out50)
crossCandle_2 = crossover(src[2],out50)
crossCandleUnder_2= crossunder(src[2],out50)
crossCandle_1 = crossover(src[1],out50)
crossCandleUnder_1= crossunder(src[1],out50)
crossCandle_0 = crossover(src[0],out50)
crossCandleUnder_0= crossunder(src[0],out50)

conditionOver = (crossCandle_4 or crossCandle_3 or crossCandle_2 or crossCandle_1 or crossCandle_0)
conditionUnder =(crossCandleUnder_4 or crossCandleUnder_3 or crossCandleUnder_2 or crossCandleUnder_1 or crossCandleUnder_0)

touch4 = (cross(low[4],out50) or cross(high[4],out50))
touch3 = (cross(low[3],out50) or cross(high[3],out50))
touch2 = (cross(low[2],out50) or cross(high[2],out50))
touch1 = (cross(low[1],out50) or cross(high[1],out50))

touch = touch1 or touch2 or touch3 or touch4

//and sma_up
//and sma_down

// Getting inputs
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src_macd = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false)

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00

// Calculating
fast_ma = sma_source ? sma(src_macd, fast_length) : ema(src_macd, fast_length)
slow_ma = sma_source ? sma(src_macd, slow_length) : ema(src_macd, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal

//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
//plot(macd, title="MACD", color=col_macd, transp=0)
//plot(signal, title="Signal", color=col_signal, transp=0)


// plot((conditionOver or conditionUnder or touch)  and src[0] >= out50 and close >= out50 and  (cu) and out50 > out100 and hist>=0 , title="Buy", style=plot.style_columns, color=color.lime)
// plot((conditionOver or conditionUnder or touch)  and src[0] <= out50 and close <= out50 and  (co) and out50< out100 and hist<=0 , title="sell", style=plot.style_columns, color=color.red)


long_cond = ((conditionOver or conditionUnder or touch)  and src[0] >= out50 and close > out50 and  (cu) and out50 > out100 and hist>=0)
short_cond = ((conditionOver or conditionUnder or touch)  and src[0] <= out50 and close < out50 and  (co) and out50< out100 and hist<=0)

tp=input(0.1)
sl=input(0.1)

strategy.entry("long",strategy.long, when=long_cond)
strategy.entry("short",strategy.short, when=short_cond)

strategy.exit("X_long", "long", profit=close * tp / syminfo.mintick,  loss=close * sl / syminfo.mintick, when=touch  )
strategy.exit("x_short", "short",profit=close * tp / syminfo.mintick,loss=close * sl / syminfo.mintick,when = touch )

// //tp = input(0.0003, title="tp")
// tp = 0.0003
// //sl = input(1.0 , title="sl")
// sl = 1.0
// strategy.exit("closelong", "long" , profit = close * tp / syminfo.mintick, loss = close * sl / syminfo.mintick, alert_message = "closelong")
// strategy.exit("closeshort", "short" , profit = close * tp / syminfo.mintick, loss = close * sl / syminfo.mintick, alert_message = "closeshort")