
Esta estrategia implementa una versión mejorada de la estrategia de compra y tenencia mediante la adición de un filtro basado en la volatilidad histórica. El papel del filtro es cerrar las posiciones de compra y compra en períodos de alta volatilidad del mercado y volver a establecer las posiciones de compra y compra en períodos de baja volatilidad, lo que reduce el máximo retiro de la estrategia.
En comparación con la estrategia de compra y tenencia sencilla sin filtro, esta estrategia ha aumentado la rentabilidad anual durante el período de retrospección de 28 años (7.95% vs 9.92%) y el máximo retiro ha disminuido considerablemente (el 50.79% vs 31.57%). Esto indica que la inclusión de filtros de volatilidad en el mercado puede aumentar la rentabilidad de la estrategia y reducir el riesgo hasta cierto punto.
El principal riesgo de esta estrategia reside en el método de cálculo de la volatilidad y la precisión de la configuración de los parámetros del filtro. Si la volatilidad no se calcula con precisión, el filtro no funcionará. Si la configuración de los parámetros del filtro es demasiado conservadora o demasiado radical, el rendimiento de la estrategia se verá afectado negativamente.
Se puede considerar la inclusión de otros indicadores de filtro como señales de confirmación, como la media móvil a largo plazo, el indicador ADX del índice de grandes discos, etc. La optimización de ajustes de parámetros también es clave, como la configuración de parámetros para probar diferentes períodos de revisión, filtering threshold, etc. La tecnología de aprendizaje automático y análisis de secuencias de tiempo también se puede utilizar para crear y optimizar modelos de predicción de fluctuaciones.
Esta estrategia mejora considerablemente el rendimiento de la estrategia de compra y tenencia SPY a través de un simple filtro basado en la volatilidad histórica, al tiempo que reduce significativamente el máximo retiro. Esto demuestra la importancia de la identificación del estado del mercado y la asignación de activos. Podemos perfeccionar aún más la estrategia al continuar optimizando el modelo de volatilidad y agregar señales de confirmación.
/*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")