
Эта стратегия реализует улучшенную версию стратегии покупать и держать, добавляя фильтр, основанный на исторической волатильности. Фильтр выполняет функцию закрытия покупательских позиций в периоды высокой волатильности рынка и восстановления покупательских позиций в периоды низкой волатильности, что снижает максимальную отдачу стратегии.
По сравнению с простой стратегией покупки и владения без фильтра, эта стратегия за 28-летний период отсчета повысила годовую доходность ((7.95% против 9.92%) и значительно снизила максимальный отзыв ((50.79% против 31.57%). Это говорит о том, что добавление фильтра волатильности рынка может в некоторой степени повысить доходность стратегии и уменьшить риск.
Основные риски этой стратегии заключаются в точности метода расчета волатильности и параметров фильтра. Если волатильность не рассчитана точно, фильтр будет недействителен; если параметры фильтра настроены слишком консервативно или слишком радикально, это может негативно повлиять на доход стратегии. Кроме того, Past performance is not indicative of future results, историческая производительность стратегии не является индикатором будущих результатов.
Можно рассмотреть возможность добавления других фильтров индикаторов в качестве подтверждающих сигналов, таких как долгосрочные движущиеся средние, индексы ADX и т. д. Кроме того, оптимизация параметров настройки также имеет важное значение, например, для тестирования различных параметров параметров, таких как период обратной обработки, фильтрующий порог.
С помощью простого фильтра на основе исторической волатильности, эта стратегия значительно повышает доходность стратегии SPY buy and hold, а также значительно снижает максимальный вывод. Это доказывает важность идентификации состояния рынка и размещения активов. Мы можем улучшить эту стратегию, продолжая оптимизировать модель волатильности и добавлять подтверждающие сигналы.
/*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")