Adaptive Moving Average Strategi Kuantitatif

Penulis:ChaoZhang, Tanggal: 2023-11-17 17:14:36
Tag:

Gambaran umum

Strategi ini didasarkan pada rata-rata bergerak, dapat menyesuaikan parameter secara otomatis, dan cocok untuk pasar bergelombang pada kerangka waktu yang tinggi.

Logika Strategi

Strategi ini menggunakan rata-rata bergerak adaptif sebagai sinyal perdagangan. Pertama-tama menghitung rata-rata bergerak sederhana (CMA) dari periode yang ditentukan (mulai). Kemudian menguji parameter CMA di sekitar periode, menilai kombinasi mana yang memiliki sentuhan paling sedikit oleh tubuh lilin dan lilin. Akhirnya menggunakan CMA dengan sentuhan paling sedikit sebagai garis sinyal.

Secara khusus, strategi menguji CMA dengan periode ditambah 1 (CMA_P1) dan dikurangi 1 (CMA_M1), menghitung jumlah sentuhan oleh tubuh dan wick. Jika CMA memiliki lebih sedikit sentuhan daripada CMA_P1 dan CMA_M1, maka simpan periode saat ini; jika CMA_P1 memiliki lebih sedikit sentuhan, maka tingkatkan periode sebesar 1; jika CMA_M1 memiliki lebih sedikit sentuhan, maka kurangi periode sebesar 1. Ini menemukan CMA yang relatif halus sebagai garis sinyal.

Ketika harga menembus CMA ke atas, sinyal beli dihasilkan; ketika harga menembus CMA ke bawah, sinyal jual dihasilkan.

Analisis Keuntungan

Strategi rata-rata bergerak adaptif ini memiliki keuntungan berikut:

  1. Tidak perlu secara manual memilih periode rata-rata bergerak, strategi akan menguji periode yang berbeda dan menemukan yang optimal.

  2. Mengurangi sinyal palsu. Dibandingkan dengan MA periode tetap, MA adaptif dapat menyaring lebih banyak suara dan mengurangi banyak sinyal palsu.

  3. Beradaptasi dengan perubahan pasar. Ketika pasar beralih dari rentang terikat ke tren, periode MA akan secara otomatis meningkat untuk menghasilkan sinyal; ketika pasar beralih dari tren ke rentang terikat, periode MA akan secara otomatis berkurang. Jadi strategi dapat secara dinamis beradaptasi dengan perubahan pasar.

  4. Mempermudah sistem perdagangan. Metode adaptif ini dapat menyederhanakan seluruh sistem perdagangan tanpa pengoptimalan parameter manual.

  5. Konsep ini dapat diterapkan pada indikator lain seperti adaptif Bollinger Bands, adaptif KD dll.

Analisis Risiko

Ada juga beberapa risiko yang harus diperhatikan untuk strategi ini:

  1. Risiko opsi panggilan. Ketika pasar memiliki pola opsi panggilan, tubuh lilin mungkin gagal untuk memecahkan garis MA, sehingga sinyal yang salah. Kondisi filter perlu ditambahkan untuk mengurangi risiko tersebut.

  2. Risiko kegagalan. Pelanggaran MA tidak selalu berlanjut, beberapa kegagalan mungkin terjadi. Validasi kegagalan diperlukan untuk memastikan tingkat keberhasilan yang tinggi.

  3. Risiko pembalikan tren. Pembalikan tren setelah memasuki tren perlu beralih tepat waktu, jika tidak dapat menyebabkan kerugian. Stop loss harus diatur untuk mengendalikan kerugian.

  4. Risiko pengoptimalan parameter. Parameter yang disesuaikan dapat jatuh ke dalam pengoptimalan lokal, menghasilkan MA yang berlebihan. Metode evaluasi model perlu diperkenalkan untuk menghindari masalah ini.

  5. Risiko overfitting. Penyesuaian parameter yang berlebihan dapat menyebabkan overfitting dan kehilangan kemampuan generalisasi model. Verifikasi berkepanjangan dalam lingkungan pasar yang berbeda diperlukan, bukan hanya mengandalkan hasil backtest.

Arah Peningkatan

Beberapa arah untuk meningkatkan strategi MA adaptif ini:

  1. Tambahkan validasi trend breakout melalui breakout berturut-turut untuk menyaring breakout palsu.

  2. Meningkatkan strategi stop loss, stop loss ketika harga bergerak kembali ke sisi lain dari MA.

  3. Tambahkan pilihan filter untuk menghindari sinyal yang salah ketika opsi panggilan muncul.

  4. Memperkenalkan metrik evaluasi seperti IC, LIC, SIC dll untuk membatasi penyesuaian parameter dan mencegah overfitting.

  5. Perluasan ke indikator lain seperti strategi golden cross adaptif, adaptif Bollinger Bands dll.

  6. Mengoptimalkan perhitungan MA dengan menggunakan MA tertimbang, MA eksponensial dll untuk mendapatkan MA yang lebih halus.

Ringkasan

Strategi ini menghasilkan sinyal perdagangan dengan menyesuaikan periode MA secara adaptif untuk menemukan parameter optimal. Dibandingkan dengan parameter tetap, strategi ini dapat mengurangi banyak sinyal palsu dan beradaptasi dengan perubahan pasar.

[/trans]


/*backtest
start: 2022-11-10 00:00:00
end: 2023-11-16 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/
// © fondDealer96636

//@version=5

strategy('Automatic Moving Average', overlay=true, max_bars_back=201, pyramiding=0, currency=currency.USD, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000)

// input
start = 20
lookback = input(20, "Sensitivity", tooltip="Low (High Sensitivity), High (Low Sensitivity).\n\nAdjust according to timeframe and asset.")
smoothing = input(3, "Smoothing")
source = input(close, "Source")
startYear = input(2020, "Start year")
resp = 1

in_date_range = time >= timestamp(syminfo.timezone, startYear, 1, 1, 0, 0)

// global
var ix = -1
var mal = array.new_int(0)


// functions
avg(source, len) =>
    sum = 0.0
    for i = 0 to len-1
        sum += source[i]
    sum/len

bull = close > open

wick_touch(x) =>
    bull ? ((close <= x and x <= high) or (low <= x and x <= open)) : ((open <= x and x <= high) or (low <= x and x <= close))

body_touch(x) =>
    bull ? (open < x and x < close) : (close < x and x < open)

touches(t) =>
    touches = 0
    for i = 0 to lookback-1
        touches += t[i] ? 1 : 0
    touches


// local
ix := ix+1
prev_mal = ix >= 1 ? array.get(mal, ix-1) : start

cma = avg(source, prev_mal)
cma_p1 = avg(source, prev_mal+1)
cma_m1 = avg(source, prev_mal-1)

d = touches(wick_touch(cma))
d_p1 = touches(wick_touch(cma_p1))
d_m1 = touches(wick_touch(cma_m1))

d_b = touches(body_touch(cma))
d_p1_b = touches(body_touch(cma_p1))
d_m1_b = touches(body_touch(cma_m1))

any_body_touch = d_b > 0 or d_p1_b > 0 or d_m1_b > 0
no_wick_touch = d <= 0 and d_p1 <= 0 and d_m1 <= 0
wick_maximized = d >= d_p1 and d >= d_m1 ? prev_mal : (d_p1 >= d and d_p1 >= d_m1 ? prev_mal+resp : (d_m1 >= d and d_m1 >= d_p1 ? prev_mal-resp : na))

up = cma > cma[1]
down = cma < cma[1]
against_trend = (up and close < cma) or (down and close > cma)

new_mal = no_wick_touch or against_trend ? prev_mal-resp : (any_body_touch ? prev_mal+resp : wick_maximized)
next_mal = na(new_mal) ? prev_mal : new_mal

array.push(mal, next_mal < 2 ? 2 : (next_mal > 200 ? 200 : next_mal))


// graph
scma = ta.ema(cma, smoothing)

uptrend = scma > scma[1]
downtrend = scma < scma[1]

plot(scma, "Automatic MA", color=uptrend ? color.green : color.red)

uptrending = close > scma and uptrend
downtrending = close < scma and downtrend

defy = not uptrending and not downtrending
defy_cross = defy and body_touch(scma)

barcolor(uptrending ? color.lime : (downtrending ? color.red : (defy_cross ? color.black : color.white)))


// strategy
change_to_uptrend = uptrending and downtrend[1]
change_to_downtrend = downtrending and uptrend[1]

long = in_date_range and change_to_uptrend
short = in_date_range and change_to_downtrend

if long
    strategy.entry("Long", strategy.long)
if short
    strategy.entry("Short", strategy.short)


Lebih banyak