Stratégie de négociation algorithmique à haute performance basée sur des modèles quantitatifs

Auteur:ChaoZhang est là., Date: 2023-12-22 13h14 et 33 min
Les étiquettes:

img

Résumé

Cette stratégie est une stratégie de trading algorithmique de haute performance basée sur des modèles quantitatifs. Elle utilise le modèle de volume de Modelius comme modèle de base et l'étend et l'optimise davantage.

Principe de stratégie

Le noyau de cette stratégie est le modèle de volume de Modelius. Ce modèle identifie les opportunités de trading quantitatives sur le marché en détectant les changements de prix et de volume. Plus précisément, la stratégie combine le prix de clôture, le prix d'ouverture, le prix le plus élevé, le prix le plus bas pour calculer la direction de la ligne K actuelle en fonction de certaines règles. Lorsque la direction de la ligne K change, la qualité de l'opportunité de trading quantitative est jugée en fonction du volume de trading. En outre, la stratégie combine également l'indicateur SAR et l'indicateur de moyenne mobile pour aider à déterminer le moment d'entrée et de sortie.

La logique de base du trading est d'aller long lorsque l'indicateur passe de négatif à positif et de passer court lorsque l'indicateur passe de positif à négatif.

Analyse des avantages

Le plus grand avantage de cette stratégie est que le modèle de volume de Modelius peut identifier efficacement les opportunités de négociation quantitatives. Par rapport aux indicateurs techniques traditionnels, ce modèle accorde plus d'attention aux changements de volume, ce qui est très pratique dans le commerce quantitatif à haute fréquence d'aujourd'hui.

Analyse des risques

Le principal risque de cette stratégie est que le modèle de volume de Modelius lui-même ne peut pas éviter complètement le bruit. Lorsqu'il y a une fluctuation anormale du marché, cela conduira à de mauvais signaux de trading. En outre, les paramètres définis dans la stratégie auront également une incidence sur les résultats finaux.

Pour contrôler les risques, les paramètres peuvent être ajustés en conséquence et combinés avec d'autres indicateurs pour un jugement auxiliaire.

Directions d'optimisation

Il y a encore de la place pour optimiser cette stratégie. Par exemple, les algorithmes d'apprentissage automatique peuvent être considérés pour optimiser dynamiquement les paramètres. Ou combiner l'analyse du sentiment et d'autres indicateurs pour améliorer la précision des décisions. En outre, la corrélation entre différentes variétés peut être étudiée pour établir un modèle d'arbitrage multi-variétés.

Résumé

En résumé, cette stratégie utilise les avantages du modèle quantitatif de volume de Modelius et conçoit un ensemble de stratégies de trading algorithmiques avec une haute operabilité.


/*backtest
start: 2022-12-15 00:00:00
end: 2023-12-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/


//@version=3
strategy(title="strategy modelius volume model ", shorttitle="mvm",overlay=true, calc_on_order_fills=true, default_qty_type=strategy.percent_of_equity, default_qty_value=50, overlay=false)

method = input(defval="ATR", options=["ATR", "Traditional", "Part of Price"], title="Renko Assignment Method")
methodvalue = input(defval=14.0, type=float, minval=0, title="Value")
pricesource = input(defval="Close", options=["Close", "Open / Close", "High / Low"], title="Price Source")
useClose = pricesource == "Close"
useOpenClose = pricesource == "Open / Close" or useClose
useTrueRange = input(defval="Auto", options=["Always", "Auto", "Never"], title="Use True Range instead of Volume")
isOscillating=input(defval=true, type=bool, title="Oscillating")
normalize=input(defval=false, type=bool, title="Normalize")
vol = useTrueRange == "Always" or (useTrueRange == "Auto" and na(volume))? tr : volume
op = useClose ? close : open
hi = useOpenClose ? close >= op ? close : op : high
lo = useOpenClose ? close <= op ? close : op : low

if method == "ATR"
    methodvalue := atr(round(methodvalue))
if method == "Part of Price"
    methodvalue := close/methodvalue

currclose = na
prevclose = nz(currclose[1])
prevhigh = prevclose + methodvalue
prevlow = prevclose - methodvalue
currclose := hi > prevhigh ? hi : lo < prevlow ? lo : prevclose

direction = na
direction := currclose > prevclose ? 1 : currclose < prevclose ? -1 : nz(direction[1])
directionHasChanged = change(direction) != 0
directionIsUp = direction > 0
directionIsDown = direction < 0

barcount = 1
barcount := not directionHasChanged and normalize ? barcount[1] + barcount : barcount
vol := not directionHasChanged ? vol[1] + vol : vol
res = barcount > 1 ? vol/barcount : vol


x=isOscillating and directionIsDown ? -res : res

TP = input(0) * 10
SL = input(0) * 10
TS = input(1) * 10
TO = input(3) * 10
CQ = 100

TPP = (TP > 0) ? TP : na
SLP = (SL > 0) ? SL : na
TSP = (TS > 0) ? TS : na
TOP = (TO > 0) ? TO : na

longCondition = crossover(x,0)
if (longCondition)
    strategy.entry("Long", strategy.long)


shortCondition = crossunder(x,0)
if (shortCondition)
    strategy.entry("Short", strategy.short)

strategy.exit("Close Short", "Short", qty_percent=CQ, profit=TPP, loss=SLP, trail_points=TSP, trail_offset=TOP)
strategy.exit("Close Long", "Long", qty_percent=CQ, profit=TPP, loss=SLP, trail_points=TSP, trail_offset=TOP)

Plus de