Stratégie d'inversion moyenne de la volatilité des prix

Auteur:ChaoZhang est là., Date: 2023-10-11 16h03:36 Je suis désolé
Les étiquettes:

Résumé

Cette stratégie détecte les opportunités d'inversion des prix en calculant l'écart type de la volatilité des prix.

Principe

La stratégie utilise deux indicateurs principaux:

  1. Indicateur VixFix: Calcule l'écart type du prix sur une certaine période pour déterminer s'il existe une volatilité anormale des prix.
wvf = ((highest(close, pd)-low)/(highest(close, pd)))*100
sDev = mult * stdev(wvf, bbl) 
midLine = sma(wvf, bbl)
lowerBand = midLine - sDev 
upperBand = midLine + sDev

où wvf est la volatilité des prix, sDev est l'écart type, midLine est la ligne moyenne, lowerBand et upperBand sont les lignes de limite inférieure et supérieure.

  1. Indicateur RSI: Calcule l'indice de force relative du prix pour déterminer le moment de l'inversion du prix.
fastup = rma(max(change(close), 0), 7)
fastdown = rma(-min(change(close), 0), 7) 
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

Lorsque le RSI est inférieur à un seuil, il indique un statut de survente et un rebond potentiel.

Entrée et sortie

La logique d'entrée et de sortie est la suivante:

Entrée longue: Lorsque le prix dépasse la limite supérieure ou que la volatilité dépasse le seuil, et que le RSI est inférieur à une valeur, passez à la longueur.

Entrée courte: Lorsque le prix dépasse la limite supérieure ou que la volatilité dépasse le seuil, et que le RSI dépasse une valeur, passez à la vente courte.

Sortie: lorsque la direction du corps du chandelier est opposée à la direction de la position, position de fermeture.

Les avantages

  • Utilise les propriétés statistiques de la volatilité anormale des prix pour déterminer l'inversion des prix avec une large couverture.
  • La combinaison avec le RSI pour juger le surachat/survente améliore la précision d'entrée.
  • La rupture de la bande inférieure de déviation comme signal d'entrée réduit les occasions manquées.
  • L'inversion du corps du chandelier comme stop loss réalise un stop loss rapide et réduit les pertes.

Les risques

  • La bande de déviation inférieure peut nécessiter un ajustement pour optimiser les paramètres.
  • La rupture de la bande inférieure ne garantit pas le renversement, le risque d'être pris au piège.
  • Les paramètres du RSI doivent être optimisés, des valeurs incorrectes conduisent à des signaux inexacts.
  • La perte d'arrêt du corps du chandelier est peut-être trop agressive, il faut l'ajuster.

Directions d'optimisation

  • Optimiser la période de calcul de l'écart type pour mieux capturer la volatilité anormale.
  • Optimiser les paramètres de l'indice de volatilité pour trouver de meilleurs critères de surachat/survente.
  • Essayez de combiner d'autres indicateurs comme KDJ, MACD pour déterminer le moment de l'inversion.
  • Optimiser le mécanisme de stop loss, définir le retracement du prix comme référence de stop loss.

Conclusion

La stratégie détecte la volatilité anormale des prix en calculant l'écart-type de la volatilité des prix, afin de capturer les opportunités d'inversion. Le RSI est combiné pour juger du statut d'achat excessif / survente pour améliorer la précision d'entrée. Une direction simple du corps du chandelier est utilisée. Dans l'ensemble, la stratégie est efficace pour utiliser des données statistiques pour détecter la volatilité anormale, mais nécessite une optimisation des paramètres supplémentaires pour améliorer la stabilité. Si le mécanisme de stop loss peut être raisonnablement optimisé pour réduire les pertes, la stratégie fonctionnera encore mieux.


/*backtest
start: 2022-10-04 00:00:00
end: 2023-10-10 00:00:00
period: 2d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's VixFix + RSI Strategy v1.0", shorttitle = "VixFix + RSI str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 5)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
leverage = input(1, defval = 1, minval = 1, maxval = 100, title = "leverage")
limit = input(40, defval = 40, minval = 2, maxval = 50, title = "RSI Limit")

pd = input(22, title="LookBack Period Standard Deviation High")
bbl = input(20, title="Bolinger Band Length")
mult = input(2.0, minval = 1, maxval = 5, title = "Bollinger Band Standard Devaition Up")
lb = input(50, title="Look Back Period Percentile High")
ph = input(.85, title="Highest Percentile - 0.90=90%, 0.95=95%, 0.99=99%")
pl = input(1.01, title="Lowest Percentile - 1.10=90%, 1.05=95%, 1.01=99%")
hp = input(false, title="Show High Range - Based on Percentile and LookBack Period?")
sd = input(false, title="Show Standard Deviation Line?")

fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Vix Fix
wvf = ((highest(close, pd)-low)/(highest(close, pd)))*100
sDev = mult * stdev(wvf, bbl)
midLine = sma(wvf, bbl)
lowerBand = midLine - sDev
upperBand = midLine + sDev
rangeHigh = (highest(wvf, lb)) * ph
rangeLow = (lowest(wvf, lb)) * pl

col = wvf >= upperBand or wvf >= rangeHigh ? lime : gray

//RSI
fastup = rma(max(change(close), 0), 7)
fastdown = rma(-min(change(close), 0), 7)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Body
body = abs(close - open)
abody = sma(body, 10)

//Signals
up = (wvf >= upperBand or wvf >= rangeHigh) and fastrsi < limit and close < open
dn = (wvf >= upperBand or wvf >= rangeHigh) and fastrsi > (100 - limit) and close > open
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body > abody / 3

//Trading
lot = strategy.position_size == 0 ? strategy.equity / close * leverage : lot[1]

if up
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("Bottom", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if dn
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Top", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

Plus de