Quantitative Handelsstrategie auf Basis von Voss-Filter und Trendindikator

Schriftsteller:ChaoZhang, Datum: 2023-09-19 16:59:10
Tags:

Übersicht

Diese Strategie kombiniert den Voss Predictive Filter und den Ehlers Instantaneous Trendline-Indikator, um zyklische Wendepunkte auf dem Markt für den quantitativen Handel zu identifizieren. Der Voss-Filter liefert frühe Kauf-/Verkaufssignale, während der Trendline-Indikator die allgemeine Trendrichtung bestimmt, um Irrtümer aus dem Voss-Filter in Trending-Märkten zu vermeiden.

Strategie Logik

Voss-Vorhersagefilter

Der Voss-Filter stammt aus dem Artikel von John F. Ehlers A Peek Into The Future. Seine Berechnung ist wie folgt:

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

Hierbei ist _x1 die Preisdifferenz der 1. Ordnung; _x2 ein Glättungsfaktor; _s1, _s2, _s3 Filterparameter; _f1 der Zyklusparameter; _filt die Filterleistung; _voss die Endleistung.

Der Filter kann als glätteter Filter betrachtet werden, der aktuelle und vergangene Zyklusinformationen hervorhebt, um frühe Signale zu generieren.

Instant Trendline-Indikator

Der Trendlinienindikator wird wie folgt berechnet:

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

Es zeichnet eine Trendlinie in Echtzeit, die eng mit der Kursentwicklung übereinstimmt und die Trendrichtung und -stärke genau bestimmt.

Strategie Logik

Ein Kaufsignal wird erzeugt, wenn der Voss durch das Filterergebnis geht.

Ein Verkaufssignal wird erzeugt, wenn der Voss durch das Filterergebnis hindurchquert.

Handelssignale werden nur akzeptiert, wenn sie durch den Trendlinie-Indikator bestätigt werden.

Vorteile

  • Der Voss-Filter liefert frühe Vorhersagesignale, um zyklische Wendungen zu erfassen
  • Der Trendlinienindikator bestimmt die Trendrichtung genau und vermeidet falsche Signale
  • Die Parameter können für verschiedene Zyklen und Marktumgebungen optimiert werden
  • Zur Risikokontrolle können Stopps hinzugefügt werden

Risiken und Minderung

  • Die Strategie stützt sich auf frühe Signale, die möglicherweise einige Trends übersehen
  • Gegentrendsignale können bei starken Trends auftreten und Verluste verursachen

Die Risiken können verringert werden, indem

  • Optimierungszeitparameter für Instrumentenzyklen
  • Reduzierung der Filterbandbreite zur Verringerung falscher Signale
  • Hinzufügen von Trendfiltern, um Signale gegen starke Trends zu vermeiden
  • Verwendung von Stops zur Kontrolle von Verlusten pro Handel

Möglichkeiten zur Verbesserung

Die Strategie kann verbessert werden, indem

  • Versuche verschiedene Preisquellen wie Schließen, gleitende Durchschnitte usw.
  • Einstellung der Filterperiode für spezifische Instrumentenzyklen
  • Optimierung der Trendindikatorparameter für eine bessere Trenderkennung
  • Versuchung verschiedener Trendindikatoren für bessere Kombinationen
  • Hinzufügen von Stopps, Trailing Stops für eine bessere Risikokontrolle
  • Optimierung der Parameter für die besten Parametermengen

Schlussfolgerung

Diese Strategie kombiniert den Voss-Filter und den Trendindikator, um zyklische Wendungen am Markt effektiv zu identifizieren. Mit optimierten Parametern und Risikokontrollen kann sie ein robustes quantitatives Handelssystem erzeugen. Sie ist weitgehend anwendbar auf Instrumente, die zyklische Muster aufweisen, wie gute Backtest-Ergebnisse belegen. Insgesamt verfügt die Strategie über einzigartige Vorhersagekapazitäten und ein breites Potenzial zur Verbesserung durch mehrdimensionale Optimierung.


/*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()


Mehr