Veränderungsrate Quantitative Strategie

Schriftsteller:ChaoZhang, Datum: 12.12.2023
Tags:

img

Übersicht

Diese Strategie verwendet den Rate of Change (ROC) -Indikator, um die Marktrichtung zu bestimmen und Handelssignale zu generieren.

Strategie Logik

Eintrittsregeln

  • Verwenden Sie die positive/negative ROC-Werte, um die Marktrichtung zu beurteilen.
  • Um Volatilität auszuschließen, geben Sie nur Handelssignale aus, wenn ROC zwei aufeinanderfolgende Tage auf derselben Seite bleibt.

Stop-Loss

Wenn der Stop-Loss ausgelöst wird, umkehren Sie die Position.

Mechanismus gegen Blasen

Wenn ROC über 200 liegt, gilt der Markt als Blase. Wenn ROC wieder unter das Blasegebiet fällt, wird ein Kurzsignal ausgelöst. Die Blase muss mindestens eine Woche andauern.

Geldmanagement

Verwenden Sie eine feste Positionsgröße + inkrementelle Methode. Erhöhen / verringern Sie die Position um $ 200 für jeden $ 400 Gewinn / Verlust. Dies ermöglicht es uns, Gewinne zu pyramidalisieren, erhöht aber auch den Drawdown.

Analyse der Vorteile

Vorteile dieser Strategie:

  1. Folgt dem Trend der Philosophie, die langfristig positive Renditen erzielt.
  2. Verwenden Sie Stop-Loss, um das Risiko zu kontrollieren und die kurzfristige Volatilität zu reduzieren.
  3. Der Anti-Blasen-Mechanismus verhindert, dass die Spitzen verfolgt werden.
  4. Festposition + Inkrementelle Methode erzeugt exponentielles Wachstum in Aufwärtstrends.

Risikoanalyse

Es bestehen auch einige Risiken:

  1. ROC-Indikator anfällig für Whipsaws, die falsche Signale erzeugen.
  2. Handelskosten nicht berücksichtigt, was die tatsächliche Rendite senkt.
  3. Eine schlechte Abstimmung der Anti-Bubbel-Parameter verpasst auch Trends.
  4. Die Zunahme der Größe erhöht den Abzug bei Verlust.

Optimierungsrichtlinien

Einige Möglichkeiten zur Optimierung der Strategie:

  1. Zusätzliche Indikatoren werden den Filtersignalen hinzugefügt, z. B. MA, Volatilität usw.
  2. Optimieren Sie die Anti-Blasen-Parameter für eine bessere Bubble-Erkennung.
  3. Anpassung der festen Positionen und der inkrementellen Verhältnisse für eine bessere Risiko-Rendite-Bilanz.
  4. Hinzufügen eines automatischen Stop-Loss, wenn ein großer Verlust auftritt.
  5. Die Handelskosten werden berücksichtigt und die Einstiegsregeln entsprechend festgelegt.

Schlussfolgerung

Zusammenfassend ist dies ein langfristiger Trend nach der Strategie, die sich auf den ROC-Indikator konzentriert. Es zielt darauf ab, Alpha zu generieren, indem ein höheres Risiko übernommen wird. Weitere Optimierungen können seine Lebensfähigkeit verbessern. Der Schlüssel liegt darin, eine geeignete Risikotoleranz zu finden.


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


Mehr