Strategi kuantitatif yang menggabungkan pembalikan purata dan trend berikut

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

Artikel ini menerangkan secara terperinci strategi perdagangan kuantitatif yang menggabungkan kedua-dua teknik pembalikan purata dan trend berikut.

I. Logik Strategi

Strategi ini terutamanya menggunakan purata bergerak mudah dan penunjuk RSI untuk menjana isyarat perdagangan:

  1. Apabila harga di bawah SMA 200 tempoh, ia menilai pasaran semasa sebagai trend menurun.

  2. Apabila RSI di bawah 20, ia mengambil perdagangan pembalikan purata kontra-trend.

  3. Apabila harga melebihi SMA 200 tempoh, ia menilai pasaran semasa sebagai trend menaik.

  4. Apabila harga melintasi di atas SMA, ia mengambil perdagangan trend-mengikut.

  5. Keluar dipicu apabila RSI melebihi 80 atau harga jatuh di bawah SMA dengan peratusan tertentu.

  6. Ukuran kedudukan untuk pembalikan purata dan trend berikut boleh diselaraskan secara berasingan.

Strategi ini menggabungkan teknik pembalikan purata dan trend berikut dan menerapkannya di peringkat pasaran yang berbeza.

II. Kelebihan Strategi

Kelebihan utama ialah:

  1. Menggabungkan dua teknik meningkatkan kebolehsesuaian strategi.

  2. Ia boleh mencari peluang perdagangan di pasaran trend dan pelbagai.

  3. Risiko boleh dikawal dengan menyesuaikan saiz kedudukan.

  4. Tetapan parameter mudah menjadikannya mudah dilaksanakan.

III. Risiko yang berpotensi

Walau bagaimanapun, risiko adalah:

  1. Penunjuk seperti SMA dan RSI mudah terdedah kepada pecah palsu.

  2. Peralihan antara dua mod mungkin terlambat.

  3. Pengurangan tertentu perlu ditanggung untuk keuntungan jangka panjang.

IV. Ringkasan

Ringkasnya, artikel ini telah menerangkan strategi kuantitatif menggunakan teknik pembalikan purata dan trend berikut. Ia boleh berdagang di peringkat pasaran yang berbeza untuk meningkatkan daya adaptasi. Tetapi risiko seperti kegagalan penunjuk dan pemindahan mod tertunda perlu diurus. Secara keseluruhan, ia menyediakan pendekatan yang fleksibel untuk menggabungkan teknik yang berbeza.


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