Strategi Dagangan Kuantitatif Berdasarkan Penapis Voss dan Penunjuk Trend

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

Ringkasan

Strategi ini menggabungkan penapis ramalan Voss dan penunjuk garis trend segera Ehlers untuk mengenal pasti titik perubahan kitaran di pasaran untuk perdagangan kuantitatif. Penapis Voss memberikan isyarat beli / jual awal, sementara penunjuk trendline menentukan arah trend keseluruhan untuk mengelakkan kesesatan dari penapis Voss di pasaran trend. Strategi ini berfungsi dengan baik pada instrumen seperti Bitcoin yang menunjukkan corak kitaran, seperti yang dibuktikan oleh hasil backtest yang baik.

Logika Strategi

Penapis Ramalan Voss

Penapis 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 perbezaan harga pesanan pertama; _x2 adalah faktor pelinciran; _s1, _s2, _s3 adalah parameter penapis; _f1 adalah parameter kitaran; _filt adalah output penapis; _voss adalah output akhir.

Penapis ini boleh dilihat sebagai penapis yang halus yang menekankan maklumat kitaran semasa dan masa lalu untuk menjana isyarat awal.

Penunjuk Trendline Seketika

Penunjuk trendline dikira sebagai:

_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]) 

Ia memetakan garis trend dalam masa nyata yang sangat sesuai dengan tindakan harga, dengan tepat menentukan arah trend dan kekuatan.

Logika Strategi

Isyarat beli dihasilkan apabila Voss melintasi hasil penapis.

Isyarat jual dihasilkan apabila Voss melintasi hasil penapis.

Isyarat perdagangan hanya diterima jika disahkan oleh penunjuk trendline. Ini mengelakkan isyarat yang salah dari penapis Voss di pasaran trend.

Kelebihan

  • Penapis Voss memberikan isyarat ramalan awal untuk menangkap giliran kitaran
  • Indikator trendline dengan tepat menentukan arah trend, mengelakkan isyarat yang salah
  • Parameter boleh dioptimumkan untuk kitaran dan persekitaran pasaran yang berbeza
  • Stop boleh ditambah untuk mengawal risiko

Risiko dan Pengurangan

  • Strategi bergantung pada isyarat awal, berpotensi terlepas beberapa trend
  • Isyarat kontra-trend boleh berlaku dalam trend yang kuat, menyebabkan kerugian

Risiko boleh dikurangkan dengan:

  • Parameter tempoh pengoptimuman untuk kitaran instrumen
  • Mengurangkan lebar jalur penapis untuk mengurangkan isyarat palsu
  • Menambah penapis trend untuk mengelakkan isyarat terhadap trend yang kuat
  • Menggunakan hentian untuk mengawal kerugian setiap perdagangan

Peluang Peningkatan

Strategi ini boleh ditingkatkan dengan:

  • Mencuba sumber harga yang berbeza seperti dekat, purata bergerak dan lain-lain.
  • Tempoh penyesuaian penapis untuk kitaran instrumen tertentu
  • Mengoptimumkan parameter penunjuk trend untuk pengesanan trend yang lebih baik
  • Mencuba penunjuk trend yang berbeza untuk kombinasi yang lebih baik
  • Menambah berhenti, berhenti untuk kawalan risiko yang lebih baik
  • Pengoptimuman parameter untuk set parameter terbaik

Kesimpulan

Strategi ini menggabungkan penapis Voss dan penunjuk trend untuk mengenal pasti giliran kitaran di pasaran dengan berkesan. Dengan parameter dan kawalan risiko yang dioptimumkan, ia boleh menghasilkan sistem perdagangan kuantitatif yang kukuh. Ia banyak digunakan untuk instrumen yang mempamerkan corak kitaran, seperti yang dibuktikan oleh hasil backtest yang baik. Secara keseluruhan, strategi ini mempunyai keupayaan ramalan yang unik, dan potensi yang luas untuk peningkatan melalui pengoptimuman pelbagai 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 lanjut