Stratégie de trading quantitative basée sur le filtre Voss et l'indicateur de tendance


Date de création: 2023-09-19 16:59:10 Dernière modification: 2023-09-19 16:59:10
Copier: 2 Nombre de clics: 900
1
Suivre
1617
Abonnés

Aperçu

La stratégie utilise le filtre de prévision Voss et l’indicateur de ligne de tendance instantanée d’Ehlers pour identifier les points de retournement cycliques du marché et permettre des transactions quantifiées. Le filtre de Voss permet d’émettre des signaux d’achat/vente à l’avance, tandis que l’indicateur de ligne de tendance instantanée est utilisé pour déterminer la direction de la tendance globale et réduire les erreurs du filtre de Voss dans le marché en tendance.

Principe de stratégie

Voss prédit le filtre

Le filtre de prédiction de Voss est tiré de l’article de John F. Ehlers intitulé A Peek Into The Future. La formule de calcul du filtre est la suivante:

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

Parmi eux,_x1 est la différence d’un degré entre les prix;_x2 est le facteur de lissage;_s1、_s2、_s3 est le paramètre de filtration;_f1 est le paramètre de la période;_filt est le résultat du filtrage;_Pour la sortie finale:

Ce filtre peut être considéré comme un filtre de lissage, qui met l’accent sur les informations des cycles actuels et passés, émettant ainsi des signaux d’achat/vente à l’avance. En raison des délais de groupe intrinsèques, il peut émettre des signaux prédictifs avant les autres indicateurs, comme si l’aigle voyait dans l’aigle du futur.

Indicateur de ligne de tendance instantanée

L’indicateur de ligne de tendance instantanée est calculé par la formule suivante:

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

L’indicateur trace en temps réel une ligne de tendance qui correspond le mieux au prix et permet de déterminer avec précision la direction et la force de la tendance.

Logique de stratégie

Voss génère un signal d’achat lorsqu’il est inversé négativement et que le résultat du filtre est passé.

Voss produit un signal de vente lorsqu’il passe du positif au négatif et qu’il passe par le filtre inférieur.

En outre, un signal de transaction n’est émis que lorsque l’indicateur de ligne de tendance instantanée confirme la direction de la tendance. Cela permet de filtrer les signaux erronés que le filtre Voss peut émettre dans un marché en tendance.

Avantages stratégiques

  • Les filtres Voss émettent des signaux prédictifs à l’avance pour capturer les revirements périodiques
  • L’indicateur de ligne de tendance instantanée permet de déterminer avec précision la direction de la tendance, en évitant les signaux erronés émis par le filtre à l’avance
  • Paramètres configurables optimisés pour différents cycles et environnements de marché
  • Les stratégies de contrôle des risques de stop loss peuvent être ajoutées

Risques stratégiques et solutions

  • Cette stratégie repose sur des filtres qui envoient des signaux à l’avance et peuvent sauter certaines tendances.
  • Dans une tendance forte, il peut y avoir des signaux de trading réactionnaires, entraînant des pertes

Le risque peut être réduit par:

  • Optimisation des paramètres de cycle pour correspondre à la périodicité de différentes variétés
  • Ajustez les paramètres de bande passante pour réduire l’intensité du filtrage et les signaux trompeurs
  • Augmentation des filtres de tendance pour éviter les signaux erronés dans les tendances fortes
  • Définir une stratégie de stop-loss pour maîtriser les pertes individuelles

Orientation de l’optimisation de la stratégie

Cette stratégie peut être optimisée dans les domaines suivants:

  • Essayez différentes sources de prix, telles que le prix de clôture, la moyenne, etc., pour obtenir de meilleures informations.
  • Ajustez les paramètres de cycle du filtre pour correspondre à la périodicité de la variété
  • Optimiser les paramètres de l’indicateur de tendance pour obtenir des jugements de tendance plus précis
  • Essayez différents indicateurs de tendance pour trouver la combinaison qui vous convient le mieux
  • Ajout de stratégies de stop loss et de trailing stop pour mieux contrôler les risques
  • Optimiser les paramètres pour trouver la meilleure combinaison de paramètres

Résumer

La stratégie intègre le filtre Voss et les indicateurs de tendance, permettant d’identifier efficacement les points de retournement cyclique du marché. En optimisant les paramètres, en contrôlant les risques, la stratégie permet d’obtenir un système de négociation quantifié stable. Elle peut être largement utilisée dans les variétés qui ont une cyclicité évidente et qui ont montré de bons résultats de négociation dans les retours.

Code source de la stratégie
/*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()