Stratégie de planification du marché filtrée par la volatilité

Auteur:ChaoZhang est là., Date: 15 janvier 2024 à 12 h 27 min 47 s
Les étiquettes:

img

Résumé

Cette stratégie met en œuvre une stratégie d'achat et de détention améliorée en ajoutant un filtre basé sur la volatilité historique.

La logique de la stratégie

  1. Calculer la volatilité historique du SPY au cours des 100 derniers jours
  2. Si la volatilité actuelle est supérieure au 95e centile de la volatilité des 100 derniers jours, filtrer cette journée de négociation, fermer la position longue
  3. Si la volatilité est inférieure au 95e centile, entrer une position longue

Analyse des avantages

Comparé à un simple buy and hold sans filtre, cette stratégie a amélioré les rendements annualisés au cours de la période de backtest de 28 ans (7,95% contre 9,92%) et a considérablement réduit le tirage au sort maximal (50,79% contre 31,57%).

Analyse des risques

Les principaux risques proviennent de l'exactitude de la méthodologie de calcul de la volatilité et du réglage des paramètres du filtre. Si le calcul de la volatilité est inexact, le filtre échouera. Si les paramètres du filtre sont mal réglés (trop conservateurs ou agressifs), cela peut avoir un impact négatif sur les rendements de la stratégie. En outre, les performances passées ne garantissent pas les résultats futurs.

Directions d'optimisation

Envisagez d'ajouter d'autres indicateurs de confirmation en tant que filtres supplémentaires, tels que la moyenne mobile à long terme, l'indice ADX, etc. Le réglage des paramètres est également essentiel, comme le test de différentes périodes de rétrospective, le filtrage des seuils, etc. Les techniques d'apprentissage automatique et d'analyse des séries temporelles peuvent également être utilisées pour construire et optimiser le modèle de prédiction de la volatilité.

Résumé

Cette stratégie a considérablement amélioré les rendements et réduit le tirage maximal d'une stratégie d'achat et de détention SPY via un filtre de volatilité simple. Elle montre l'importance de l'identification du régime de marché et de l'allocation des actifs. Nous pouvons l'affiner davantage en optimisant le modèle de volatilité et en ajoutant des signaux de confirmation.


/*backtest
start: 2023-01-08 00:00:00
end: 2024-01-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// 
// @author Sunil Halai
//
// This script has been created to demonstrate the effectiveness of using market regime filters in your trading strategy, and how they can improve your returns and lower your drawdowns
//
// This strategy adds a simple filter (The historical volatility filter, which can be found on my trading profile) to a traditional buy and hold strategy of the index SPY. There are other filters
// that could also be added included a long term moving average / percentile rank filter / ADX filter etc, to improve the returns further.
//
// The filter added closes our long position during periods of volatility that exceed the 95th percentile (or in the top 5% of volatile days)
//
// Have included the back test results since 1993 which is 28 years of data at the time of writing,  Comparing  buy and hold of the SPY (S&P 500), to improved by and hold offered here.
//
// Traditional buy and hold:
//
// Return per year:     7.95   % (ex Dividends)
// Total return :       851.1  %
// Max drawdown:        50.79  %
//
// 'Modified' buy and hold (this script):
//
// Return per year:     9.92    % (ex Dividends)
// Total return:        1412.16 %
// Max drawdown:        31.57   %
//
// Feel free to use some of the market filters in my trading profile to improve and refine your strategies further, or make a copy and play around with the code yourself. This is just 
// a simple example for demo purposes.
//

//@version=4
strategy(title = "Simple way to beat the market [STRATEGY]", shorttitle = "Beat The Market [STRATEGY]", overlay=true, initial_capital=100000, default_qty_type=strategy.percent_of_equity, currency="USD", default_qty_value=100)


upperExtreme = input(title = "Upper percentile filter (Do not trade above this number)", type = input.integer, defval = 95)
lookbackPeriod = input(title = "Lookback period", type = input.integer, defval = 100)

annual = 365
per = timeframe.isintraday or timeframe.isdaily and timeframe.multiplier == 1 ? 1 : 7
hv = lookbackPeriod * stdev(log(close / close[1]), 10) * sqrt(annual / per)

filtered = hv >= percentile_nearest_rank(hv, 100, upperExtreme)

if(not(filtered))
    strategy.entry("LONG", strategy.long)
else
    strategy.close("LONG")

Plus de