Strategi kuantitatif purata bergerak yang bersesuaian

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

Ringkasan

Strategi ini berdasarkan purata bergerak, boleh menyesuaikan parameter secara automatik, dan sesuai untuk pasaran bergelombang pada jangka masa yang tinggi.

Logika Strategi

Strategi ini menggunakan purata bergerak adaptif sebagai isyarat dagangan. Pertama ia mengira purata bergerak mudah (CMA) dari tempoh yang ditentukan (awal). Kemudian ia menguji parameter CMA di sekitar tempoh itu, menilai kombinasi mana yang mempunyai sentuhan yang paling sedikit oleh badan lilin dan wick. Akhirnya ia menggunakan CMA dengan sentuhan yang paling sedikit sebagai garis isyarat.

Secara khusus, strategi menguji CMA dengan tempoh tambah 1 (CMA_P1) dan tolak 1 (CMA_M1), mengira bilangan sentuhan mengikut badan dan wick. Jika CMA mempunyai lebih sedikit sentuhan daripada CMA_P1 dan CMA_M1, maka simpan tempoh semasa; jika CMA_P1 mempunyai lebih sedikit sentuhan, maka meningkatkan tempoh sebanyak 1; jika CMA_M1 mempunyai lebih sedikit sentuhan, maka kurangkan tempoh sebanyak 1. Ini mencari CMA yang agak lancar sebagai garis isyarat.

Apabila harga menembusi CMA ke atas, isyarat beli dihasilkan; apabila harga menembusi CMA ke bawah, isyarat jual dihasilkan.

Analisis Kelebihan

Strategi purata bergerak adaptif ini mempunyai kelebihan berikut:

  1. Secara automatik mencari parameter optimum. Tidak perlu memilih secara manual tempoh purata bergerak, strategi akan menguji tempoh yang berbeza dan mencari optimum.

  2. Mengurangkan isyarat palsu. Berbanding dengan MA tempoh tetap, MA adaptif boleh menapis lebih banyak bunyi bising dan mengurangkan banyak isyarat palsu.

  3. Sesuaikan dengan perubahan pasaran. Apabila pasaran beralih dari julat ke trend, tempoh MA akan secara automatik meningkat untuk menjana isyarat; apabila pasaran beralih dari trend ke julat, tempoh MA akan secara automatik berkurangan. Jadi strategi dapat menyesuaikan diri secara dinamik dengan perubahan pasaran.

  4. Mempermudah sistem perdagangan. Kaedah adaptif ini boleh mempermudah keseluruhan sistem perdagangan tanpa pengoptimuman parameter manual.

  5. Skalability yang baik. Konsep ini boleh digunakan untuk penunjuk lain seperti adaptif Bollinger Bands, adaptif KD dan lain-lain

Analisis Risiko

Terdapat juga beberapa risiko yang perlu diperhatikan untuk strategi ini:

  1. Risiko pilihan panggilan. Apabila pasaran mempunyai corak pilihan panggilan, badan lilin mungkin gagal memecahkan garis MA, mengakibatkan isyarat yang salah. Syarat penapis perlu ditambah untuk mengurangkan risiko tersebut.

  2. Risiko keputusasaan. Keputusasaan MA tidak selalu berlanjutan, beberapa keputusasaan yang gagal mungkin berlaku. Pengesahan keputusasaan diperlukan untuk memastikan kadar kejayaan yang tinggi.

  3. Risiko pembalikan trend. Pembalikan trend selepas memasuki trend perlu ditukar tepat pada masanya, jika tidak ia boleh menyebabkan kerugian. Stop loss harus ditetapkan untuk mengawal kerugian.

  4. Risiko pengoptimuman parameter. Parameter yang disesuaikan dapat jatuh ke dalam pengoptimuman tempatan, mengakibatkan MA yang berlebihan. Kaedah penilaian model perlu diperkenalkan untuk mengelakkan masalah ini.

  5. Risiko overfit. Penyesuaian parameter yang berlebihan boleh menyebabkan overfit dan kehilangan keupayaan generalisasi model. Pengesahan berpanjangan dalam persekitaran pasaran yang berbeza diperlukan, bukan hanya bergantung pada hasil backtest.

Arahan Penambahbaikan

Beberapa arah untuk meningkatkan strategi MA adaptif ini:

  1. Tambah pengesahan penembusan trend melalui penembusan berturut-turut untuk menapis penembusan palsu.

  2. Tingkatkan strategi stop loss, stop loss apabila harga bergerak kembali ke sisi lain MA.

  3. Tambah pilihan penapis untuk mengelakkan isyarat yang salah apabila pilihan panggilan muncul.

  4. Memperkenalkan metrik penilaian seperti IC, LIC, SIC dan lain-lain untuk mengehadkan penyesuaian parameter dan mengelakkan overfitting.

  5. Memperluas kepada penunjuk lain seperti strategi salib emas adaptif, Bollinger Band adaptif dan lain-lain.

  6. Mengoptimumkan pengiraan MA dengan menggunakan MA yang ditimbang, MA eksponensial dan lain-lain untuk mendapatkan MA yang lebih lancar.

Ringkasan

Strategi ini menghasilkan isyarat perdagangan dengan menyesuaikan tempoh MA secara adaptif untuk mencari parameter optimum. Berbanding dengan parameter tetap, ia dapat mengurangkan banyak isyarat palsu dan menyesuaikan diri dengan perubahan pasaran. Tetapi kita juga perlu berhati-hati terhadap risiko yang berpotensi, dan melakukan pengesahan dan pengoptimuman berjalan sebelum menerapkannya dalam perdagangan langsung untuk keuntungan yang stabil.

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