Strategie für den zeitlichen Ablauf des Marktes mit Volatilitätsfilterung

Schriftsteller:ChaoZhang, Datum: 2024-01-15 12:27:47
Tags:

img

Übersicht

Diese Strategie implementiert eine erweiterte Buy-and-Hold-Strategie, indem ein Filter auf der Grundlage der historischen Volatilität hinzugefügt wird.

Strategie Logik

  1. Berechnung der historischen Volatilität von SPY in den letzten 100 Tagen
  2. Wenn die aktuelle Volatilität höher als das 95. Perzentil der Volatilität der letzten 100 Tage ist, wird an diesem Handelstag ausgefiltert und die lange Position geschlossen.
  3. Wenn die Volatilität unter dem 95. Perzentil liegt, wird eine Longposition eingegeben.

Analyse der Vorteile

Im Vergleich zu einem einfachen Kauf und Halten ohne Filter verbesserte diese Strategie die jährlichen Renditen über den 28-jährigen Backtestzeitraum (7,95% vs. 9,92%) und reduzierte den maximalen Drawdown signifikant (50,79% vs. 31,57%).

Risikoanalyse

Die wichtigsten Risiken stammen aus der Genauigkeit der Volatilitätsberechnungsmethode und der Einstellung der Filterparameter. Wenn die Volatilitätsberechnung ungenau ist, wird der Filter versagen. Wenn die Filterparameter schlecht eingestellt sind (zu konservativ oder aggressiv), kann dies sich negativ auf die Strategierenditen auswirken. Auch vergangene Leistung garantiert keine zukünftigen Ergebnisse.

Optimierungsrichtlinien

Überlegen Sie, andere Bestätigungsindikatoren als zusätzliche Filter hinzuzufügen, wie langfristige gleitende Durchschnitte, ADX-Index usw. Parameter-Tuning ist ebenfalls von entscheidender Bedeutung, wie z. B. das Testen verschiedener Lookback-Perioden, Filtern von Schwellenwerten usw. Maschinelles Lernen und Analysetechniken für Zeitreihen können auch zum Erstellen und Optimieren des Volatilitätsvorhersagemodells verwendet werden.

Zusammenfassung

Diese Strategie verbesserte die Renditen erheblich und reduzierte den maximalen Drawdown einer SPY Buy & Hold-Strategie über einen einfachen Volatilitätsfilter. Sie zeigt die Bedeutung der Identifizierung des Marktregimes und der Vermögensallokation. Wir können sie weiter verfeinern, indem wir das Volatilitätsmodell optimieren und bestätigende Signale hinzufügen.


/*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")

Mehr