Identifikasi kuantitatif strategi fase akumulasi


Tanggal Pembuatan: 2024-02-20 11:29:57 Akhirnya memodifikasi: 2024-02-20 11:29:57
menyalin: 0 Jumlah klik: 589
1
fokus pada
1617
Pengikut

Identifikasi kuantitatif strategi fase akumulasi

Ringkasan

Strategi ini menggunakan kombinasi dari moving averages, volume of trade, dan price momentum indicator untuk merancang seperangkat aturan kuantitatif untuk mengidentifikasi kapan saham memasuki tahap akumulasi. Pada tahap ini, saham biasanya berada dalam kondisi harga yang stabil dan bergejolak, memberikan peluang bagus untuk masuk dengan harga yang lebih rendah.

Prinsip Strategi

Strategi ini menggunakan 50-, 90- dan 200-hari moving average sederhana untuk menentukan tren harga. Hanya ketika harga berada di atas garis 200 hari, sinyal beli dihasilkan. Ini dapat menyaring ketidakpastian penurunan tren besar.

Selain menilai tren besar, strategi juga menilai urutan garis rata-rata jangka pendek untuk mengkonfirmasi tren. Secara khusus, menilai garis 50 lebih tinggi dari garis 90.

Strategi ini menggabungkan indikator volume transaksi PVT dan MACD untuk menilai karakteristik akumulasi, berdasarkan pada apakah rata-rata bergerak mengkonfirmasi tren besar dan tren jangka pendek memenuhi syarat. Sinyal beli hanya akan dihasilkan ketika PVT menerobos ke atas, garis MACD lebih tinggi dari garis sinyal dan volume transaksi meningkat.

Keunggulan Strategis

Berbeda dengan menggunakan moving average saja, strategi ini mengkonfirmasi tren dan juga memeriksa karakteristik volume transaksi. Ini dapat lebih akurat menentukan kapan saham memasuki tahap akumulasi, sehingga memastikan keuntungan harga masuk.

Strategi ini menggabungkan penilaian tren jangka menengah dan jangka panjang dengan penilaian karakteristik jangka pendek melalui analisis beberapa kerangka waktu. Pencocokan kerangka waktu dapat mengurangi ketidakpastian akibat kesalahan penilaian kerangka waktu tunggal.

Risiko dan Solusi

Strategi ini terutama bergantung pada penilaian rata-rata, dan penilaian rata-rata tidak akan berlaku ketika harga mengalami fluktuasi yang kuat. Pada saat ini, ukuran posisi harus dikurangi, atau langsung menghentikan kerugian keluar.

Selain itu, penilaian pada tahap akumulasi juga dapat salah, sehingga kehilangan kesempatan untuk membalikkannya. Ini perlu dikonfirmasi dengan melihat lebih banyak indikator karakteristik.

Optimalkan Pikiran

Strategi ini dapat memperkenalkan algoritma pembelajaran mesin untuk membuat penilaian otomatis pada tahap akumulasi melalui ekstraksi karakteristik dan pelatihan model. Ini dapat mengurangi keterbatasan yang disebabkan oleh penetapan nilai ambang manual.

Selain itu, strategi ini juga dapat mencoba fungsi breakpoint, yang secara otomatis beralih parameter yang berbeda dalam lingkungan pasar yang berbeda, untuk membuat strategi lebih kasar.

Meringkaskan

Strategi ini secara keseluruhan menggunakan cara yang sesuai dengan harga dan volume transaksi untuk menilai karakteristik akumulasi saham. Menggali peluang akumulasi jangka pendek sambil mengkonfirmasi arah besar.

Kode Sumber Strategi
/*backtest
start: 2023-02-13 00:00:00
end: 2024-02-19 00:00:00
period: 1d
basePeriod: 1h
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/
// © stocktechbot

//@version=5
strategy("Accumulate", overlay = true)
lookback = input(defval = 21, title = 'Lookback')
offset = input.int(title="Offset", defval=0, minval=-500, maxval=500)
//SMA Tredline
out = ta.sma(close, 200)
outf = ta.sma(close, 50)
outn = ta.sma(close, 90)
outt = ta.sma(close, 21)
//sma plot
plot(out, color=color.blue, title="MA200", offset=offset)
plot(outf, color=color.maroon, title="MA50", offset=offset)
plot(outn, color=color.orange, title="MA90", offset=offset)
plot(outt, color=color.olive, title="MA21", offset=offset)

//MarketCap Calculation
//MarketCap = 0.0
//TSO = request.financial(syminfo.tickerid, "TOTAL_SHARES_OUTSTANDING", "FQ", ignore_invalid_symbol = true)


//if str.tostring(TSO) != 'na'
//    if ta.barssince(TSO != TSO[1] and TSO > TSO[1])==0
//        MarketCap := TSO * close
//       
//    if barstate.islast and MarketCap == 0
//        runtime.error("No MarketCap is provided by the data vendor.")
//    
//momlen = 100
//msrc = MarketCap
//mom = msrc - msrc[momlen]
//plotmom = if (mom > mom[1])
//    true
//else
//   false

//OBV with sma on macd
obv = ta.cum(math.sign(ta.change(close)) * volume)
smoothingLength = 5
smoothingLine = ta.sma(obv,5)
[macdLine, signalLine, histLine] = ta.macd(ta.pvt, 12, 26, 9)
sellvolhigh = macdLine < signalLine
buyvolhigh = macdLine > signalLine
//Buy Signal
mafentry =ta.sma(close, 50) > ta.sma(close, 90)
//matentry = ta.sma(close, 21) > ta.sma(close, 50)
matwohun = close > ta.sma(close, 200)
higheshigh = ta.rising(high, 2)
higheslow = ta.rising(low, 2 )
twohunraise = ta.rising(out, 2)
//highvol =  ta.crossover(volume, ta.sma(volume, lookback))
highvol = ta.rising(volume,2)
fourlow = ta.lowest(close, lookback)
fourhig = ta.highest(close, lookback)
change =  (((fourhig - fourlow) / fourlow) * 100) <= 30
green = close > open
allup = false
lineabove = ta.cross(close, ta.sma(close, input(defval = 21, title = 'Entry Line')))
if matwohun and mafentry and higheshigh and twohunraise and buyvolhigh
//if higheshigh and higheslow and highvol
    allup := true

plotshape(allup, style=shape.arrowup,location=location.belowbar, color=color.green, title = "Buy Signal")

barsSinceLastEntry() =>
    strategy.opentrades > 0 ? bar_index - strategy.opentrades.entry_bar_index(strategy.opentrades - 1) : na
    
//Sell Signal
mafexit =ta.sma(close, 50) < ta.sma(close, 90)
matexit = ta.sma(close, 21) < ta.sma(close, 50)
matwohund = close < ta.sma(close, 200)
linebreak = ta.sma(close, input(defval = 21, title = 'Exit Line')) > close
lowesthigh = ta.falling(high, 3)
lowestlow = ta.falling(low, 2 )
twohunfall = ta.falling(out, 3)
twentyfall = ta.falling(outt, 2)
highvole =  ta.crossover(volume, ta.sma(volume, 5))
//fourlow = ta.lowest(close, lookback)
//fourhig = ta.highest(close, lookback)
changed =  (((fourhig - close) / close) * 100) >= 10
red = close < open
atr = ta.atr(14)
//atrsmalen = int(bar_index - strategy.opentrades.entry_bar_index(strategy.opentrades - 1) )
atrsmalen = barsSinceLastEntry()
atrsma = false
atrlen = 5
if str.tostring(atrsmalen) != 'NaN' and atrsmalen > 0
    atrlen := atrsmalen

    
atrsma := atr > ta.sma(atr,50)


alldwn = false
if sellvolhigh and lowestlow and (close < close[1] and close < open)
//if higheshigh and higheslow and highvol
    alldwn := true

plotshape(alldwn, style=shape.arrowdown,location=location.abovebar, color=color.red, title = "Sell Signal")


longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
if (allup)
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
if (alldwn)
    strategy.entry("My Short Entry Id", strategy.short)