Strategi kuantitatif berdasarkan tingkat perubahan


Tanggal Pembuatan: 2023-12-12 15:56:56 Akhirnya memodifikasi: 2023-12-12 15:56:56
menyalin: 0 Jumlah klik: 655
1
fokus pada
1621
Pengikut

Strategi kuantitatif berdasarkan tingkat perubahan

Ringkasan

Strategi ini didasarkan pada indikator perubahan (ROC) untuk menilai tren pasar dan menghasilkan sinyal perdagangan. Gagasan inti dari strategi ini adalah mengikuti tren jangka panjang, dengan mengambil risiko yang lebih besar untuk mendapatkan keuntungan yang melebihi pasar.

Prinsip Strategi

Aturan masuk

  • Jika ROC>0, lakukan lebih banyak; jika ROC, lakukan kosong. Gunakan indikator positif-negatif ROC untuk menilai arah pasar.
  • Untuk menyaring getaran, sinyal perdagangan hanya akan dikirim jika ROC berada di sisi yang sama selama dua hari berturut-turut.

Aturan Stop Loss

Stop loss disetel menjadi 6%. Jika stop loss dipicu, maka posisi akan berubah arah. Ini berarti bahwa kita mungkin berada di sisi yang salah dalam perdagangan dan perlu melakukan reversal stop loss tepat waktu.

Mekanisme anti-bubble

Jika ROC lebih dari 200, maka dianggap sebagai gelembung. Ketika ROC jatuh kembali ke bawah gelembung, menghasilkan sinyal kosong. Selain itu, permintaan gelembung berlangsung setidaknya 1 minggu.

Manajemen dana

Gunakan metode posisi tetap + kenaikan. Setiap naik atau turun \( 400, menambah atau mengurangi posisi \) 200. Dengan demikian, Anda dapat menggunakan keuntungan untuk menambah posisi sehingga mendapatkan keuntungan yang lebih besar, tetapi juga meningkatkan penarikan.

Analisis Keunggulan

Ini adalah strategi untuk melacak tren jangka panjang.

  1. Mengikuti filosofi perdagangan tren, mudah untuk mendapatkan keuntungan positif jangka panjang.
  2. Menggunakan stop loss untuk mengendalikan risiko, dapat mengurangi dampak dari fluktuasi pasar jangka pendek.
  3. Sistem anti-gelembung dapat mencegah kenaikan harga di puncak pasar.
  4. Posisi tetap + manajemen modal yang meningkat membuatnya mendapatkan pertumbuhan indeks di pasar bullish.

Analisis risiko

Strategi ini juga memiliki beberapa risiko:

  1. Indikator ROC rentan terhadap getaran, menghasilkan sinyal yang salah. Anda dapat mempertimbangkan untuk menambahkan indikator lain untuk melakukan penyaringan kombinasi.
  2. Tidak mempertimbangkan biaya transaksi, keuntungan yang diperoleh dalam penggunaan sebenarnya lebih rendah daripada yang diukur ulang.
  3. Parameter anti-bubble yang tidak disetel dengan benar juga mudah dilewatkan.
  4. Posisi tetap + kenaikan akan meningkatkan pengembalian jika terjadi kerugian.

Arah optimasi

Strategi ini dapat dioptimalkan dalam beberapa hal:

  1. Menambahkan penilaian indikator lain, membentuk sistem perdagangan, untuk memfilter sinyal yang salah. Sebagai contoh, menambahkan indikator seperti garis rata-rata, tingkat fluktuasi.
  2. Mengoptimalkan parameter anti-bubble, mengatur mekanisme identifikasi bubble yang lebih akurat.
  3. Mengatur posisi tetap dan parameter kenaikan untuk mendapatkan keseimbangan risiko-penghasilan yang lebih baik.
  4. Menambahkan mekanisme stop loss otomatis. Stop loss otomatis jika terjadi kerugian besar.
  5. Mengingat dampak dari biaya transaksi, menetapkan standar masuk yang lebih realistis.

Meringkaskan

Secara keseluruhan, ini adalah strategi pelacakan garis panjang dengan metrik ROC sebagai inti. Ini adalah strategi yang proaktif untuk mendapatkan keuntungan ekstra di luar taruhan besar dengan mengambil risiko yang lebih besar.

Kode Sumber Strategi
/*backtest
start: 2022-12-05 00:00:00
end: 2023-12-11 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/
// © gsanson66


//This strategy use the Rate of Change (ROC) of the closing price to send enter signal. 
//@version=5
strategy("RATE OF CHANGE BACKTESTING", shorttitle="ROC BACKTESTING", overlay=false, precision=3, initial_capital=1000, default_qty_type=strategy.cash, default_qty_value=950, commission_type=strategy.commission.percent, commission_value=0.18)


//--------------------------------FUNCTIONS-----------------------------------//

//@function Displays text passed to `txt` when called.
debugLabel(txt, color, loc) =>
    label.new(bar_index, loc, text = txt, color=color, style = label.style_label_lower_right, textcolor = color.black, size = size.small)

//@function which looks if the close date of the current bar falls inside the date range
inBacktestPeriod(start, end) => (time >= start) and (time <= end)


//----------------------------------USER INPUTS----------------------------------//

//Technical parameters
rocLength = input.int(defval=365, minval=0, title='ROC Length', group="Technical parameters")
bubbleValue = input.int(defval=200, minval=0, title="ROC Bubble signal", group="Technical parameters")
//Risk management
stopLossInput = input.float(defval=10, minval=0, title="Stop Loss (in %)", group="Risk Management")
//Money management
fixedRatio = input.int(defval=400, minval=1, title="Fixed Ratio Value ($)", group="Money Management")
increasingOrderAmount = input.int(defval=200, minval=1, title="Increasing Order Amount ($)", group="Money Management")
//Backtesting period
startDate = input(title="Start Date", defval=timestamp("1 Jan 2017 00:00:00"), group="Backtesting Period")
endDate = input(title="End Date", defval=timestamp("1 July 2024 00:00:00"), group="Backtesting Period")


//-------------------------------------VARIABLES INITIALISATION-----------------------------//

roc = (close/close[rocLength] - 1)*100
midlineConst = 0
var bool inBubble = na
bool shortBubbleCondition = na
equity = strategy.equity - strategy.openprofit
strategy.initial_capital = 50000
var float capital_ref = strategy.initial_capital
var float cashOrder = strategy.initial_capital * 0.95
bool inRange = na


//------------------------------CHECKING SOME CONDITIONS ON EACH SCRIPT EXECUTION-------------------------------//

//Checking if the date belong to the range
inRange := true

//Checking if we are in a bubble
if roc > bubbleValue and not inBubble
    inBubble := true

//Checking if the bubble is over
if roc < 0 and inBubble
    inBubble := false

//Checking the condition to short the bubble : The ROC must be above the bubblevalue for at least 1 week
if roc[1]>bubbleValue and roc[2]>bubbleValue and roc[3]>bubbleValue and roc[4]>bubbleValue and roc[5]>bubbleValue and roc[6]>bubbleValue and roc[7]>bubbleValue
    shortBubbleCondition := true

//Checking performances of the strategy
if equity > capital_ref + fixedRatio
    spread = (equity - capital_ref)/fixedRatio
    nb_level = int(spread)
    increasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder + increasingOrder
    capital_ref := capital_ref + nb_level*fixedRatio
if equity < capital_ref - fixedRatio
    spread = (capital_ref - equity)/fixedRatio
    nb_level = int(spread)
    decreasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder - decreasingOrder
    capital_ref := capital_ref - nb_level*fixedRatio

//Checking if we close all trades in case where we exit the backtesting period
if strategy.position_size!=0 and not inRange
    debugLabel("END OF BACKTESTING PERIOD : we close the trade", color=color.rgb(116, 116, 116), loc=roc)
    strategy.close_all()


//-------------------------------LONG/SHORT CONDITION-------------------------------//

//Long condition
//We reduce noise by taking signal only if the last roc value is in the same side as the current one
if (strategy.position_size<=0 and ta.crossover(roc, midlineConst)[1] and roc>0 and inRange)
    //If we were in a short position, we pass to a long position
    qty = cashOrder/close
    strategy.entry("Long", strategy.long, qty)
    stopLoss = close * (1-stopLossInput/100)
    strategy.exit("Long Risk Managment", "Long", stop=stopLoss)

//Short condition
//We take a short position if we are in a bubble and roc is decreasing
if (strategy.position_size>=0 and ta.crossunder(roc, midlineConst)[1] and roc<0 and inRange) or 
     (strategy.position_size>=0 and inBubble and ta.crossunder(roc, bubbleValue) and shortBubbleCondition and inRange)
    //If we were in a long position, we pass to a short position
    qty = cashOrder/close
    strategy.entry("Short", strategy.short, qty)
    stopLoss = close * (1+stopLossInput/100)
    strategy.exit("Short Risk Managment", "Short", stop=stopLoss)


//--------------------------------RISK MANAGEMENT--------------------------------------//

//We manage our risk and change the sense of position after SL is hitten
if strategy.position_size == 0 and inRange
    //We find the direction of the last trade
    id = strategy.closedtrades.entry_id(strategy.closedtrades-1)
    if id == "Short"
        qty = cashOrder/close
        strategy.entry("Long", strategy.long, qty)
        stopLoss = close * (1-stopLossInput/100)
        strategy.exit("Long Risk Managment", "Long", stop=stopLoss)
    else if id =="Long"
        qty = cashOrder/close
        strategy.entry("Short", strategy.short, qty)
        stopLoss = close * (1+stopLossInput/100)
        strategy.exit("Short Risk Managment", "Short", stop=stopLoss)


//---------------------------------PLOTTING ELEMENTS---------------------------------------//

//Plotting of ROC
rocPlot = plot(roc, "ROC", color=#7E57C2)
midline = hline(0, "ROC Middle Band", color=color.new(#787B86, 25))
midLinePlot = plot(0, color = na, editable = false, display = display.none)
fill(rocPlot, midLinePlot, 40, 0, top_color = strategy.position_size>0 ? color.new(color.green, 0) : strategy.position_size<0 ? color.new(color.red, 0) : na, bottom_color = strategy.position_size>0 ? color.new(color.green, 100) : strategy.position_size<0 ? color.new(color.red, 100) : na,  title = "Positive area")
fill(rocPlot, midLinePlot, 0,  -40,  top_color = strategy.position_size<0 ? color.new(color.red, 100) : strategy.position_size>0 ? color.new(color.green, 100) : na, bottom_color = strategy.position_size<0 ? color.new(color.red, 0) : strategy.position_size>0 ? color.new(color.green, 0) : na, title = "Negative area")