Quantitative Strategien basierend auf der Änderungsrate


Erstellungsdatum: 2023-12-12 15:56:56 zuletzt geändert: 2023-12-12 15:56:56
Kopie: 0 Klicks: 655
1
konzentrieren Sie sich auf
1621
Anhänger

Quantitative Strategien basierend auf der Änderungsrate

Überblick

Diese Strategie basiert auf der Veränderungsrate (ROC) Indikator zu beurteilen, die Marktentwicklung und die Erzeugung von Handelssignalen. Die Kernidee der Strategie ist es, die langfristigen Trends zu folgen, indem Sie größere Risiken, um die Erträge, die über dem Markt zu erhalten.

Strategieprinzip

Eintrittsregeln

  • Wenn ROC > 0 ist, machen Sie mehr; wenn ROC < 0 ist, machen Sie leer. Verwenden Sie die positive und negative Richtung des ROC-Indikators, um die Richtung der Marktentwicklung zu bestimmen.
  • Um die Erschütterungen zu filtern, wird nur dann ein Handelssignal gesendet, wenn die ROC zwei Tage lang auf derselben Seite bleibt.

Stop-Loss-Regel

Ein Stop-Loss von 6% ist eingestellt. Wenn ein Stop-Loss ausgelöst wird, ändert die Position die Richtung. Dies bedeutet, dass wir möglicherweise auf der falschen Seite des Kurses sind und eine zeitnahe Stop-Loss-Umkehrung benötigen.

Blasenbekämpfung

Wenn der ROC über 200 liegt, wird er als Blase bezeichnet. Wenn der ROC unter die Blase zurückfällt, wird ein Leerstandssignal erzeugt. Gleichzeitig wird verlangt, dass die Blase mindestens eine Woche andauert.

Vermögensverwaltung

Die Verwendung von Fix-Position + Steigerungsmethode. Bei jedem Anstieg oder Fall von 400 US-Dollar erhöhen oder verringern Sie die Position um 200 US-Dollar. So können Sie die Gewinne für die Einlagerung nutzen, um einen größeren Gewinn zu erzielen, aber auch die Rücknahme zu erhöhen.

Analyse der Stärken

Es ist eine Strategie, die langfristige Trends verfolgt.

  1. Die Philosophie des Trendtrades ermöglicht die Erzielung von langfristigen positiven Erträgen.
  2. Der Einsatz von Stop-Losses zur Risikokontrolle kann die Auswirkungen von kurzfristigen Marktschwankungen mildern.
  3. Es gibt eine Reihe von Möglichkeiten, wie man die Blasen abwehren kann, indem man sich an der Spitze des Marktes aufhält.
  4. Die Fix-Position + die zunehmende Vermögensverwaltung ermöglichen es, in einer bullishen Situation ein exponentielles Wachstum zu erzielen.

Risikoanalyse

Die Strategie birgt auch einige Risiken:

  1. ROC-Indikatoren sind anfällig für Erschütterungen und erzeugen falsche Signale. Es kann in Betracht gezogen werden, andere Indikatoren zu kombinieren, um eine Kombinationsfilterung durchzuführen.
  2. Die Einnahmen bei der tatsächlichen Nutzung sind ohne Berücksichtigung der Transaktionskosten geringer als bei der Rückmessung.
  3. Es ist auch leicht zu übersehen, dass die Parameter für die Blasensicherung falsch eingestellt sind.
  4. Die Fix-Positions-+Aufschwung-Methode erhöht den Rückzug bei Verlust.

Optimierungsrichtung

Diese Strategie kann in folgenden Bereichen optimiert werden:

  1. Hinzufügen von anderen Indikatoren, um ein Handelssystem zu bilden, um falsche Signale zu filtern. Zum Beispiel Hinzufügen von Indikatoren wie Durchschnittslinie, Volatilität.
  2. Optimierung der Parameter zur Blasenbekämpfung, um eine genauere Blasenerkennung zu ermöglichen.
  3. Anpassung der festen Positionen und der steigenden Parameter, um eine bessere Risiko-Gewinn-Balance zu erzielen.
  4. Hinzugefügt wurde ein automatischer Verlustbefehl.
  5. Die Eintrittskriterien sollten realistischer sein, um die Auswirkungen der Transaktionsgebühren zu berücksichtigen.

Zusammenfassen

Alles in allem ist es eine Strategie, die mit dem ROC-Indikator im Mittelpunkt steht. Es ist eine aggressive Strategie, die über das Großkapital hinausgehende Gewinne erzielt, indem sie größere Risiken eingeht. Wir müssen sie entsprechend optimieren, damit sie in der Praxis eingesetzt werden kann.

Strategiequellcode
/*backtest
start: 2022-12-05 00:00:00
end: 2023-12-11 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/
// © gsanson66


//This strategy use the Rate of Change (ROC) of the closing price to send enter signal. 
//@version=5
strategy("RATE OF CHANGE BACKTESTING", shorttitle="ROC BACKTESTING", overlay=false, precision=3, initial_capital=1000, default_qty_type=strategy.cash, default_qty_value=950, commission_type=strategy.commission.percent, commission_value=0.18)


//--------------------------------FUNCTIONS-----------------------------------//

//@function Displays text passed to `txt` when called.
debugLabel(txt, color, loc) =>
    label.new(bar_index, loc, text = txt, color=color, style = label.style_label_lower_right, textcolor = color.black, size = size.small)

//@function which looks if the close date of the current bar falls inside the date range
inBacktestPeriod(start, end) => (time >= start) and (time <= end)


//----------------------------------USER INPUTS----------------------------------//

//Technical parameters
rocLength = input.int(defval=365, minval=0, title='ROC Length', group="Technical parameters")
bubbleValue = input.int(defval=200, minval=0, title="ROC Bubble signal", group="Technical parameters")
//Risk management
stopLossInput = input.float(defval=10, minval=0, title="Stop Loss (in %)", group="Risk Management")
//Money management
fixedRatio = input.int(defval=400, minval=1, title="Fixed Ratio Value ($)", group="Money Management")
increasingOrderAmount = input.int(defval=200, minval=1, title="Increasing Order Amount ($)", group="Money Management")
//Backtesting period
startDate = input(title="Start Date", defval=timestamp("1 Jan 2017 00:00:00"), group="Backtesting Period")
endDate = input(title="End Date", defval=timestamp("1 July 2024 00:00:00"), group="Backtesting Period")


//-------------------------------------VARIABLES INITIALISATION-----------------------------//

roc = (close/close[rocLength] - 1)*100
midlineConst = 0
var bool inBubble = na
bool shortBubbleCondition = na
equity = strategy.equity - strategy.openprofit
strategy.initial_capital = 50000
var float capital_ref = strategy.initial_capital
var float cashOrder = strategy.initial_capital * 0.95
bool inRange = na


//------------------------------CHECKING SOME CONDITIONS ON EACH SCRIPT EXECUTION-------------------------------//

//Checking if the date belong to the range
inRange := true

//Checking if we are in a bubble
if roc > bubbleValue and not inBubble
    inBubble := true

//Checking if the bubble is over
if roc < 0 and inBubble
    inBubble := false

//Checking the condition to short the bubble : The ROC must be above the bubblevalue for at least 1 week
if roc[1]>bubbleValue and roc[2]>bubbleValue and roc[3]>bubbleValue and roc[4]>bubbleValue and roc[5]>bubbleValue and roc[6]>bubbleValue and roc[7]>bubbleValue
    shortBubbleCondition := true

//Checking performances of the strategy
if equity > capital_ref + fixedRatio
    spread = (equity - capital_ref)/fixedRatio
    nb_level = int(spread)
    increasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder + increasingOrder
    capital_ref := capital_ref + nb_level*fixedRatio
if equity < capital_ref - fixedRatio
    spread = (capital_ref - equity)/fixedRatio
    nb_level = int(spread)
    decreasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder - decreasingOrder
    capital_ref := capital_ref - nb_level*fixedRatio

//Checking if we close all trades in case where we exit the backtesting period
if strategy.position_size!=0 and not inRange
    debugLabel("END OF BACKTESTING PERIOD : we close the trade", color=color.rgb(116, 116, 116), loc=roc)
    strategy.close_all()


//-------------------------------LONG/SHORT CONDITION-------------------------------//

//Long condition
//We reduce noise by taking signal only if the last roc value is in the same side as the current one
if (strategy.position_size<=0 and ta.crossover(roc, midlineConst)[1] and roc>0 and inRange)
    //If we were in a short position, we pass to a long position
    qty = cashOrder/close
    strategy.entry("Long", strategy.long, qty)
    stopLoss = close * (1-stopLossInput/100)
    strategy.exit("Long Risk Managment", "Long", stop=stopLoss)

//Short condition
//We take a short position if we are in a bubble and roc is decreasing
if (strategy.position_size>=0 and ta.crossunder(roc, midlineConst)[1] and roc<0 and inRange) or 
     (strategy.position_size>=0 and inBubble and ta.crossunder(roc, bubbleValue) and shortBubbleCondition and inRange)
    //If we were in a long position, we pass to a short position
    qty = cashOrder/close
    strategy.entry("Short", strategy.short, qty)
    stopLoss = close * (1+stopLossInput/100)
    strategy.exit("Short Risk Managment", "Short", stop=stopLoss)


//--------------------------------RISK MANAGEMENT--------------------------------------//

//We manage our risk and change the sense of position after SL is hitten
if strategy.position_size == 0 and inRange
    //We find the direction of the last trade
    id = strategy.closedtrades.entry_id(strategy.closedtrades-1)
    if id == "Short"
        qty = cashOrder/close
        strategy.entry("Long", strategy.long, qty)
        stopLoss = close * (1-stopLossInput/100)
        strategy.exit("Long Risk Managment", "Long", stop=stopLoss)
    else if id =="Long"
        qty = cashOrder/close
        strategy.entry("Short", strategy.short, qty)
        stopLoss = close * (1+stopLossInput/100)
        strategy.exit("Short Risk Managment", "Short", stop=stopLoss)


//---------------------------------PLOTTING ELEMENTS---------------------------------------//

//Plotting of ROC
rocPlot = plot(roc, "ROC", color=#7E57C2)
midline = hline(0, "ROC Middle Band", color=color.new(#787B86, 25))
midLinePlot = plot(0, color = na, editable = false, display = display.none)
fill(rocPlot, midLinePlot, 40, 0, top_color = strategy.position_size>0 ? color.new(color.green, 0) : strategy.position_size<0 ? color.new(color.red, 0) : na, bottom_color = strategy.position_size>0 ? color.new(color.green, 100) : strategy.position_size<0 ? color.new(color.red, 100) : na,  title = "Positive area")
fill(rocPlot, midLinePlot, 0,  -40,  top_color = strategy.position_size<0 ? color.new(color.red, 100) : strategy.position_size>0 ? color.new(color.green, 100) : na, bottom_color = strategy.position_size<0 ? color.new(color.red, 0) : strategy.position_size>0 ? color.new(color.green, 0) : na, title = "Negative area")