Strategi Saluran Regresi Dinamis

Penulis:ChaoZhang, Tanggal: 2024-02-23 12:14:49
Tag:

img

Gambaran umum

Strategi Dynamic Regression Channel menggunakan analisis regresi linier dari tren harga dikombinasikan dengan stop loss dinamis untuk menerapkan tren berikut dalam perdagangan kuantitatif. Strategi ini menggunakan regresi linier untuk memetakan saluran harga dan menghasilkan sinyal beli dan jual ketika harga keluar dari saluran. Pada saat yang sama, strategi melacak harga secara real-time untuk memperbarui tingkat stop loss untuk mengunci keuntungan.

Logika Strategi

Strategi ini pertama-tama menghitung kurva regresi linier harga untuk menentukan apakah harga pecah di atas atau di bawah saluran regresi. Ketika harga naik di atas rel atas saluran, sinyal beli dihasilkan. Ketika harga turun di bawah rel bawah, sinyal jual dipicu.

Setelah masuk ke posisi, strategi terus melacak jika harga melanggar garis stop loss moving average. Untuk pesanan panjang, jika harga turun di bawah garis stop loss, pesanan jual stop loss akan dikeluarkan. Untuk pesanan pendek, jika harga naik di atas garis stop loss, pesanan pembelian stop loss akan dipicu. Ini mengunci keuntungan dan mengontrol risiko.

Hal ini penting untuk dicatat bahwa jika harga memecahkan saluran kembali membalikkan arah, strategi akan segera meratakan posisi awal dan beralih ke perdagangan ke arah yang berlawanan.

Analisis Keuntungan

Strategi ini menggabungkan konsep trend following dan mean reversal, mengendarai dengan tren harga secara keseluruhan sambil menangkap pembalikan jangka pendek.

Dibandingkan dengan strategi rata-rata bergerak sederhana, Strategi Saluran Regresi Dinamis lebih sensitif terhadap perubahan harga dan dapat mengurangi mastertrade.

Analisis Risiko

Risiko utama terletak pada penyesuaian kurva regresi yang tidak akurat. Jika rentang saluran diatur dengan tidak benar, terlalu luas atau terlalu sempit, itu akan meningkatkan perdagangan yang tidak valid atau kehilangan peluang perdagangan.

Selain itu, posisi stop loss yang tepat sangat penting. Stop loss yang terlalu dekat dengan harga pasar rentan terhadap likuidasi dini oleh volatilitas jangka pendek sementara stop loss yang terlalu jauh tidak dapat memenuhi tujuan pengendalian risiko. Penyesuaian halus diperlukan di berbagai produk.

Optimalisasi

Pertimbangkan parameter pengoptimalan otomatis untuk periode atau produk yang berbeda untuk membuat saluran regresi dan garis stop loss lebih sesuai dengan tren harga.

Sebagai alternatif, berbagai jenis regresi seperti regresi polinomial dan regresi tertimbang lokal dapat diuji untuk meningkatkan kesesuaian.

Kesimpulan

Strategi Saluran Regresi Dinamis dengan terampil memanfaatkan teknik trend berikut dan mean reversion, mengendarai tren harga keseluruhan sambil menangkap pembalikan jangka pendek. penyetelan yang tepat dari saluran regresi kunci dan parameter stop loss sangat penting untuk kinerja strategi. penyempurnaan lebih lanjut dapat dilakukan melalui optimasi parameter dan iterasi model.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Estratégia de Regressão Linear", shorttitle="Regressão Linear Estratégia", overlay=true, initial_capital = 100, default_qty_value = 10, default_qty_type = strategy.percent_of_equity)

// média móvel exponencial para definição de regressao linear
var SlopeEMASize = input.int(defval = 21, title = "Slope EMA" )
// ema_length = 21
slope_ema = ta.ema(close, SlopeEMASize)

// média móvel exponencial para definição de nivel de stop
var StopEMASize = input.int(defval = 13, title = "Stop EMA" )
stop_ema = ta.ema(close, StopEMASize)

// Variáveis para controle de posição
var float long_stop_level = na
var float long_entry_level = na
var bool long_signal = false
var bool long_order_open = false
var int long_order_id = 0


var float short_stop_level = na
var float short_entry_level = na
var bool short_signal = false
var bool short_order_open = false
var int short_order_id = 0

// Regressão linear para uso como sinal de entrada 
var SlopeLenght = input.int(defval = 21, title = "Slope Lenght" )
entry_signal = ta.linreg(slope_ema, SlopeLenght, 0)

//Variaveis com a indicação do pivot da regressao
long_entry_signal = ta.crossover(entry_signal, entry_signal[1])
short_entry_signal = ta.crossunder(entry_signal, entry_signal[1])

// Condição de entrada (reversão da regressão)
if long_entry_signal
    long_signal := true
    short_signal := false
    long_entry_level := high
    long_stop_level := low

if short_entry_signal
    short_signal := true
    long_signal := false
    short_entry_level := low
    short_stop_level := high


// Indica quando o preço cruzou o nível de stop 
price_cross_stop_ema_up = ta.crossover(close, stop_ema)
price_cross_stop_ema_down = ta.crossunder(close, stop_ema)

// Mover o stop quando o preço cruzar a nível stop e operação long ativa
if long_signal and long_order_open and price_cross_stop_ema_down
    if low > long_entry_level
        long_stop_level := high

// Mover o stop quando o preço cruzar a nível stop e operação short ativa
if short_signal and short_order_open and price_cross_stop_ema_up
    if high < short_stop_level
        short_stop_level := low

// Sair da posição se houver nova reversão da regressão
if long_order_open or short_order_open
    if long_entry_signal //and short_order_open
        strategy.close(str.tostring(short_order_id), comment ="Inversão Sinal("+str.tostring(short_order_id)+")")
        short_order_open:= false
    if short_entry_signal //and long_order_open
        strategy.close(str.tostring(long_order_id), comment = "Inversão Sinal("+str.tostring(long_order_id)+")")
        long_order_open:=false

// Sinais de compra e venda com base no stop
if long_signal and close > long_entry_level and not long_order_open
    if strategy.opentrades != 0
        strategy.cancel_all()

    long_order_id+=1
    // strategy.order(str.tostring(long_order_id), strategy.long, comment="Open Long("+str.tostring(long_order_id)+")", limit = long_entry_level) 
    strategy.entry(str.tostring(long_order_id), strategy.long, comment="Open Long("+str.tostring(long_order_id)+")", limit = long_entry_level)
    long_order_open := true
    // log.info("Open Long:"+str.tostring(long_order_id))

if short_signal and close < short_entry_level and not short_order_open
    if strategy.opentrades != 0
        strategy.cancel_all()

    short_order_id+=1
    // strategy.order(str.tostring(short_order_id), strategy.short, comment="Open Short("+str.tostring(short_order_id)+")", limit = short_entry_level)
    strategy.entry(str.tostring(short_order_id), strategy.short, comment="Open Short("+str.tostring(short_order_id)+")", limit = short_entry_level)
    short_order_open := true
    // log.info("Open Short:"+str.tostring(short_order_id))

// Sinais de compra e venda com base no stop
if long_signal and close < long_stop_level and long_order_open
    strategy.close(str.tostring(long_order_id), comment = "Stop Atingido("+str.tostring(long_order_id)+")", immediately = true)
    long_order_open := false

if short_signal and close > short_stop_level and short_order_open
    strategy.close(str.tostring(short_order_id),comment = "Stop Atingido("+str.tostring(short_order_id)+")", immediately = true)
    short_order_open := false

// Plotagem da regressão e do stop

plot(stop_ema, title="Stop Signal", color=color.red)
plot(entry_signal,"Entry Signal", linewidth = 5, color = color.rgb(155, 0, 140))

plotshape(long_order_open?long_stop_level:na, title = "Long Stop Level", color = color.green, location = location.absolute)
plotshape(long_order_open?long_entry_level:na, title="Long Entry Value",location=location.absolute, color = color.green, style = shape.circle)
plotshape(series=long_entry_signal, title="Long Signal", location=location.abovebar, color=color.green, style=shape.triangleup, size=size.small, text = "Long Signal")

plotshape(short_order_open?short_stop_level:na, title = "Short Stop Level", color = color.red, location = location.absolute)
plotshape(short_order_open?short_entry_level:na, title="Short Entry Value",location=location.absolute, color = color.red, style = shape.circle)

plotshape(series=short_entry_signal, title="Short Signal", location=location.belowbar, color=color.red, style=shape.triangledown, size=size.small, text="Short Signal")



Lebih banyak