Strategi Harga Volume Relatif

Penulis:ChaoZhang, Tanggal: 2023-12-28 17:54:44
Tag:

img

Gambaran umum

Strategi harga volume relatif adalah strategi perdagangan kuantitatif berdasarkan volume perdagangan yang abnormal dan volatilitas harga. Strategi ini membandingkan volume perdagangan saat ini dengan rata-rata historis untuk menentukan apakah volume perdagangan abnormal. Ini juga menggabungkan interval rentang rata-rata yang benar untuk menentukan apakah harga relatif stabil. Ketika volume perdagangan meningkat secara abnormal dan harga relatif stabil, itu dianggap sebagai sinyal masuk.

Prinsip Strategi

Logika inti dari strategi harga volume relatif didasarkan pada dua indikator untuk penilaian: volume perdagangan relatif dan rentang fluktuasi harga.

Pertama, kita menghitung rata-rata bergerak sederhana dari volume perdagangan selama 20 periode terakhir sebagai volume perdagangan rata-rata historis. Kemudian kita menetapkan parameter ganda (seperti 1,5 kali). Ketika volume perdagangan saat ini lebih besar dari 1,5 kali volume perdagangan rata-rata, kita menganggap volume perdagangan tidak normal dan termasuk dalam situasi volume relatif.

Kedua, kita menghitung rentang rata-rata (ATR) selama 14 periode terakhir sebagai ukuran volatilitas harga. Pada saat yang sama, kita menghitung standar deviasi volatilitas rata-rata. Jika volatilitas sebenarnya saat ini berada di antara rata-rata ditambah atau dikurangi satu standar deviasi, kita menganggap fluktuasi harga berada dalam rentang yang relatif stabil.

Ketika kedua kondisi di atas terpenuhi pada saat yang sama, sinyal panjang dikeluarkan untuk membuka posisi panjang. Selama periode kepemilikan, dua kali ATR digunakan sebagai level stop loss, dan harga tertinggi dikurangi dua kali ATR digunakan sebagai level take profit.

Analisis Keuntungan

Keuntungan terbesar dari strategi harga volume relatif adalah bahwa ia menangkap tren harga yang disebabkan oleh volume perdagangan yang tidak normal. Ketika volume perdagangan melonjak, itu mewakili perubahan dalam sikap peserta pasar, yang seringkali menandakan harga pecah dan pembentukan tren baru. Dengan membandingkan hubungan antara volume perdagangan dan rata-rata sejarah, strategi dapat secara efektif menentukan waktu volume perdagangan yang tidak normal.

Di sisi lain, strategi juga mempertimbangkan tingkat volatilitas, sehingga sinyal terjadi selama periode harga yang relatif stabil. Ini menghindari risiko kerugian besar yang disebabkan oleh mengejar tinggi selama fluktuasi yang ganas. Ini juga meningkatkan peluang keuntungan karena tren biasanya mulai pecah setelah stabilitas relatif.

Analisis Risiko

Risiko terbesar dari strategi ini adalah bahwa indikator volume perdagangan tidak dapat 100% pasti dari tren baru. lonjakan dalam volume perdagangan dapat menjadi pecah palsu dan harga cepat berbalik. Dalam kasus seperti itu, strategi menderita kerugian yang lebih besar.

Untuk mengurangi kerugian, sesuaikan dengan parameter volume relatif dan tetapkan kriteria yang lebih ketat untuk menilai volume perdagangan yang tidak normal.

Arahan Optimasi

Strategi dapat dioptimalkan dalam aspek berikut:

  1. Tambahkan indikator lain untuk penilaian, seperti rasio perubahan, omset, dll, untuk membuat sinyal volume perdagangan abnormal lebih dapat diandalkan.

  2. Parameter ATR dapat dioptimalkan untuk saham yang berbeda untuk menentukan rentang harga yang stabil dengan lebih akurat.

  3. Tambahkan algoritma pembelajaran mesin untuk secara aktif menilai volume perdagangan yang tidak normal, bukan hanya perbandingan sederhana dengan rata-rata historis.

  4. Gunakan model pembelajaran mendalam untuk memprediksi volatilitas harga, bukan hanya berdasarkan ATR historis.

Kesimpulan

Strategi harga volume relatif menangkap volume perdagangan abnormal sebagai sinyal karakteristik dan menggabungkan penilaian stabilitas harga untuk mengeluarkan sinyal perdagangan. Strategi ini sederhana dan praktis, dan bekerja dengan baik dalam melacak volume perdagangan saham abnormal.


/*backtest
start: 2022-12-21 00:00:00
end: 2023-12-27 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/
// © DojiEmoji (kevinhhl)

//@version=4
strategy("[KL] Relative Volume + ATR Strategy",overlay=true,pyramiding=1)
ENUM_LONG = "Long"

// Timeframe {
backtest_timeframe_start = input(defval = timestamp("01 Apr 2016 13:30 +0000"), title = "Backtest Start Time", type = input.time)
USE_ENDTIME = input(false,title="Define backtest end-time (If false, will test up to most recent candle)")
backtest_timeframe_end = input(defval = timestamp("01 May 2021 19:30 +0000"), title = "Backtest End Time (if checked above)", type = input.time)
within_timeframe = true
// }
len_volat = input(14,title="Length of ATR to determine volatility")
ATR_volat = atr(len_volat)
avg_ATR_volat  = sma(ATR_volat, len_volat)
std_ATR_volat = stdev(ATR_volat, len_volat)
// }

// Trailing stop loss {
ATR_X2_TSL = atr(input(14,title="Length of ATR for trailing stop loss")) * input(2.0,title="ATR Multiplier for trailing stop loss",type=input.float)
TSL_source = low
var stop_loss_price = float(0)
TSL_line_color = color.green, TSL_transp = 100
if strategy.position_size == 0 or not within_timeframe
    TSL_line_color := color.black
    stop_loss_price := TSL_source - ATR_X2_TSL 
else if strategy.position_size > 0
    stop_loss_price := max(stop_loss_price, TSL_source - ATR_X2_TSL)
    TSL_transp := 0
plot(stop_loss_price, color=color.new(TSL_line_color, TSL_transp))
// }

// Signals for entry {
_avg_vol = sma(volume,input(20, title="SMA(volume) length (for relative comparison)"))
_relative_vol = _avg_vol * input(1.5,title="Multiple of avg vol to consider relative volume as being high",type=input.float)
__lowerOfOpenClose = min(open,close)
_wickRatio_lower = (__lowerOfOpenClose - low) / (high - low)
entry_signal1 = volume > _relative_vol
entry_signal2 = ATR_volat < avg_ATR_volat + std_ATR_volat and ATR_volat > avg_ATR_volat - std_ATR_volat
// }


alert_per_bar(msg)=>
    prefix = "[" + syminfo.root + "] "
    suffix = "(P=" + tostring(close) + "; atr=" + tostring(ATR_volat) + ")"
    alert(tostring(prefix) + tostring(msg) + tostring(suffix), alert.freq_once_per_bar)

// MAIN:
if within_timeframe
    if strategy.position_size > 0 and strategy.position_size[1] > 0 and (stop_loss_price/stop_loss_price[1]-1) > 0.005
        alert_per_bar("TSL raised to " + tostring(stop_loss_price))

    // EXIT ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::    // placed before entry, will re-enter if stopped out
	exit_msg = close <= strategy.position_avg_price ? "stop loss" : "take profit"
	if strategy.position_size > 0 and TSL_source <= stop_loss_price
        strategy.close(ENUM_LONG, comment=exit_msg)

    // ENTRY :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
	if entry_signal1 and entry_signal2// and entry_signal3
		entry_msg = strategy.position_size > 0 ? "adding" : "initial"
		strategy.entry(ENUM_LONG, strategy.long, comment=entry_msg)

// CLEAN UP:
if strategy.position_size == 0
	stop_loss_price := float(0)


Lebih banyak