Strategi multi-faktor


Tanggal Pembuatan: 2023-10-31 15:45:39 Akhirnya memodifikasi: 2023-10-31 15:45:39
menyalin: 0 Jumlah klik: 709
1
fokus pada
1617
Pengikut

Strategi multi-faktor

Ringkasan

Strategi multi-faktor menggabungkan tiga jenis strategi yang berbeda, yaitu strategi getaran, strategi trend tracking, dan strategi terobosan, untuk mendapatkan efek strategi yang lebih baik dengan menggunakan kombinasi.

Prinsip Strategi

Strategi multifaktor bermodulasi pada beberapa aspek utama:

  • Strategi getaran sebagian menggunakan indikator acak untuk menilai waktu beli dan jual. Secara khusus, sinyal beli dihasilkan ketika indikator acak% K melewati% D dari zona oversold; sinyal jual dihasilkan ketika% K melewati% D dari zona oversold.

  • Strategi tren sebagian menggunakan silang emas dari garis rata-rata SMA untuk menentukan arah tren. Ketika garis cepat melewati garis lambat dari bawah, sinyal beli dihasilkan; Ketika garis cepat melewati garis lambat dari atas, sinyal jual dihasilkan.

  • Bagian strategi penembusan memantau apakah harga telah menembus harga tertinggi atau terendah dalam periode yang ditentukan. Beli ketika harga melebihi harga tertinggi; jual ketika harga di bawah harga terendah.

  • Perdagangan tren hanya dilakukan ketika tren cukup kuat, dan ini dikombinasikan dengan indikator ADX untuk menilai kekuatan tren.

  • Membangun garis stop loss dan garis stop loss, dan menetapkan rasio stop loss yang wajar.

Strategi multi-faktor, yang mengintegrasikan beberapa bagian ini, mengikuti logika berikut:

  1. Ketika ADX lebih besar dari batas yang ditetapkan, dianggap bahwa tren cukup kuat, maka mulailah melakukan strategi tren; ketika ADX lebih kecil dari batas, dianggap berada di penataan, maka hanya melakukan strategi goyangan.

  2. Dalam situasi tren, ketika SMA cepat lambat garis emas melintasi membeli posisi terbuka, ketika dead fork posisi kosong.

  3. Dalam situasi yang bergejolak, sinyal perdagangan dari indikator acak dijalankan.

  4. Strategi terobosan dapat diterapkan di kedua lingkungan pasar untuk melacak saluran.

  5. Setting Stop Loss Stop Line Optimalkan Keuntungan

Analisis Keunggulan

Keuntungan terbesar dari strategi multi-faktor adalah kombinasi dari berbagai jenis strategi yang dapat memberikan hasil yang lebih baik dalam kedua jenis pasar. Secara khusus, strategi multi-faktor memiliki keuntungan sebagai berikut:

  1. Untuk mendapatkan hasil yang lebih baik dalam situasi yang sedang tren, Anda harus mengikuti tren.

  2. Mereka bisa mengambil keuntungan dari situasi yang tidak stabil dan tidak terjebak dalam posisi.

  3. Dengan faktor keuntungan yang tinggi, pengaturan stop loss adalah wajar.

  4. Untuk mengurangi kerugian, pertimbangkan intensitas tren.

  5. Dalam kombinasi dengan beberapa indikator, sinyal perdagangan yang lebih kuat dapat dibentuk.

  6. Kombinasi parameter yang lebih baik dapat diperoleh dengan mengoptimalkan parameter.

Analisis risiko

Strategi multi-faktor juga memiliki beberapa risiko, yang meliputi:

  1. Kombinasi multifaktor yang tidak tepat dapat menyebabkan sinyal perdagangan yang berantakan, yang memerlukan pengujian berulang untuk menemukan kombinasi faktor optimal.

  2. Ada beberapa parameter yang perlu dioptimalkan, yang sulit untuk dioptimalkan, dan membutuhkan dukungan data historis yang cukup.

  3. Jika tidak bisa menghentikan posisi dengan tepat waktu, maka akan mengakibatkan kerugian yang lebih besar.

  4. Indeks ADX terbelakang, mungkin melewatkan titik balik tren.

  5. Penembusan perdagangan mudah diblokir dan perlu strategi stop loss yang masuk akal.

Ada beberapa cara untuk mengoptimalkan risiko yang disebutkan di atas:

  1. Uji stabilitas dari berbagai faktor dalam data historis, pilih faktor stabilitas.

  2. Metode optimasi cerdas seperti algoritma genetik untuk mencari parameter optimal.

  3. Tetapkan batas stop loss yang wajar untuk mengontrol penarikan maksimum.

  4. Dengan adanya indikator-indikator tambahan, kita bisa melihat bahwa trend telah berbalik.

  5. Optimalkan strategi stop loss untuk melakukan penembusan, menghindari kerugian yang terlalu besar.

Arah optimasi

Strategi multi-faktor memiliki ruang untuk optimasi lebih lanjut:

  1. Uji lebih banyak jenis faktor untuk menemukan kombinasi yang lebih baik. Faktor lain seperti volatilitas, volume transaksi, dan lain-lain dapat dipertimbangkan.

  2. Menggunakan metode pembelajaran mesin untuk menemukan strategi optimal.

Optimasi parameter dapat dilakukan dengan menggunakan algoritma cerdas, dengan cepat mencari optimasi.

  1. Dapat menguji hasil dari berbagai periode kepemilikan.

  2. Anda dapat mempertimbangkan untuk menyesuaikan Stop Loss Line secara dinamis.

  3. Dapat diperkenalkan lebih banyak kondisi penyaringan, seperti peningkatan lalu lintas, untuk meningkatkan kualitas sinyal.

  4. Indikator ADX dapat mempertimbangkan parameter optimasi atau diganti dengan indikator penilaian tren yang lebih canggih.

Meringkaskan

Kompleks strategi multifaktor mempertimbangkan beberapa logika perdagangan seperti tren, getaran, dan terobosan, dan dapat memperoleh hasil yang lebih baik di kedua lingkungan pasar. Dibandingkan dengan strategi tunggal, strategi multifaktor dapat memperoleh keuntungan yang lebih tinggi dan stabil, dengan ruang untuk peningkatan yang baik. Namun perlu diperhatikan bahwa kesulitan pengoptimalan parameter lebih besar, dan diperlukan data sejarah yang cukup untuk mendukung proses pengoptimalan.

Kode Sumber Strategi
/*backtest
start: 2023-09-30 00:00:00
end: 2023-10-30 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

// strategy("Strategy_1", shorttitle="Strategy1",overlay=true ,pyramiding = 12, initial_capital=25000, currency='EUR', commission_type = strategy.commission.cash_per_order, commission_value = 3, default_qty_type = strategy.percent_of_equity, default_qty_value = 20)
	
// Revision:        1
// Author:          Jonas

// === INPUT ===
    //   > BACKTEST RANGE <
FromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
FromDay = input(defval=1, title="From Day", minval=1, maxval=31)
FromYear = input(defval=2017, title="From Year", minval=2010)
ToMonth = input(defval=1, title="To Month", minval=1, maxval=12)
ToDay = input(defval=1, title="To Day", minval=1, maxval=31)
ToYear = input(defval=9999, title="To Year", minval=2010)

    //   > STRATEGY SETTINGS <
bolOS = input(defval = false, type=input.bool, title="Oscillating Strategy")
bolTS = input(defval = true, type=input.bool, title="Trend Strategy")
bolBO = input(defval = false, type=input.bool, title="Breakout Strategy")

strStrategy = input(defval = "Long", type=input.string, title="Trade Strategy",options = ["Long", "Short","Long & Short"])

flStopLoss = input(defval = 2.0, title="Stop Loss %", type=input.float)/100
flTakeProfit = input(defval = 4.0, title="Take Profit %", type=input.float)/100

    //   > SMA <

fastMA = input(defval=8, type=input.integer, title="FastMA length", minval=1, step=1)
slowMA = input(defval=21, type=input.integer, title="SlowMA length", minval=1, step=1)

    //  > ADX <
adx_len = input(defval=10, type=input.integer, title="ADX length", minval=1, step=1)
adx_trend = input(defval=30, type=input.integer, title="ADX Tr", minval=1, step=1)
adx_choppy = adx_trend
adx_limit = adx_trend

    //  > TRENDSCORE <
ts_fromIndex = input(title="From", type=input.integer, minval=1, defval=10)
ts_toIndex = input(title="To", type=input.integer, minval=1, defval=14)
ts_src = input(title="Source", type=input.source, defval=close)

    // > Oscillator <
stoch_length = 14
stoch_OverBought = 75
stoch_OverSold = 25
stoch_smoothK = 3
stoch_smoothD = 3

// === BACK TEST RANGE FUNCTION ===
window_start = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
window_finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)  // backtest finish window
window() =>  // create function "within window of time"
    time >= window_start and time <= window_finish ? true : false

//plot(stop_level_Long, title="TEST",color=color.red, style=plot.style_linebr, linewidth=2)
//plot(take_level_Long, color=color.green, style=plot.style_linebr, linewidth=2)

// === ADX ===
adx_up = change(high)
adx_down = -change(low)
adx_trur = rma(tr, adx_len)
adx_plus = fixnan(100 * rma(adx_up > adx_down and adx_up > 0 ? adx_up : 0, adx_len) / adx_trur)
adx_minus = fixnan(100 * rma(adx_down > adx_up and adx_down > 0 ? adx_down : 0, adx_len) / adx_trur)
adx_sum = adx_plus + adx_minus

ADX = 100 * rma(abs(adx_plus - adx_minus) / (adx_sum == 0 ? 1 : adx_sum), adx_len)

//=== TRENDSCORE ===
trendscore(ts_src, ts_fromIndex, ts_toIndex) =>
	ts_sum = 0.0
	for i = ts_fromIndex to ts_toIndex
        ts_sum := ts_sum + (ts_src >= nz(ts_src[i]) ? 1 : -1)
    ts_sum

intTS = trendscore(ts_src, ts_fromIndex, ts_toIndex)
// Long if  TrendDirection = 1, Short if TrendDirection = -1; Indifferent if TrendDirection = 0
intTrendDirection = (intTS > (ts_toIndex-ts_fromIndex)) ? 1 : (intTS < (ts_fromIndex-ts_toIndex)) ? -1 : 0

    //  > TREND CONDITION <
adx_growing = ADX > highest(ADX[1],3)
intTrend = ((ADX >= adx_limit) and (ADX[1] >= adx_limit) and adx_growing) ? intTrendDirection : 0

// === ATR ===
ATR = sma(tr,10)
ATR_100 = ATR /abs(high - low)


// === STOCHASTICS ===

stoch_k = sma(stoch(close, high, low, stoch_length), stoch_smoothK)
stoch_d = sma(stoch_k, stoch_smoothD)

// === FILTER & CONDITIONS ===
    //  > STOCHASTICS <
bolFilter_OS1 = close[1] > hl2[1]



bolSigOsc_long_1 = (na(stoch_k) or na(stoch_d)) ? false : (crossover(stoch_d,stoch_OverSold) and stoch_k > stoch_d) ? true:false
bolSigOsc_short_1 = (na(stoch_k) or na(stoch_d)) ? false : (crossunder(stoch_d,stoch_OverBought) and stoch_k < stoch_d) ? true:false

bolLongOpenOS = bolSigOsc_long_1 and bolFilter_OS1
bolLongCloseOS = bolSigOsc_short_1

bolShortOpenOS = bolSigOsc_short_1 and bolFilter_OS1
bolShortCloseOS = bolSigOsc_long_1

    //  > TREND <

bolFilter_TS1 = close[1] > hl2[1] and open[1] < hl2[1]
bolFilter_TS2 = sma(close,50)>sma(close,50)[10]
bolFilter_TS3 = close[1] < hl2[1] and open[1] > hl2[1]

bolSigTrendLO1 = sma(close, fastMA) > sma(close, slowMA)
bolSigTrendLO2 = close > sma(close,fastMA)
bolSigTrendLO3 = bolSigTrendLO1 and bolSigTrendLO2

bolSigTrendLC1 = sma(close, fastMA) < sma(close, slowMA)
bolSigTrendLC2 = close < sma(close, fastMA)
bolSigTrendLC3 = bolSigTrendLC1 and bolSigTrendLC2

bolSigTrendSO1 = bolSigTrendLC3
bolSigTrendSC1 = bolSigTrendLO1

bolLongOpenTS = bolSigTrendLO3 and bolFilter_TS1
bolLongCloseTS = bolSigTrendLC3 and bolFilter_TS3

bolShortOpenTS = bolSigTrendSO1 and bolFilter_TS3
bolShortCloseTS = bolLongOpenTS and bolFilter_TS1

plot(sma(close, fastMA), title='FastMA', color=color.green, linewidth=2, style=plot.style_line)  // plot FastMA
plot(sma(close, slowMA), title='SlowMA', color=color.red, linewidth=2, style=plot.style_line)  // plot SlowMA



    //  > BREAKOUT <
flFilter_BS1 = 0.5 * stdev(close,slowMA)[1]
bolFilter_BS2 = volume > sma(volume,slowMA)*1.25

bolSigBreakoutLO1 = close > (highestbars(high,slowMA)[1] + flFilter_BS1)
bolSigBreakoutLC1 = barssince(bolSigBreakoutLO1)==5

bolSigBreakoutSO1 = close < lowestbars(low,slowMA)[1] - flFilter_BS1
bolSigBreakoutSC1 = barssince(bolSigBreakoutSO1)==5


bolLongOpenBO = bolSigBreakoutLO1 and bolFilter_BS2
bolLongCloseBO = bolSigBreakoutLC1

bolShortOpenBO = bolSigBreakoutSO1 and bolFilter_BS2
bolShortCloseBO = bolSigBreakoutSC1

//=== STRATEGIES ENTRIES & EXITS ===
    //  > STOPS & LIMITS <
stop_level_Long = strategy.position_avg_price * (1 - flStopLoss)
take_level_Long = strategy.position_avg_price * (1 + flTakeProfit)
stop_level_Short = strategy.position_avg_price * (1 + flStopLoss)
take_level_Short = strategy.position_avg_price * (1 - flTakeProfit)

    //  > ENTRIES / CLOSES / EXITS <
if window() //only in backtest-window
    if (bolOS == true)
        if (intTrend == 0)
            if(strStrategy == "Long" or strStrategy == "Long & Short")
                strategy.entry("Lng Osc", strategy.long, when=bolLongOpenOS)  // buy long when "within window of time" AND crossover
            if(strStrategy == "Short" or strStrategy == "Long & Short")
                strategy.entry("Short Osc", strategy.short, when=bolShortOpenOS)
        strategy.close("Lng Osc", when=(bolLongCloseOS))
        //strategy.exit("Exit L OS/STD", "Lng Osc", stop = strategy.position_avg_price - 2*stdev(close,10))
        strategy.exit("Exit L OS/%", "Lng Osc", stop=stop_level_Long)
        strategy.close("Short Osc", when=(bolShortCloseOS))
        //strategy.exit("Exit S OS/STD", "Short Osc", stop = strategy.position_avg_price + 2*stdev(strategy.position_avg_price,10))
        strategy.exit("Exit S OS/%", "Short Osc", stop=stop_level_Short)
    if (bolTS == true)
        if (not(intTrend == 0))
            if((strStrategy == "Long") or (strStrategy == "Long & Short"))
                strategy.entry("Lng TD", strategy.long, when=bolLongOpenTS)  // buy long when "within window of time" AND crossover
            if((strStrategy == "Short") or (strStrategy == "Long & Short"))
                strategy.entry("Short TD", strategy.short, when=(bolShortOpenTS and bolTS))  // buy long when "within window of time" AND crossover
        strategy.exit("Exit L TD", "Lng TD", stop=stop_level_Long)
        strategy.close("Lng TD", when=bolLongCloseTS)
        strategy.exit("Exit S TD", "Short TD", stop=stop_level_Short)
        strategy.close("Short TD", when=bolShortCloseTS)
    if (bolBO == true)
        if((strStrategy == "Long") or (strStrategy == "Long & Short"))
            strategy.entry("Lng BO", strategy.long, when=bolLongOpenBO)  // buy long when "within window of time" AND crossover
            strategy.close("Lng BO", when=bolLongCloseBO)
            //strategy.exit("Exit L BO/STD", "Lng BO", stop = strategy.position_avg_price - 2*stdev(strategy.position_avg_price,10))
            strategy.exit("Exit L BO/2.5%", "Lng BO", stop=stop_level_Long)
        if((strStrategy == "Short") or (strStrategy == "Long & Short"))
            strategy.entry("Short BO", strategy.short, when=bolShortOpenBO)  // buy long when "within window of time" AND crossover
            strategy.close("Short BO", when=bolShortCloseBO)
            //strategy.exit("Exit S BO/STD", "Short BO", stop = strategy.position_avg_price - 2*stdev(strategy.position_avg_price,10))
            strategy.exit("Exit S BO/%", "Short BO", stop=stop_level_Short)