Strategi Pembalikan Purata Pergerakan Berganda


Tarikh penciptaan: 2023-12-25 13:24:14 Akhirnya diubah suai: 2023-12-25 13:24:14
Salin: 1 Bilangan klik: 575
1
fokus pada
1621
Pengikut

Strategi Pembalikan Purata Pergerakan Berganda

Gambaran keseluruhan

Strategi pembalikan purata bergerak berganda adalah strategi perdagangan kuantitatif yang menggunakan purata bergerak berganda untuk mengenal pasti trend jangka pendek dan jangka panjang. Strategi ini menggabungkan purata bergerak mudah 10 hari dan purata bergerak mudah 200 hari untuk menangkap peluang pembelian pengembalian pendek di bawah trend besar dalam jangka panjang. Strategi ini juga mempunyai mekanisme pemantauan trend dan kawalan kerugian.

Prinsip Strategi

Strategi pembalikan rata-rata bergerak berganda adalah berdasarkan kepada anggapan berikut:

  1. Rata-rata bergerak mudah 200 hari dapat mengenal pasti arah trend jangka panjang pasaran. Apabila harga berada di atas garis 200 hari, ia mewakili saham besar dalam trend bullish jangka panjang.

  2. Purata bergerak mudah 10 hari dapat mengenal pasti kenaikan harga dalam jangka pendek. Apabila harga berada di bawah garis 10 hari, ia mewakili kenaikan harga dalam jangka pendek.

  3. Dalam trend kenaikan harga dalam jangka masa panjang, sebarang kenaikan harga dalam jangka pendek boleh dianggap sebagai peluang untuk pengambilan rendah yang boleh ditangkap dengan cekap.

Berdasarkan hipotesis di atas, logik penjanaan isyarat perdagangan untuk strategi ini adalah:

  1. Apabila harga penutupan melintasi garis 200 hari di atas dan pada masa yang sama melintasi garis 10 hari di bawah, ia mewakili kecenderungan jangka panjang yang melonjak, dan terdapat penyesuaian jangka pendek, sehingga menghasilkan isyarat beli.

  2. Apabila memegang kedudukan, jika harga penutupan kembali melintasi garis 10 hari, yang mewakili pembalikan trend jangka pendek, anda harus segera menghentikan kerugian. Selain itu, jika harga saham mengalami penurunan yang lebih besar yang menyebabkan kerugian mencapai garis stop loss yang ditetapkan sebelumnya, anda juga akan menghentikan kerugian secara aktif.

  3. Apabila keseluruhan saham besar mengalami kejatuhan yang lebih ketara, anda boleh mengambil peluang untuk mengambil risiko rendah dan memutuskan masa untuk membeli dengan menetapkan paras penurunan yang ditetapkan terlebih dahulu.

Dengan reka bentuk seperti itu, ia boleh dilakukan dengan berkesan dalam trend bullish jangka panjang, dan menetapkan stop loss untuk mengawal risiko.

Kelebihan Strategik

Strategi pembalikan purata bergerak berganda mempunyai beberapa kelebihan:

  1. Strategi ini jelas dan mudah difahami dan dilaksanakan.
  2. Dengan menggunakan penapis purata bergerak berganda, trend jangka panjang dan jangka pendek dalam saham utama dan saham individu dapat diiktiraf dengan berkesan.
  3. Ia mempunyai kecekapan masa yang lebih baik. Dengan menangkap perubahan jangka pendek, ia boleh mencapai kecekapan penggunaan dana yang lebih tinggi.
  4. Mekanisme berhenti kerugian terbina dalam, boleh mengawal kerugian kedudukan individu dengan baik.
  5. Parameter boleh diatur secara fleksibel untuk indeks saham besar dan saham popular.

Risiko Strategik

Walaupun terdapat kelebihan yang jelas dalam strategi pembalikan purata bergerak berganda, terdapat juga beberapa risiko:

  1. Apabila matawang besar berada dalam penukaran jangka panjang, ia mudah menghasilkan isyarat salah, yang boleh menjejaskan prestasi strategi. Pada masa ini anda perlu menangguhkan strategi dan menunggu trend yang jelas untuk diaktifkan.
  2. Hanya bergantung pada purata bergerak untuk menilai trend dan menghasilkan isyarat, mungkin kehilangan ciri-ciri lain yang berkesan. Anda boleh mempertimbangkan untuk memperkenalkan lebih banyak penunjuk untuk pengoptimuman gabungan.
  3. Satu-satunya kaedah penangguhan mungkin terlalu kaku, anda boleh menguji pelbagai jenis mekanisme penangguhan.
  4. Parameter strategi perlu disesuaikan dan dioptimumkan untuk standard yang berbeza, jika tidak, ia akan mempengaruhi kestabilan.

Arah pengoptimuman strategi

Terdapat juga beberapa cara yang boleh dioptimumkan untuk membalikkan strategi purata bergerak berganda:

  1. Uji kombinasi purata bergerak dengan panjang yang berbeza untuk mencari parameter yang optimum.
  2. Menambah petunjuk tambahan untuk membentuk isyarat yang lebih stabil. Seperti jumlah transaksi, indikator gegaran, dan sebagainya.
  3. Uji pelbagai jenis hentian seperti hentian pengesanan, hentian masa dan sebagainya.
  4. Mengoptimumkan parameter pembelian dan hentikan kerugian untuk menyesuaikan diri dengan keadaan pasaran yang berubah.
  5. Menambah algoritma pembelajaran mesin, menggunakan lebih banyak data sejarah untuk mengoptimumkan parameter.

ringkaskan

Strategi pembalikan rata-rata bergerak ganda secara keseluruhan adalah strategi kuantitatif yang sangat praktikal. Ia menggunakan kelebihan rata-rata bergerak untuk mengambil dan menghentikan kerugian yang rendah dalam keadaan berbilang garis panjang, sehingga mendapat keuntungan satu putaran yang lebih tinggi. Ia juga mempunyai kebolehan untuk mengenali taruhan besar dan mengawal risiko.

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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Gold_D_Roger
//note: spreading 1 statement over multiple lines needs 1 apce + 1 tab | multi line function is 1 tab
//Recommended tickers: SPY (D), QQQ (D) and big indexes, AAPL (4H)

//@version=5
strategy("Davin's 10/200MA Pullback on SPY Strategy v2.0",
     overlay=true,
     initial_capital=10000,
     default_qty_type=strategy.percent_of_equity,
     default_qty_value=10, // 10% of equity on each trade
     commission_type=strategy.commission.cash_per_contract, 
     commission_value=0.1) //Insert your broker's rate, IB is 0.005USD or tiered

//Best parameters
// SPY D
// Stop loss 0.15
// commission of 0.005 USD using Interactive brokers
// Exit on lower close 
// Buy more when x% down --> 14%
// DO NOT include stop condition using MA crossover

// Get User Input
i_ma1           = input.int(title="MA Length 1", defval=200, step=10, group="Strategy Parameters", tooltip="Long-term MA 200")
i_ma2           = input.int(title="MA Length 2", defval=10, step=10, group="Strategy Parameters", tooltip="Short-term MA 10")
i_ma3           = input.int(title="MA Length 3", defval=50, step=1, group="Strategy Parameters", tooltip="MA for crossover signals`")
i_stopPercent   = input.float(title="Stop Loss Percent", defval=0.15, step=0.01, group="Strategy Parameters", tooltip="Hard stop loss of 10%")
i_startTime     = input(title="Start filter", defval=timestamp("01 Jan 2013 13:30 +0000"), group="Time filter", tooltip="Start date and time to begin")
i_endTime       = input(title="End filter", defval=timestamp("01 Jan 2099 19:30 +0000"), group="Time filter", tooltip="End date and time to stop")
i_lowerClose    = input.bool(title="Exit on lower close", defval=true, group="Strategy Parameters", tooltip="Wait for lower close after above 10SMA before exiting") // optimise exit strat, boolean type creates tickbox type inputs
i_contrarianBuyTheDip = input.bool(title="Buy whenever more than x% drawdown", defval=true, group="Strategy Parameters", tooltip="Buy the dip! Whenever x% or more drawdown on SPY")
i_contrarianTrigger = input.int(title="Trigger % drop to buy the dip", defval=14, step=1, group="Strategy Parameters", tooltip="% drop to trigger contrarian Buy the Dip!") 
//14% to be best for SPY 1D
//20% best for AMZN 1D
i_stopByCrossover_MA2_3 = input.bool(title="Include stop condition using MA crossover", defval=false, group="Strategy Parameters", tooltip="Sell when crossover of MA2/1 happens")

// Get indicator values
ma1 = ta.sma(close,i_ma1) //param 1
ma2 = ta.sma(close,i_ma2) //param 2
ma3 = ta.sma(close,i_ma3) //param 3
ma_9 = ta.ema(close,9) //param 2
ma_20 = ta.ema(close,20) //param 3

// Check filter(s)
f_dateFilter = true //make sure date entries are within acceptable range

// Highest price of the prev 52 days: https://www.tradingcode.net/tradingview/largest-maximum-value/#:~:text=()%20versus%20ta.-,highest(),max()%20and%20ta.
highest52 = ta.highest(high,52)
overall_change = ((highest52 - close[0]) / highest52) * 100

// Check buy/sell conditions
var float buyPrice = 0 //intialise buyPrice, this will change when we enter a trade ; float = decimal number data type 0.0
buyCondition  = (close > ma1 and close < ma2 and strategy.position_size == 0 and f_dateFilter) or (strategy.position_size == 0 and i_contrarianBuyTheDip==true and overall_change > i_contrarianTrigger and f_dateFilter) // higher than 200sma, lower than short term ma (pullback) + avoid pyramiding positions
sellCondition = close > ma2 and strategy.position_size > 0 and (not i_lowerClose or close < low[1])  //check if we already in trade + close above 10MA; 
// third condition: EITHER i_lowerClose not turned on OR closing price has to be < previous candle's LOW [1]

stopDistance  = strategy.position_size > 0 ? ((buyPrice - close)/close) : na // check if in trade > calc % drop dist from entry, if not na
stopPrice     = strategy.position_size > 0 ? (buyPrice - (buyPrice * i_stopPercent)) : na // calc SL price if in trade, if not, na
stopCondition = (strategy.position_size > 0 and stopDistance > i_stopPercent) or (strategy.position_size > 0 and (i_stopByCrossover_MA2_3==true and ma3 < ma1))


// Enter positions
if buyCondition 
    strategy.entry(id="Long", direction=strategy.long) //long only

    
if buyCondition[1] // if buyCondition is true prev candle
    buyPrice := open // entry price = current bar opening price

// Exit position
if sellCondition or stopCondition 
    strategy.close(id="Long", comment = "Exit" + (stopCondition ? "Stop loss=true" : "")) // if condition? "Value for true" : "value for false"
    buyPrice := na //reset buyPrice

// Plot
plot(buyPrice, color=color.lime, style=plot.style_linebr)
plot(stopPrice, color=color.red, style=plot.style_linebr, offset = -1)
plot(ma1, color=color.blue) //defval=200
plot(ma2, color=color.white) //defval=10
plot(ma3, color=color.yellow) // defval=50