Strategi Perdagangan Kuantitatif Berbilang Faktor

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

img

Ringkasan

Ini adalah strategi perdagangan kuantitatif yang menggabungkan beberapa penunjuk teknikal. Ia menggabungkan purata bergerak, MACD, Bollinger Bands, RSI dan penunjuk lain untuk melaksanakan model perdagangan automatik yang didorong oleh pelbagai faktor.

Logika Strategi

Isyarat perdagangan strategi ini datang dari bahagian berikut:

  1. Salib emas dan salib kematian purata bergerak berganda
  2. Persalinan garis sifar MACD
  3. Bollinger Bands pembalikan rel atas dan bawah
  4. RSI overbought dan oversold reversals

Apabila penunjuk di atas secara serentak mengeluarkan isyarat beli atau jual, strategi akan membuat keputusan panjang atau pendek yang sepadan.

Khususnya, apabila purata bergerak cepat melintasi yang perlahan, histogram MACD mula meningkat, RSI melompat dari zon oversold, dan harga mendekati rel bawah Bollinger Bands, ia dianggap sebagai isyarat pembalikan trend untuk masuk panjang.

Dan apabila MA cepat melintasi di bawah MA perlahan, histogram MACD mula menurun, RSI jatuh dari kawasan overbought, dan harga mencapai Bollinger Bands atas, ia dianggap sebagai pembalikan atas jangka pendek untuk kemasukan pendek.

Dengan menggabungkan isyarat dari pelbagai penunjuk, isyarat palsu boleh ditapis dengan berkesan dan kestabilan strategi dapat ditingkatkan.

Analisis Kelebihan

Kelebihan terbesar strategi ini ialah ia menggunakan model perdagangan pelbagai faktor, yang meningkatkan kebolehpercayaan isyarat, kestabilan dan keuntungan strategi.

  1. Model pelbagai faktor dapat mengesahkan isyarat perdagangan antara satu sama lain dan mengurangkan gangguan dari isyarat palsu dengan berkesan.

  2. Penunjuk dari kategori yang berbeza dapat menangkap ciri-ciri pergerakan pasaran yang lebih komprehensif dan membuat penilaian yang lebih tepat.

  3. Gabungan beberapa penunjuk boleh meratakan turun naik dari individu dan memastikan pulangan yang lebih stabil.

  4. Penunjuk dan berat mereka dalam gabungan boleh disesuaikan dengan fleksibel untuk menyesuaikan strategi untuk keadaan pasaran yang berbeza.

Analisis Risiko

Beberapa risiko strategi ini harus dibincangkan:

  1. Gabungan pelbagai penunjuk yang kompleks memerlukan penyesuaian parameter dan ujian yang tepat, jika tidak, ia boleh menghasilkan isyarat yang tidak sah.

  2. Prestasi pada satu produk mungkin tidak cukup stabil. portfolio yang terdiri daripada produk yang sesuai harus dibina untuk mempelbagaikan risiko.

  3. Ukuran kedudukan dan mekanisme stop loss harus dikawal dengan ketat untuk mengehadkan kerugian di bawah keadaan pasaran yang melampau.

Arahan pengoptimuman

Beberapa arah strategi ini boleh dioptimumkan:

  1. Uji gabungan lebih banyak penunjuk untuk mengetahui parameter optimum, seperti turun naik tersirat, jumlah dll.

  2. Menggunakan kaedah pembelajaran mesin untuk menghasilkan kombinasi indikator dan set parameter yang optimum secara automatik.

  3. Lakukan lebih banyak backtest dan pengoptimuman dalam jangka masa yang lebih lama, sesuaikan berat sesuai untuk peringkat pasaran yang berbeza.

  4. Menggabungkan alat pengurusan risiko untuk mengawal kerugian pada perdagangan tunggal dan kedudukan keseluruhan dengan ketat.

Kesimpulan

Strategi ini memanfaatkan sepenuhnya kelebihan penunjuk teknikal yang berbeza dan membentuk model pelbagai faktor, yang meningkatkan ketepatan isyarat dengan berkesan. Sementara itu, kawalan risiko, penyesuaian parameter dan kemas kini strategi juga penting untuk terus meningkatkan kestabilan dan keuntungan.


/*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 lanjut