Strategi Dagangan Regresi Purata Pergerakan Dua Arah


Tarikh penciptaan: 2024-01-15 12:15:14 Akhirnya diubah suai: 2024-01-15 12:15:14
Salin: 0 Bilangan klik: 670
1
fokus pada
1617
Pengikut

Strategi Dagangan Regresi Purata Pergerakan Dua Arah

Gambaran keseluruhan

Strategi Perdagangan Reversi Rata-rata Bergerak Bidirectional adalah strategi perdagangan kuantitatif yang dibina menggunakan prinsip pulangan purata harga. Strategi ini menangkap peluang pembalikan harga dengan menetapkan pelbagai set rata-rata bergerak, memasuki lapangan setelah harga menyimpang dari rata-rata, dan melakukan pelepasan sementara menunggu harga kembali ke rata-rata.

Prinsip Strategi

Strategi ini adalah berdasarkan teori pulangan purata harga. Ia berpendapat bahawa harga sentiasa berputar di sekitar pergerakan nilai rata-rata, dan apabila harga jauh dari nilai rata-rata, ia lebih mungkin untuk kembali ke nilai rata-rata. Secara khusus, strategi ini menetapkan tiga set rata-rata pada masa yang sama: garis rata-rata kedudukan terbuka, garis rata-rata kedudukan terbuka dan garis rata-rata kedudukan terhad.

Dari sudut logik kod, garis purata kedudukan terbuka dibahagikan kepada garis banyak dan garis pendek, masing-masing terdiri daripada garis panjang dan garis pendek. Keberkahan antara mereka dengan harga menentukan saiz kedudukan. Selain itu, garis purata kedudukan terbuka adalah garis purata yang berasingan untuk menentukan masa kedudukan terbuka.

Analisis kelebihan

Kelebihan strategi Regression Linear Bersamaan Dua Arah adalah:

  1. Capture Price Reversal, Fit for Trend Setup Market
  2. Kawalan risiko melalui kerugian terhad
  3. Kombinasi parameter yang boleh disesuaikan, beradaptasi
  4. Mudah difahami, mudah dioptimumkan parameter

Strategi ini digunakan untuk varieti yang kurang turun naik, harga turun naik yang lebih kecil, terutamanya varieti yang memasuki tahap penyesuaian. Ia dapat menangkap peluang untuk membalikkan harga sementara dengan berkesan.

Analisis risiko

Strategi Regression Linear Bias juga mempunyai beberapa risiko:

  1. Strategi ini mungkin akan membuka kedudukan berturut-turut dan akhirnya pecah apabila berlaku gelombang harga yang kuat.
  2. Risiko pergerakan harga yang terlalu besar. Jika pergerakan harga terlalu besar, kedudukan mungkin mencapai kerugian terhad dan terpaksa ditutup.
  3. Risiko pengoptimuman parameter. Tetapan parameter strategi ini mempunyai kesan penting terhadap keuntungannya, jika parameter tidak ditetapkan dengan betul, kemungkinan keuntungan akan dikurangkan dengan ketara.

Menghadapi risiko tersebut, anda boleh mengoptimumkan dari beberapa aspek:

  1. Meningkatkan had pembukaan dan mengelakkan pembukaan terlalu kerap
  2. Menurunkan saiz kedudukan yang sesuai untuk mengelakkan risiko pecah kedudukan
  3. Optimumkan seting seperti kitaran garis rata-rata, parameter garisan rata-rata

Arah pengoptimuman

Strategi ini juga mempunyai ruang yang besar untuk pengoptimuman, terutamanya dari sudut berikut:

  1. Meningkatkan logik syarat untuk membuka kedudukan dan mencegah kejatuhan dalam keadaan trend
  2. Menambah logik penurunan kedudukan untuk mengelakkan risiko turun naik harga
  3. Cuba pelbagai jenis rata-rata untuk mencari kombinasi parameter yang lebih baik
  4. Mengoptimumkan parameter secara automatik menggunakan kaedah pembelajaran mesin
  5. Menambah strategi berhenti kerugian automatik untuk mengawal risiko dengan lebih baik

ringkaskan

Strategi perdagangan pulangan linear dua arah menghasilkan keuntungan dengan menangkap peluang pulangan selepas harga menyimpang dari garis rata-rata bergerak. Ia mengawal risiko dengan berkesan, dan dapat memperoleh keuntungan yang lebih baik melalui pengoptimuman parameter. Walaupun strategi ini juga mempunyai beberapa risiko, tetapi dapat dikendalikan dengan memperbaiki logik pembukaan kedudukan, mengurangkan saiz kedudukan dan lain-lain.

Kod sumber strategi
/*backtest
start: 2023-12-15 00:00:00
end: 2024-01-14 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title = "hamster-bot MRS 2", overlay = true, default_qty_type = strategy.percent_of_equity, initial_capital = 100, default_qty_value = 30, pyramiding = 1, commission_value = 0.1, backtest_fill_limits_assumption = 1)
info_options = "Options"

on_close = input(false, title = "Entry on close", inline=info_options, group=info_options)
OFFS = input.int(0, minval = 0, maxval = 1, title = "| Offset View", inline=info_options, group=info_options)
trade_offset = input.int(0, minval = 0, maxval = 1, title = "Trade", inline=info_options, group=info_options)
use_kalman_filter = input.bool(false, title="Use Kalman filter", group=info_options)

//MA Opening
info_opening = "MA Opening Long"
maopeningtyp_l = input.string("SMA", title="Type", options=["SMA", "EMA", "TEMA", "DEMA", "ZLEMA", "WMA", "Hma", "Thma", "Ehma", "H", "L", "DMA"], title = "", inline=info_opening, group=info_opening)
maopeningsrc_l = input.source(ohlc4, title = "", inline=info_opening, group=info_opening)
maopeninglen_l = input.int(3, minval = 1, title = "", inline=info_opening, group=info_opening)
long1on    = input(true, title = "", inline = "long1")
long1shift = input.float(0.96, step = 0.005, title = "Long", inline = "long1")
long1lot   = input.int(10, minval = 0, maxval = 10000, step = 10, title = "Lot 1", inline = "long1")

info_opening_s = "MA Opening Short"
maopeningtyp_s = input.string("SMA", title="Type", options=["SMA", "EMA", "TEMA", "DEMA", "ZLEMA", "WMA", "Hma", "Thma", "Ehma", "H", "L", "DMA"], title = "", inline=info_opening_s, group=info_opening_s)
maopeningsrc_s = input.source(ohlc4, title = "", inline=info_opening_s, group=info_opening_s)
maopeninglen_s = input.int(3, minval = 1, title = "", inline=info_opening_s, group=info_opening_s)
short1on    = input(true, title = "", inline = "short1")
short1shift = input.float(1.04, step = 0.005, title = "short", inline = "short1")
short1lot   = input.int(10, minval = 0, maxval = 10000, step = 10, title = "Lot 1", inline = "short1")


//MA Closing
info_closing = "MA Closing"
maclosingtyp = input.string("SMA", title="Type", options=["SMA", "EMA", "TEMA", "DEMA", "ZLEMA", "WMA", "Hma", "Thma", "Ehma", "H", "L", "DMA"], title = "", inline=info_closing, group=info_closing)
maclosingsrc = input.source(ohlc4, title = "", inline=info_closing, group=info_closing)
maclosinglen = input.int(3, minval = 1, maxval = 200, title = "", inline=info_closing, group=info_closing)
maclosingmul = input.float(1, step = 0.005, title = "mul", inline=info_closing, group=info_closing)

startTime = input(timestamp("01 Jan 2010 00:00 +0000"), "Start date", inline = "period")
finalTime = input(timestamp("31 Dec 2030 23:59 +0000"), "Final date", inline = "period")

HMA(_src, _length) =>  ta.wma(2 * ta.wma(_src, _length / 2) - ta.wma(_src, _length), math.round(math.sqrt(_length)))
EHMA(_src, _length) =>  ta.ema(2 * ta.ema(_src, _length / 2) - ta.ema(_src, _length), math.round(math.sqrt(_length)))
THMA(_src, _length) =>  ta.wma(ta.wma(_src,_length / 3) * 3 - ta.wma(_src, _length / 2) - ta.wma(_src, _length), _length)
tema(sec, length)=>
    tema1= ta.ema(sec, length)
    tema2= ta.ema(tema1, length)
    tema3= ta.ema(tema2, length)
    tema_r = 3*tema1-3*tema2+tema3
donchian(len) => math.avg(ta.lowest(len), ta.highest(len))
ATR_func(_src, _len)=>
    atrLow = low - ta.atr(_len)
    trailAtrLow = atrLow
    trailAtrLow := na(trailAtrLow[1]) ? trailAtrLow : atrLow >= trailAtrLow[1] ? atrLow : trailAtrLow[1]
    supportHit = _src <= trailAtrLow
    trailAtrLow := supportHit ? atrLow : trailAtrLow
    trailAtrLow
f_dema(src, len)=>
    EMA1 = ta.ema(src, len)
    EMA2 = ta.ema(EMA1, len)
    DEMA = (2*EMA1)-EMA2
f_zlema(src, period) =>
    lag = math.round((period - 1) / 2)
    ema_data = src + (src - src[lag])
    zl= ta.ema(ema_data, period)
f_kalman_filter(src) =>
    float value1= na
    float value2 = na
    value1 := 0.2 * (src - src[1]) + 0.8 * nz(value1[1])
    value2 := 0.1 * (ta.tr) + 0.8 * nz(value2[1])
    lambda = math.abs(value1 / value2)
    alpha = (-math.pow(lambda, 2) + math.sqrt(math.pow(lambda, 4) + 16 * math.pow(lambda, 2)))/8
    value3 = float(na)
    value3 := alpha * src + (1 - alpha) * nz(value3[1])
//SWITCH
ma_func(modeSwitch, src, len, use_k_f=true) =>
      modeSwitch == "SMA"   ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.sma(src, len))  : ta.sma(src, len) :
      modeSwitch == "RMA"   ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.rma(src, len))  : ta.rma(src, len) :
      modeSwitch == "EMA"   ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.ema(src, len))  : ta.ema(src, len) :
      modeSwitch == "TEMA"  ? use_kalman_filter and use_k_f ? f_kalman_filter(tema(src, len))    : tema(src, len):
      modeSwitch == "DEMA"  ? use_kalman_filter and use_k_f ? f_kalman_filter(f_dema(src, len))  : f_dema(src, len):
      modeSwitch == "ZLEMA" ? use_kalman_filter and use_k_f ? f_kalman_filter(f_zlema(src, len)) : f_zlema(src, len):
      modeSwitch == "WMA"   ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.wma(src, len))  : ta.wma(src, len):
      modeSwitch == "VWMA"  ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.vwma(src, len)) : ta.vwma(src, len):
      modeSwitch == "Hma"   ? use_kalman_filter and use_k_f ? f_kalman_filter(HMA(src, len))     : HMA(src, len):
      modeSwitch == "Ehma"  ? use_kalman_filter and use_k_f ? f_kalman_filter(EHMA(src, len))    : EHMA(src, len):
      modeSwitch == "Thma"  ? use_kalman_filter and use_k_f ? f_kalman_filter(THMA(src, len/2))  : THMA(src, len/2):
      modeSwitch == "ATR"   ? use_kalman_filter and use_k_f ? f_kalman_filter(ATR_func(src, len)): ATR_func(src, len) :
      modeSwitch == "L"   ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.lowest(len)): ta.lowest(len) :
      modeSwitch == "H"   ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.highest(len)): ta.highest(len) :
      modeSwitch == "DMA"   ? donchian(len) : na

//Var
sum = 0.0
maopening_l = 0.0
maopening_s = 0.0
maclosing = 0.0
pos = strategy.position_size
p = 0.0
p := pos == 0 ? (strategy.equity / 100) / close : p[1]
truetime = true
loss = 0.0
maxloss = 0.0
equity = 0.0

//MA Opening
maopening_l := ma_func(maopeningtyp_l, maopeningsrc_l, maopeninglen_l)
maopening_s := ma_func(maopeningtyp_s, maopeningsrc_s, maopeninglen_s)

//MA Closing
maclosing := ma_func(maclosingtyp, maclosingsrc, maclosinglen) * maclosingmul

long1 = long1on == false ? 0 : long1shift == 0 ? 0 : long1lot == 0 ? 0 : maopening_l == 0 ? 0 : maopening_l * long1shift
short1 = short1on == false ? 0 : short1shift == 0 ? 0 : short1lot == 0 ? 0 : maopening_s == 0 ? 0 : maopening_s * short1shift
//Colors
long1col = long1 == 0 ? na : color.green
short1col = short1 == 0 ? na : color.red
//Lines
// plot(maopening_l, offset = OFFS, color = color.new(color.green, 50))
// plot(maopening_s, offset = OFFS, color = color.new(color.red, 50))
plot(maclosing, offset = OFFS, color = color.fuchsia)
long1line = long1 == 0 ? close : long1
short1line = short1 == 0 ? close : short1
plot(long1line, offset = OFFS, color = long1col)
plot(short1line, offset = OFFS, color = short1col)

//Lots
lotlong1 = p * long1lot
lotshort1 = p * short1lot

//Entry
if truetime
    //Long
    sum := 0
    strategy.entry("L", strategy.long, lotlong1, limit = on_close ? na : long1, when = long1 > 0 and pos <= sum and (on_close ? close <= long1[trade_offset] : true))
    sum := lotlong1

    //Short
    sum := 0
    pos := -1 * pos
    strategy.entry("S", strategy.short, lotshort1, limit = on_close ? na : short1, when = short1 > 0 and pos <= sum and (on_close ? close >= short1[trade_offset] : true))
    sum := lotshort1

strategy.exit("Exit", na, limit = maclosing)
if time > finalTime
    strategy.close_all()