Strategi pembalikan purata bergerak berganda

Penulis:ChaoZhang, Tarikh: 2023-12-25 13:24:14
Tag:

img

Ringkasan

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 (SMA) dan SMA 200 hari untuk memanfaatkan penurunan jangka pendek dalam trend kenaikan jangka panjang yang mendasari.

Logika Strategi

Strategi pembalikan purata bergerak berganda adalah berdasarkan andaian berikut:

  1. SMA 200 hari mengenal pasti trend jangka panjang yang berlaku di pasaran. Apabila harga di atas garis 200 hari, ia menandakan bahawa pasaran berada dalam trend kenaikan jangka panjang.

  2. SMA 10 hari menunjukkan penurunan harga jangka pendek. Apabila harga jatuh di bawah garis 10 hari, ia menunjukkan penurunan sementara telah berlaku.

  3. Dalam trend kenaikan pasaran bull yang berterusan, sebarang penurunan jangka pendek boleh dilihat sebagai peluang pembelian untuk menangkap pemulihan yang meningkat dengan cekap.

Berdasarkan andaian di atas, isyarat perdagangan dihasilkan seperti berikut:

  1. Apabila harga penutupan melintasi di atas SMA 200 hari dan pada masa yang sama melintasi di bawah SMA 10 hari, ia mencetuskan isyarat beli kerana ia menunjukkan trend jangka panjang kekal positif tetapi penurunan jangka pendek telah berlaku.

  2. Jika harga melintasi semula di atas SMA 10 hari ketika berada dalam kedudukan panjang, trend jangka pendek telah berbalik sehingga kedudukan akan ditutup dengan segera.

  3. Setiap kali terdapat kemerosotan besar (melampaui ambang yang telah ditentukan), ia memberikan peluang untuk membeli penurunan sebagai isyarat yang bertentangan.

Dengan reka bentuk ini, strategi ini bertujuan untuk memanfaatkan dengan cekap pada snapback menaik semasa trend menaik yang berterusan sambil mengawal risiko menggunakan kerugian berhenti.

Kelebihan

Strategi pembalikan purata bergerak berganda mempunyai kelebihan utama berikut:

  1. Logik strategi adalah mudah dan mudah difahami.
  2. Penapis purata bergerak berganda secara berkesan mengenal pasti trend jangka pendek dan jangka panjang.
  3. Ia menawarkan kecekapan masa yang baik dengan memanfaatkan pembalikan jangka pendek.
  4. Mekanisme stop loss terbina dalam mengawal risiko pada kedudukan individu dengan ketat.
  5. Parameterisasi yang fleksibel menjadikan strategi ini boleh digunakan secara meluas untuk indeks dan stok.

Risiko

Walaupun secara amnya berkesan, strategi ini mempunyai batasan berikut:

  1. Whipsaws dan isyarat palsu boleh berlaku jika pasaran terhad dalam julat.
  2. Bergantung hanya pada purata bergerak mempunyai had ketepatan isyarat.
  3. Metodologi stop loss tetap tidak mempunyai fleksibiliti. Teknik stop loss lain boleh diuji.
  4. Parameter optimum perlu dikalibrasi untuk pasaran yang berbeza. tetapan suboptimal mengurangkan kebolehpercayaan.

Peluang Peningkatan

Peningkatan lanjut untuk strategi ini termasuk:

  1. Uji panjang purata bergerak lain untuk mencari kombinasi yang optimum.
  2. Menambah penunjuk sokongan untuk menjana isyarat yang lebih boleh dipercayai e.g. jumlah, metrik turun naik.
  3. meneroka teknik stop loss lain seperti trailing stop loss, stop loss berdasarkan masa.
  4. Membina keupayaan penyesuaian ke dalam peraturan kemasukan dan parameter stop loss yang membolehkan penyesuaian kepada dinamik pasaran yang berubah.
  5. Menggabungkan algoritma pembelajaran mesin untuk mengoptimumkan parameter yang menggunakan lebih banyak data sejarah.

Kesimpulan

Ringkasnya, Strategi Pembalikan Purata Bergerak Berganda adalah pendekatan yang sangat praktikal. Ia membolehkan kemerosotan pulback yang menguntungkan semasa trend menaik yang berterusan menggunakan analisis purata bergerak yang dipasangkan dengan kerugian berhenti. Ia juga menawarkan keupayaan pengesanan rejim pasaran dan kawalan risiko. Dengan peningkatan berterusan, strategi ini menawarkan potensi yang kuat untuk memberikan prestasi yang berbeza.


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






Lebih lanjut