Strategi kuantitatif yang menggabungkan pembalikan rata-rata dan trend berikut

Penulis:ChaoZhang, Tanggal: 2023-09-14 20:45:20
Tag:

Artikel ini menjelaskan secara rinci strategi perdagangan kuantitatif yang menggabungkan teknik reversi rata-rata dan tren berikut.

I. Logika Strategi

Strategi ini terutama menggunakan indikator RSI dan Simple Moving Average untuk menghasilkan sinyal perdagangan:

  1. Ketika harga di bawah SMA 200 periode, ia menilai pasar saat ini sebagai tren penurunan.

  2. Ketika RSI di bawah 20, itu mengambil perdagangan reversi rata-rata kontra-tren.

  3. Ketika harga di atas SMA 200 periode, ia menilai pasar saat ini sebagai tren naik.

  4. Ketika harga melintasi SMA, dibutuhkan perdagangan trend-mengikuti.

  5. Keluar dipicu ketika RSI melebihi 80 atau harga turun di bawah SMA dengan persentase tertentu.

  6. Ukuran posisi untuk reversi rata-rata dan trend berikut dapat disesuaikan secara terpisah.

Strategi ini menggabungkan teknik pengembalian rata-rata dan mengikuti tren dan menerapkannya di berbagai tahap pasar.

II. Keuntungan dari Strategi

Keuntungan utama adalah:

  1. Menggabungkan dua teknik meningkatkan kemampuan adaptasi strategi.

  2. Ini dapat menemukan peluang perdagangan di pasar tren dan berkisar.

  3. Risiko dapat dikendalikan dengan menyesuaikan ukuran posisi.

  4. Pengaturan parameter sederhana membuatnya mudah diterapkan.

III. Potensi Risiko

Namun, risikonya adalah:

  1. Indikator seperti SMA dan RSI rentan terhadap kebocoran palsu.

  2. Berganti antara dua mode mungkin terlambat.

  3. Penarikan tertentu harus ditoleransi untuk keuntungan jangka panjang.

IV. Ringkasan

Secara singkat, artikel ini telah menjelaskan strategi kuantitatif yang menggunakan teknik reversi rata-rata dan tren berikut. Ini dapat diperdagangkan di tahap pasar yang berbeda untuk meningkatkan daya adaptasi. Tetapi risiko seperti kegagalan indikator dan penundaan beralih mode perlu dikelola. Secara keseluruhan, ini memberikan pendekatan yang fleksibel untuk menggabungkan teknik yang berbeda.


/*backtest
start: 2022-09-07 00:00:00
end: 2023-04-05 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/
// © I11L

//@version=5
strategy("Mean Reversion and Trendfollowing", overlay=true, pyramiding=1, default_qty_value=100000, initial_capital=100000, default_qty_type=strategy.cash, process_orders_on_close=false, calc_on_every_tick=false)

// Input for the starting date
start_date = input(timestamp("1 Feb 2000 12:00"), title="Starting Date")
enableMeanReversion = input.bool(true)
enableTrendfollowing = input.bool(true)
trendPositionFactor = input.float(1)
meanReversionPositionFactor = input.float(0.5)

// Convert the input string to a timestamp
start_ts = timestamp(year(start_date), month(start_date), dayofmonth(start_date), 0, 0)

// Check if the current bar's time is greater than or equal to the start timestamp
start_condition = time >= start_ts

var tradeOrigin = ""

sma200 = ta.sma(close,200)
rsi2 = ta.rsi(close,2)

isMeanReversionMode = close < sma200 or not(enableTrendfollowing)
isTrendfollowingMode = close > sma200 or not(enableMeanReversion)

isRsiBuy = rsi2 < 20 and enableMeanReversion
isRsiClose = rsi2 > 80 and enableMeanReversion

isSmaBuy = close > sma200 and enableTrendfollowing
isSmaClose = close < sma200 * 0.95 and enableTrendfollowing

isBuy = (isMeanReversionMode and isRsiBuy) or (isTrendfollowingMode and isSmaBuy)

positionSizeFactor = isSmaBuy ? trendPositionFactor : meanReversionPositionFactor

// Only execute the strategy after the starting date
if (start_condition)
    if (isBuy and strategy.opentrades == 0)
        tradeOrigin := isSmaBuy ? "SMA" : "RSI"
        strategy.entry("My Long Entry Id", strategy.long, qty=(strategy.equity / close) * positionSizeFactor, comment=str.tostring(positionSizeFactor))
    isClose = tradeOrigin == "SMA" ? isSmaClose : isRsiClose
    if (isClose)
        strategy.exit("Exit", limit = close)

plot(sma200)
plot(sma200 * 0.95, color=color.orange)

Lebih banyak