Strategi momentum relatif

Penulis:ChaoZhang, Tanggal: 2024-01-29 08:38:04
Tag:

img

Gambaran umum

Strategi momentum relatif membandingkan momentum saham individu dan indeks untuk menilai kekuatan relatif saham terhadap pasar yang lebih luas. Strategi ini membeli ketika momentum saham lebih tinggi dari indeks, dan menjual ketika momentum saham lebih rendah dari indeks, untuk menangkap puncak pertumbuhan saham individu.

Prinsip-prinsip

Logika inti dari strategi ini adalah untuk menilai kekuatan relatif dari saham individu versus pasar, khususnya:

  1. Menghitung pengembalian selama periode waktu sebagai momentum saham
  2. Menghitung pengembalian indeks selama periode yang sama dengan momentum indeks
  3. Gunakan rata-rata bergerak untuk meratakan momentum saham dan indeks
  4. Ketika rata-rata pergerakan momentum saham melintasi di atas indeks, momentum saham dianggap lebih kuat daripada pasar secara keseluruhan - yaitu sinyal beli
  5. Ketika momentum pergerakan rata-rata saham melintasi di bawah momentum pergerakan rata-rata indeks, momentum saham dianggap lebih lemah, memicu sinyal jual

Melalui logika ini, kita dapat membeli saham ketika pertumbuhan mereka berkembang dan menjual ketika momentum pertumbuhan memudar, mengunci keuntungan berlebih selama periode puncak pertumbuhan saham.

Analisis Keuntungan

Keuntungan utama dari strategi momentum relatif:

  1. Dapat secara dinamis menangkap puncak pertumbuhan saham tanpa menyangkut kondisi pasar tertentu - hanya membeli ketika pertumbuhan saham melampaui pasar secara keseluruhan
  2. Perataan dengan rata-rata bergerak menyaring fluktuasi jangka pendek dan meningkatkan keandalan sinyal
  3. Kondisi pembelian dan penjualan langsung yang sederhana, mudah dipahami dan dioperasikan
  4. Fleksibilitas untuk mengkonfigurasi periode waktu untuk menghitung momentum relatif dan mengoptimalkan

Analisis Risiko

Ada juga beberapa risiko dengan strategi momentum relatif:

  1. Saham dapat mundur setelah puncak pertumbuhan berakhir, menimbulkan risiko mengambil keuntungan yang tidak cukup
  2. Sinyal momentum relatif dapat menjadi palsu, mengidentifikasi palsu alih-alih puncak nyata
  3. Perlu mengatur stop loss untuk mengendalikan kerugian maksimum

Risiko ini dapat dikelola dengan mengambil keuntungan yang wajar, menghentikan kerugian, penyesuaian parameter, dll.

Arahan Optimasi

Strategi momentum relatif dapat dioptimalkan terutama dari aspek berikut:

  1. Uji periode waktu yang berbeda untuk momentum komputasi untuk menemukan optimal
  2. Coba berbagai jenis dan panjang rata-rata bergerak untuk parameter terbaik
  3. Tambahkan filter volume untuk menghindari pecah palsu karena kurangnya momentum
  4. Masukkan indikator lain untuk mengkonfirmasi waktu masuk yang optimal

Kesimpulan

Strategi momentum relatif menangkap fase pertumbuhan yang berlebihan dari saham individu dibandingkan dengan pasar secara keseluruhan untuk menghasilkan alpha. Dengan logika beli / jual yang sederhana dan jelas dan kemudahan pengoperasiannya, dan bila digabungkan dengan optimasi parameter dan pengendalian risiko, strategi ini dapat berkinerja sangat baik.


/*backtest
start: 2024-01-21 00:00:00
end: 2024-01-28 00:00:00
period: 15m
basePeriod: 5m
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/
// © HeWhoMustNotBeNamed

//@version=4
strategy("Relative Returns Strategy", overlay=false, initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

index_ticker=input("BTC_USDT:swap")
Loopback = input(40, step=20)
useStopAndIndexReturns = input(true)
useStopAndIndexReturnsMa = input(true)

useDifference = not useStopAndIndexReturns

MAType = input(title="Moving Average Type", defval="sma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
MALength = input(10, minval=10,step=10)

i_startTime = input(defval = timestamp("01 Jan 2010 00:00 +0000"), title = "Backtest Start Time", type = input.time)
i_endTime = input(defval = timestamp("01 Jan 2099 00:00 +0000"), title = "Backtest End Time", type = input.time)
inDateRange = true

f_secureSecurity(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_on)
f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma

index = f_secureSecurity(index_ticker, '1D', close, 0)
stock_return = (close - close[Loopback])*100/close
index_return = (index - index[Loopback])*100/index

stock_return_ma = f_getMovingAverage(stock_return, MAType, MALength)
index_return_ma = f_getMovingAverage(index_return, MAType, MALength)
relativeReturns = stock_return - index_return
relativeReturns_ma = f_getMovingAverage(relativeReturns, MAType, MALength)

plot(useStopAndIndexReturns ? useStopAndIndexReturnsMa ? stock_return_ma : stock_return : na, title="StockReturn", color=color.green, linewidth=1)
plot(useStopAndIndexReturns ? useStopAndIndexReturnsMa ? index_return_ma : index_return : na, title="IndexReturn", color=color.red, linewidth=1)

plot(useDifference?relativeReturns:na, title="Relative-Returns", color=color.blue, linewidth=1)
plot(useDifference?relativeReturns_ma:na, title="MA", color=color.red, linewidth=1)

buyCondition = (useStopAndIndexReturns ? useStopAndIndexReturnsMa ? stock_return_ma > index_return_ma : stock_return > index_return : relativeReturns > relativeReturns_ma)
closeBuyCondition = (useStopAndIndexReturns ? useStopAndIndexReturnsMa ? stock_return_ma < index_return_ma : stock_return < index_return : relativeReturns < relativeReturns_ma)
strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca")
strategy.close("Buy", when=closeBuyCondition)

Lebih banyak