
Cette stratégie permet de réaliser une version améliorée de la stratégie Buy and Hold en ajoutant un filtre basé sur la volatilité historique. Le rôle du filtre est de fermer les positions Buy et Hold pendant les périodes de forte volatilité du marché et de rétablir les positions Buy et Hold pendant les périodes de faible volatilité, réduisant ainsi le retrait maximal de la stratégie.
Comparé à une stratégie simple d’achat et de détention sans filtre, cette stratégie a connu une augmentation du rendement annualisé de 7,95% vs 9,92% sur une période de 28 ans de retrait, tandis que le retrait maximal a considérablement diminué de 50,79% vs 31,57%, ce qui montre que l’ajout d’un filtre de volatilité du marché peut améliorer le rendement de la stratégie et réduire les risques.
Le principal risque de cette stratégie réside dans la méthode de calcul de la volatilité et l’exactitude des paramètres du filtre. Si le calcul de la volatilité n’est pas précis, le filtre sera inefficace. Si le paramètre du filtre est trop conservateur ou trop radical, cela aura un impact négatif sur les gains de la stratégie.
On peut envisager d’ajouter d’autres indicateurs de filtrage comme signaux de confirmation, tels que les moyennes mobiles à long terme, les indicateurs ADX du grand disque, etc. L’optimisation des paramètres d’ajustement est également cruciale, comme la mise en place de paramètres pour tester différentes périodes de retour, les seuils de filtrage, etc. Les techniques d’analyse de la machine et de séquence temporelle peuvent également être utilisées pour créer et optimiser des modèles de prévision des taux d’oscillation.
Cette stratégie a permis d’augmenter considérablement le rendement des stratégies de buy and hold SPY grâce à un simple filtre basé sur la volatilité historique, tout en réduisant considérablement les retraits maximaux. Cela prouve l’importance de l’identification de l’état du marché et de la configuration des actifs. Nous pouvons améliorer encore cette stratégie en continuant à optimiser les modèles 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")