Strategi perdagangan kuantitatif berdasarkan Voss Filter dan Trend Indicator

Penulis:ChaoZhang, Tanggal: 2023-09-19 16:59:10
Tag:

Gambaran umum

Strategi ini menggabungkan Voss Predictive Filter dan Ehlers Instantaneous Trendline indicator untuk mengidentifikasi titik balik siklik di pasar untuk perdagangan kuantitatif. Filter Voss memberikan sinyal beli / jual awal, sementara indikator trendline menentukan arah tren keseluruhan untuk menghindari penyimpangan dari filter Voss di pasar tren. Strategi ini bekerja dengan baik pada instrumen seperti Bitcoin yang menunjukkan pola siklik, seperti yang dibuktikan oleh hasil backtest yang baik.

Logika Strategi

Voss Prediktif Filter

Filter Voss berasal dari artikel John F. Ehlers A Peek Into The Future.

_filt = 0.5 * _s3 * _x1 + _f1 * _s2 * _filt[1] - _s1 * _filt[2] 
_voss = _x2 * _filt - _sumC

Di mana _x1 adalah perbedaan harga urutan pertama; _x2 adalah faktor pelunturan; _s1, _s2, _s3 adalah parameter filter; _f1 adalah parameter siklus; _filt adalah output filter; _voss adalah output akhir.

Filter ini dapat dilihat sebagai filter yang dihaluskan yang menekankan informasi siklus saat ini dan masa lalu untuk menghasilkan sinyal awal.

Indikator Tren Instan

Indikator trendline dihitung sebagai berikut:

_it = (_a-((_a*_a)/4.0))*_src+0.5*_a*_a*_src[1]-(_a-0.75*_a*_a)*_src[2]+2*(1-_a)*nz(_it[1])+-(1-_a)*(1-_a)*nz(_it[2]) 

Ini memetakan garis tren secara real-time yang sangat sesuai dengan aksi harga, secara akurat menentukan arah dan kekuatan tren.

Logika Strategi

Sinyal beli dihasilkan ketika Voss melintasi hasil filter.

Sinyal jual dihasilkan ketika Voss melintasi hasil filter.

Sinyal perdagangan hanya diterima jika dikonfirmasi oleh indikator trendline. Ini menghindari sinyal yang salah dari filter Voss di pasar tren.

Keuntungan

  • Filter Voss memberikan sinyal prediktif awal untuk menangkap giliran siklus
  • Indikator trendline secara akurat menentukan arah tren, menghindari sinyal yang salah
  • Parameter dapat dioptimalkan untuk siklus dan lingkungan pasar yang berbeda
  • Stop dapat ditambahkan untuk mengendalikan risiko

Risiko dan Pengurangan

  • Strategi bergantung pada sinyal awal, berpotensi kehilangan beberapa tren
  • Sinyal kontra-trend dapat terjadi dalam tren yang kuat, menyebabkan kerugian

Risiko dapat dikurangi dengan:

  • Parameter periode optimalisasi untuk siklus instrumen
  • Mengurangi filter bandwidth untuk mengurangi sinyal palsu
  • Menambahkan filter tren untuk menghindari sinyal terhadap tren yang kuat
  • Menggunakan stop untuk mengendalikan kerugian per perdagangan

Peluang Peningkatan

Strategi dapat ditingkatkan dengan:

  • Mencoba sumber harga yang berbeda seperti dekat, rata-rata bergerak dll
  • Periode penyesuaian filter untuk siklus instrumen tertentu
  • Mengoptimalkan parameter indikator tren untuk deteksi tren yang lebih baik
  • Mencoba indikator tren yang berbeda untuk kombinasi yang lebih baik
  • Menambahkan stop, trailing stop untuk kontrol risiko yang lebih baik
  • Optimasi parameter untuk set parameter terbaik

Kesimpulan

Strategi ini menggabungkan filter Voss dan indikator tren untuk secara efektif mengidentifikasi pergantian siklus di pasar. Dengan parameter dan pengendalian risiko yang dioptimalkan, strategi ini dapat menghasilkan sistem perdagangan kuantitatif yang kuat. Strategi ini dapat diterapkan secara luas pada instrumen yang menunjukkan pola siklus, seperti yang dibuktikan oleh hasil backtest yang baik. Secara keseluruhan, strategi ini memiliki kemampuan prediktif yang unik, dan potensi yang luas untuk peningkatan melalui optimasi multi-dimensi.


/*backtest
start: 2023-08-19 00:00:00
end: 2023-09-18 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// A Peek Into the Future
// John F. Ehlers
// TASC Aug 2019

// Created by e2e4mfck for tradingview.com
// Modified by © Bitduke

//@version=4
//strategy("Voss Strategy (Filter + IT)", overlay=false, calc_on_every_tick=false,pyramiding=0, default_qty_type=strategy.cash,default_qty_value=1000, currency=currency.USD, initial_capital=1000,commission_type=strategy.commission.percent, commission_value=0.075)

// voss filter

source = input(close, type = input.source)
period = input(20, type = input.integer)
predict = input(4, type = input.integer)
bandwidth = input(0.25, type = input.float)

// it trendline

src = input(hl2, title="Source IT")
a = input(0.07, title="Alpha", step=0.01) 
fr = input(false, title="Fill Trend Region")
ebc = input(false, title="Enable barcolors")
hr = input(false, title="Hide Ribbon")


voss_filter (_period, _predict, _bandwidth, _source) =>
	float _filt = 0, float _sumC = 0, float _voss = 0
	_PI		= 2 * asin(1)
	_order	= 3 * _predict
	_f1		= cos(2 * _PI / _period)
	_g1		= cos(_bandwidth * 2 * _PI / _period)
	_s1		= 1 / _g1 - sqrt(1 / (_g1 * _g1) - 1)
	_s2		= 1 + _s1
	_s3		= 1 - _s1
	_x1		= _source - _source[2]
	_x2		= (3 + _order) / 2

	for _i = 0 to (_order - 1)
		_sumC := _sumC + ((_i + 1) / _order) * _voss[_order - _i]

	if bar_index <= _order
		_filt := 0		
		_voss := 0		
	else			
		_filt := 0.5 * _s3 * _x1 + _f1 * _s2 * _filt[1] - _s1 * _filt[2]
		_voss := _x2 * _filt - _sumC

	[_voss, _filt]


[Voss, Filt] = voss_filter(period, predict, bandwidth, source)


instantaneous_trendline (_src, _a, _freq, _ebc, _hr) =>
    _it = 0.0
    _it := (_a-((_a*_a)/4.0))*_src+0.5*_a*_a*_src[1]-(_a-0.75*_a*_a)*_src[2]+2*(1-_a )*nz(_it[1], ((_src+2*_src[1]+_src[2])/4.0))-(1-_a)*(1-_a)*nz(_it[2], ((_src+2*_src[1]+_src[2])/4.0))
    _lag = 2.0*_it-nz(_it[2])
    
    [_it, _lag]

[it, lag] = instantaneous_trendline(src, a, fr, ebc, hr)

// - - - - -  - - - - - //

plot(Filt, title = "Filter", style = plot.style_line, color = color.red, linewidth = 2)
plot(Voss, title = "Voss", style = plot.style_line, color = color.blue,	linewidth = 2)
hline(0.0, title = "Zero", linestyle = hline.style_dashed, color = color.black,	linewidth = 1)
plot(hr? na:it, title="IT Trend", color= fr? color.gray : color.red, linewidth=1)
plot(hr? na:lag, title="IT Trigger", color=fr? color.gray : color.blue, linewidth=1)


// Strategy Logic
longCondition =  lag < it  and crossover(Voss,Filt) 
shortCondition = it > lag and crossover(Filt,Voss) 

strategy.entry("Voss_Short", strategy.short, when=shortCondition)
strategy.entry("Voss_Long", strategy.long, when=longCondition)


// === Backtesting Dates === thanks to Trost

testPeriodSwitch = input(true, "Custom Backtesting Dates")
testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, testStartHour, 0)
testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(2, "Backtest Stop Month")
testStopDay = input(29, "Backtest Stop Day")
testStopHour = input(0, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, testStopHour, 0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
testPeriod_1 = testPeriod()
isPeriod = true
// === /END

if not isPeriod
    strategy.cancel_all()
    strategy.close_all()


Lebih banyak