Tingkat Perubahan Strategi Kuantitatif

Penulis:ChaoZhang, Tanggal: 2023-12-12 15:56:56
Tag:

img

Gambaran umum

Strategi ini menggunakan indikator Rate of Change (ROC) untuk menentukan arah pasar dan menghasilkan sinyal perdagangan.

Logika Strategi

Aturan Masuk

  • Pergi panjang jika ROC >0; pergi pendek jika ROC <0. Gunakan positif / negatif ROC untuk menilai arah pasar.
  • Untuk menyaring volatilitas, hanya mengeluarkan sinyal perdagangan jika ROC tetap di sisi yang sama selama dua hari berturut-turut.

Hentikan Kerugian

Stop loss 6% diatur. ketika stop loss dipicu, posisi terbalik. ini menunjukkan kita mungkin berada di sisi yang salah dari pasar jadi kita keluar segera.

Mekanisme Anti-Bubble

Jika ROC naik di atas 200, pasar dianggap gelembung. Ketika ROC jatuh kembali di bawah wilayah gelembung, sinyal pergi pendek dipicu. Membutuhkan gelembung bertahan setidaknya 1 minggu.

Pengelolaan Uang

Menggunakan ukuran posisi tetap + metode inkremental. Meningkatkan / mengurangi posisi sebesar $ 200 untuk setiap $ 400 keuntungan / kerugian. Ini memungkinkan kita untuk keuntungan piramida tetapi juga meningkatkan penarikan.

Analisis Keuntungan

Keuntungan dari strategi ini:

  1. Mematuhi tren mengikuti filosofi sehingga cenderung menghasilkan pengembalian positif jangka panjang.
  2. Gunakan stop loss untuk mengendalikan risiko dan mengurangi volatilitas jangka pendek.
  3. Mekanisme anti-gelembung menghindari mengejar puncak.
  4. Posisi tetap + metode tambahan menciptakan pertumbuhan eksponensial dalam tren naik.

Analisis Risiko

Ada juga beberapa risiko:

  1. Indikator ROC rentan terhadap whipsaws yang menghasilkan sinyal palsu Pertimbangkan untuk menggabungkan dengan indikator lain untuk penyaringan.
  2. Biaya perdagangan tidak dipertimbangkan yang menurunkan pengembalian yang sebenarnya.
  3. Penyesuaian parameter anti-gelembung yang buruk juga kehilangan tren.
  4. Ukuran tambahan meningkatkan penarikan saat kehilangan.

Arahan Optimasi

Beberapa cara untuk mengoptimalkan strategi:

  1. Tambahkan indikator lain ke sinyal filter, seperti MA, Volatilitas dll.
  2. Mengoptimalkan parameter anti-gelembung untuk deteksi gelembung yang lebih baik.
  3. Menyesuaikan posisi tetap dan rasio tambahan untuk keseimbangan risiko / imbalan yang lebih baik.
  4. Tambahkan stop loss otomatis ketika terjadi kerugian besar.
  5. Pertimbangkan biaya perdagangan dan tetapkan aturan masuk sesuai.

Kesimpulan

Secara singkat, ini adalah tren jangka panjang mengikuti strategi yang berpusat di sekitar indikator ROC. Ini bertujuan untuk menghasilkan alfa dengan mengambil risiko yang lebih tinggi. Optimasi lebih lanjut dapat meningkatkan kelangsungan hidupnya. Kuncinya adalah menemukan toleransi risiko yang sesuai.


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


Lebih banyak