Strategi Perdagangan Kuantitatif Berbagai Faktor

Penulis:ChaoZhang, Tanggal: 2024-01-31 13:55:37
Tag:

img

Gambaran umum

Ini adalah strategi perdagangan kuantitatif yang menggabungkan beberapa indikator teknis. Ini menggabungkan moving average, MACD, Bollinger Bands, RSI dan indikator lainnya untuk menerapkan model perdagangan otomatis yang didorong oleh banyak faktor.

Logika Strategi

Sinyal perdagangan dari strategi ini berasal dari bagian berikut:

  1. Golden Cross dan Death Cross dari rata-rata bergerak ganda
  2. Perpindahan garis nol MACD
  3. Bollinger Bands pembalikan rel atas dan bawah
  4. RSI overbought dan oversold reversals

Ketika indikator di atas secara bersamaan mengeluarkan sinyal beli atau jual, strategi akan membuat keputusan panjang atau pendek yang sesuai.

Secara khusus, ketika rata-rata bergerak cepat melintasi yang lambat, histogram MACD mulai meningkat, RSI bangkit dari zona oversold, dan harga mendekati rel bawah Bollinger Bands, itu dianggap sebagai sinyal pembalikan tren untuk masuk panjang.

Dan ketika MA cepat melintasi di bawah MA lambat, histogram MACD mulai menurun, RSI turun dari area overbought, dan harga mencapai Bollinger Bands atas, itu dianggap sebagai pembalikan atas jangka pendek untuk entri pendek.

Dengan menggabungkan sinyal dari beberapa indikator, sinyal palsu dapat disaring secara efektif dan stabilitas strategi dapat ditingkatkan.

Analisis Keuntungan

Keuntungan terbesar dari strategi ini adalah bahwa ia mengadopsi model multi-faktor untuk perdagangan, yang meningkatkan keandalan sinyal, stabilitas dan profitabilitas strategi.

  1. Model multi-faktor dapat memverifikasi sinyal perdagangan satu sama lain dan mengurangi gangguan dari sinyal palsu secara efektif.

  2. Indikator dari kategori yang berbeda dapat menangkap karakteristik pergerakan pasar yang lebih komprehensif dan membuat penilaian yang lebih akurat.

  3. Kombinasi dari beberapa indikator dapat meratakan fluktuasi dari indikator individu dan memastikan pengembalian yang lebih stabil.

  4. Indikator dan bobotnya dalam kombinasi dapat disesuaikan secara fleksibel untuk menyesuaikan strategi untuk kondisi pasar yang berbeda.

Analisis Risiko

Beberapa risiko dari strategi ini harus diperhatikan:

  1. Kombinasi kompleks dari beberapa indikator membutuhkan pengaturan dan pengujian parameter yang tepat, jika tidak, dapat menghasilkan sinyal yang tidak valid.

  2. Kinerja pada satu produk mungkin tidak cukup stabil. portofolio yang terdiri dari produk yang cocok harus dibangun untuk mendiversifikasi risiko.

  3. Ukuran posisi dan mekanisme stop loss harus dikontrol secara ketat untuk membatasi kerugian dalam kondisi pasar yang ekstrim.

Arahan Optimasi

Beberapa arah strategi ini dapat dioptimalkan:

  1. Uji kombinasi dari lebih banyak indikator untuk mengetahui parameter optimal, seperti volatilitas tersirat, volume dll.

  2. Menggunakan metode pembelajaran mesin untuk secara otomatis menghasilkan kombinasi indikator dan set parameter yang optimal.

  3. Lakukan lebih banyak backtesting dan optimasi pada jangka waktu yang lebih lama, sesuaikan bobot sesuai untuk tahap pasar yang berbeda.

  4. Mengintegrasikan alat manajemen risiko untuk mengontrol kerugian pada perdagangan tunggal dan posisi keseluruhan secara ketat.

Kesimpulan

Strategi ini memanfaatkan sepenuhnya keuntungan dari indikator teknis yang berbeda dan membentuk model multi-faktor, yang meningkatkan akurasi sinyal secara efektif. Sementara itu, pengendalian risiko, penyesuaian parameter dan pembaruan strategi juga sangat penting untuk terus meningkatkan stabilitas dan profitabilitas.


/*backtest
start: 2023-12-31 00:00:00
end: 2024-01-30 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Математическая Торговая Система с Ишимоку, TP/SL, ADX, RSI, OBV", shorttitle="МТС Ишимоку TP/SL ADX RSI OBV", overlay=true)

is_short_enable = input(0, title="Короткие сделки")
is_long_enable = input(1, title="Длинные сделки")

// Входные параметры для скользящих средних
fast_length = input(21, title="Быстрый период")
slow_length = input(26, title="Медленный период")

// Входные параметры для Ишимоку
tenkan_length = input(9, title="Тенкан-сен")
kijun_length = input(26, title="Киджун-сен")
senkou_length = input(52, title="Сенкоу-спан B")

// Входные параметры для ADX
adx_length = input(14, title="ADX период")
adx_level = input(30, title="ADX уровень")

// Входные параметры для RSI
rsi_length = input(14, title="RSI период")
rsi_overbought = input(70, title="RSI перекупленность")
rsi_oversold = input(30, title="RSI перепроданность")

// Входные параметры для OBV
obv_length = input(14, title="OBV период")

// Вычисление скользящих средних
fast_ma = ta.sma(close, fast_length)
slow_ma = ta.sma(close, slow_length)

// Вычисление Ишимоку
tenkan_sen = ta.sma(high + low, tenkan_length) / 2
kijun_sen = ta.sma(high + low, kijun_length) / 2
senkou_span_a = (tenkan_sen + kijun_sen) / 2
senkou_span_b = ta.sma(close, senkou_length)

// Вычисление ADX
[diplus, diminus, adx_value] = ta.dmi(14, adx_length)

// Вычисление RSI
rsi_value = ta.rsi(close, rsi_length)

// Вычисление OBV
f_obv() => ta.cum(math.sign(ta.change(close)) * volume)
f_obv_1() => ta.cum(math.sign(ta.change(close[1])) * volume[1])
f_obv_2() => ta.cum(math.sign(ta.change(close[2])) * volume[2])
f_obv_3() => ta.cum(math.sign(ta.change(close[3])) * volume[3])
obv_value = f_obv()

price_is_up = close[1] > close[3] 
price_crossover_fast_ma = close > fast_ma
fast_ma_is_up = ta.sma(close[1], fast_length) > ta.sma(close[3], fast_length)
rsi_is_trand_up = ta.rsi(close[1], rsi_length) > ta.rsi(close[3], rsi_length)
rsi_is_upper_50 = rsi_value > 50
obv_is_trand_up = f_obv_1() > f_obv_3() and obv_value > ta.sma(obv_value, obv_length)
is_up = price_is_up and price_crossover_fast_ma and fast_ma_is_up and rsi_is_trand_up and rsi_is_upper_50 and obv_is_trand_up

fast_ma_is_down = close < fast_ma
rsi_is_trend_down =  ta.rsi(close[1], rsi_length) < ta.rsi(close[2], rsi_length)
rsi_is_crossover_sma = rsi_value < ta.sma(rsi_value, rsi_length)
obv_is_trend_down =  f_obv_1() < f_obv_2()
obv_is_crossover_sma = obv_value < ta.sma(obv_value, obv_length)
is_down = fast_ma_is_down and rsi_is_trend_down and rsi_is_crossover_sma and obv_is_trend_down and obv_is_crossover_sma

//----------//
// MOMENTUM //
//----------//
ema8 = ta.ema(close, 8)
ema13 = ta.ema(close, 13)
ema21 = ta.ema(close, 21)
ema34 = ta.ema(close, 34)
ema55 = ta.ema(close, 55)

longEmaCondition = ema8 > ema13 and ema13 > ema21 and ema21 > ema34 and ema34 > ema55
exitLongEmaCondition = ema13 < ema55

shortEmaCondition = ema8 < ema13 and ema13 < ema21 and ema21 < ema34 and ema34 < ema55
exitShortEmaCondition = ema13 > ema55

// ----------  //
// OSCILLATORS //
// ----------- //
rsi = ta.rsi(close, 14)
longRsiCondition = rsi < 70 and rsi > 40
exitLongRsiCondition = rsi > 70

shortRsiCondition = rsi > 30 and rsi < 60
exitShortRsiCondition = rsi < 30

// Stochastic
length = 14, smoothK = 3, smoothD = 3
kFast = ta.stoch(close, high, low, 14)
dSlow = ta.sma(kFast, smoothD)

longStochasticCondition = kFast < 80
exitLongStochasticCondition = kFast > 95

shortStochasticCondition = kFast > 20
exitShortStochasticCondition = kFast < 5

// Логика входа и выхода
longCondition = longEmaCondition and longRsiCondition and longStochasticCondition and strategy.position_size == 0
exitLongCondition = (exitLongEmaCondition or exitLongRsiCondition or exitLongStochasticCondition) and strategy.position_size > 0

shortCondition = shortEmaCondition and shortRsiCondition and shortStochasticCondition and strategy.position_size == 0
exitShortCondition = (exitShortEmaCondition or exitShortRsiCondition or exitShortStochasticCondition) and strategy.position_size < 0

enter_long = (ta.crossover(close, senkou_span_a) or is_up) and longCondition
enter_short = (ta.crossunder(close, senkou_span_a) or is_down) and shortCondition

exit_long = ((ta.crossunder(fast_ma, slow_ma) or ta.crossunder(close, senkou_span_b) or enter_short) or exitLongCondition) 
exit_short = ((ta.crossover(fast_ma, slow_ma) or ta.crossover(close, senkou_span_b) or enter_long) or exitShortCondition)

// Выполнение сделок
if is_long_enable == 1
    strategy.entry("Long", strategy.long, when=enter_long)
    strategy.close("Long", when=exit_long)

if is_short_enable == 1
    strategy.entry("Short", strategy.short, when=enter_short)
    strategy.close("Short", when=exit_short)


Lebih banyak