Momentum-folgende adaptive statistische Arbitrage-Strategie


Erstellungsdatum: 2023-12-11 16:41:27 zuletzt geändert: 2023-12-11 16:41:27
Kopie: 0 Klicks: 791
1
konzentrieren Sie sich auf
1621
Anhänger

Momentum-folgende adaptive statistische Arbitrage-Strategie

Überblick

Die Strategie basiert auf der Nadaraya-Watson-Kernregressionsmethode, um eine dynamische Bandbreite der Volatilität zu erstellen, um ein Handelssignal für einen niedrigen Kauf zu erzielen, indem sie die Kreuzung der Preise mit dem Bandbreite verfolgt. Die Strategie basiert auf mathematischen Analysen und kann sich an Marktveränderungen anpassen.

Strategieprinzip

Der Kern der Strategie ist die Berechnung der dynamischen Umgebung der Preise. Zuerst wird die Nadaraya-Watson-Kernregressionskurve für die Preise erstellt, die auf der Grundlage der benutzerdefinierten Blickdauer erstellt werden, um eine glatte Preisschätzung zu erhalten. Dann wird der ATR-Wert auf der Grundlage der benutzerdefinierten ATR-Länge berechnet, kombiniert mit dem Nahen- und dem Fernen-End-Faktor, um die Reichweite der oberen und unteren Umgebung zu erhalten.

Strategische Vorteile

  1. Basierend auf mathematischen Modellen sind die Parameter kontrollierbar und nicht leicht zu überoptimieren
  2. Anpassung an Marktveränderungen und Nutzung der dynamischen Beziehung zwischen Preisen und Volatilität, um Handelschancen zu nutzen
  3. Die Verwendung von logarithmischen Koordinaten ermöglicht eine gute Verarbeitung von Sorten mit unterschiedlichen Zeitzyklen und Schwankungen
  4. Sensibilität für die Anpassung der Strategie an die benutzerdefinierten Parameter

Strategisches Risiko

  1. Mathematische Modelle sind theoretisch und die Festplatte kann nicht so gut funktionieren wie erwartet.
  2. Die Auswahl der Schlüsselparameter erfordert Erfahrung, die falsche Einstellung kann die Erträge beeinträchtigen
  3. Es gibt eine gewisse Verzögerung und es könnten einige Handelschancen verpasst werden
  4. In einem stark erschütterten Markt sind falsche Signale leicht zu erwarten.

Diese Risiken werden vor allem durch Optimierung der Parameter, durch gute Rückmessung, durch Kenntnis der Einflussfaktoren und durch Vorsicht in der Praxis vermieden und verringert.

Richtung der Strategieoptimierung

  1. Optimierung der Parameter weiter, um die optimale Kombination zu finden
  2. Automatische Optimierung der Parameter mit Hilfe von maschinellen Lernmethoden
  3. Erhöhung der Filterbedingungen, Aktivierung von Strategien in bestimmten Marktumständen
  4. Misstrauenssignale in Kombination mit anderen Indikatoren
  5. Versuchen Sie mit verschiedenen mathematischen Modell-Algorithmen

Zusammenfassen

Die Strategie integriert statistische Analysen mit technischen Kennzahlen, um durch die dynamische Verfolgung von Preisen und Volatilität ein Handelssignal zu erzielen. Die Parameter können je nach Markt- und eigener Situation angepasst werden. Insgesamt ist die theoretische Grundlage der Strategie solide, die tatsächliche Leistung muss noch weiter überprüft werden.

Strategiequellcode
/*backtest
start: 2022-12-04 00:00:00
end: 2023-12-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// © Julien_Eche
//@version=5

strategy("Nadaraya-Watson Envelope Strategy", overlay=true, pyramiding=1, default_qty_type=strategy.percent_of_equity, default_qty_value=20)

// Helper Functions
getEnvelopeBounds(_atr, _nearFactor, _farFactor, _envelope) => 
    _upperFar = _envelope + _farFactor*_atr
    _upperNear = _envelope + _nearFactor*_atr
    _lowerNear = _envelope - _nearFactor*_atr
    _lowerFar = _envelope - _farFactor*_atr
    _upperAvg = (_upperFar + _upperNear) / 2
    _lowerAvg = (_lowerFar + _lowerNear) / 2 
    [_upperNear, _upperFar, _upperAvg, _lowerNear, _lowerFar, _lowerAvg]

customATR(length, _high, _low, _close) =>
    trueRange = na(_high[1])? math.log(_high)-math.log(_low) : math.max(math.max(math.log(_high) - math.log(_low), math.abs(math.log(_high) - math.log(_close[1]))), math.abs(math.log(_low) - math.log(_close[1])))
    ta.rma(trueRange, length)

customKernel(x, h, alpha, x_0) =>
    sumWeights = 0.0
    sumXWeights = 0.0
    for i = 0 to h
        weight = math.pow(1 + (math.pow((x_0 - i), 2) / (2 * alpha * h * h)), -alpha)
        sumWeights := sumWeights + weight
        sumXWeights := sumXWeights + weight * x[i]
    sumXWeights / sumWeights

// Custom Settings
customLookbackWindow = input.int(8, 'Lookback Window (Custom)', group='Custom Settings')
customRelativeWeighting = input.float(8., 'Relative Weighting (Custom)', step=0.25, group='Custom Settings')
customStartRegressionBar = input.int(25, "Start Regression at Bar (Custom)", group='Custom Settings')

// Envelope Calculations
customEnvelopeClose = math.exp(customKernel(math.log(close), customLookbackWindow, customRelativeWeighting, customStartRegressionBar))
customEnvelopeHigh = math.exp(customKernel(math.log(high), customLookbackWindow, customRelativeWeighting, customStartRegressionBar))
customEnvelopeLow = math.exp(customKernel(math.log(low), customLookbackWindow, customRelativeWeighting, customStartRegressionBar))
customEnvelope = customEnvelopeClose
customATRLength = input.int(60, 'ATR Length (Custom)', minval=1, group='Custom Settings')
customATR = customATR(customATRLength, customEnvelopeHigh, customEnvelopeLow, customEnvelopeClose)
customNearATRFactor = input.float(1.5, 'Near ATR Factor (Custom)', minval=0.5, step=0.25, group='Custom Settings')
customFarATRFactor = input.float(2.0, 'Far ATR Factor (Custom)', minval=1.0, step=0.25, group='Custom Settings')
[customUpperNear, customUpperFar, customUpperAvg, customLowerNear, customLowerFar, customLowerAvg] = getEnvelopeBounds(customATR, customNearATRFactor, customFarATRFactor, math.log(customEnvelopeClose))

// Colors
customUpperBoundaryColorFar = color.new(color.red, 60)
customUpperBoundaryColorNear = color.new(color.red, 80)
customBullishEstimatorColor = color.new(color.teal, 50)
customBearishEstimatorColor = color.new(color.red, 50)
customLowerBoundaryColorNear = color.new(color.teal, 80)
customLowerBoundaryColorFar = color.new(color.teal, 60)

// Plots
customUpperBoundaryFar = plot(math.exp(customUpperFar), color=customUpperBoundaryColorFar, title='Upper Boundary: Far (Custom)')
customUpperBoundaryAvg = plot(math.exp(customUpperAvg), color=customUpperBoundaryColorNear, title='Upper Boundary: Average (Custom)')
customUpperBoundaryNear = plot(math.exp(customUpperNear), color=customUpperBoundaryColorNear, title='Upper Boundary: Near (Custom)') 
customEstimationPlot = plot(customEnvelopeClose, color=customEnvelope > customEnvelope[1] ? customBullishEstimatorColor : customBearishEstimatorColor, linewidth=2, title='Custom Estimation')
customLowerBoundaryNear = plot(math.exp(customLowerNear), color=customLowerBoundaryColorNear, title='Lower Boundary: Near (Custom)')
customLowerBoundaryAvg = plot(math.exp(customLowerAvg), color=customLowerBoundaryColorNear, title='Lower Boundary: Average (Custom)') 
customLowerBoundaryFar = plot(math.exp(customLowerFar), color=customLowerBoundaryColorFar, title='Lower Boundary: Far (Custom)')

// Fills
fill(customUpperBoundaryFar, customUpperBoundaryAvg, color=customUpperBoundaryColorFar, title='Upper Boundary: Farmost Region (Custom)')
fill(customUpperBoundaryNear, customUpperBoundaryAvg, color=customUpperBoundaryColorNear, title='Upper Boundary: Nearmost Region (Custom)')
fill(customLowerBoundaryNear, customLowerBoundaryAvg, color=customLowerBoundaryColorNear, title='Lower Boundary: Nearmost Region (Custom)')
fill(customLowerBoundaryFar, customLowerBoundaryAvg, color=customLowerBoundaryColorFar, title='Lower Boundary: Farmost Region (Custom)')


longCondition = ta.crossover(close, customEnvelopeLow)
if (longCondition)
    strategy.entry("Buy", strategy.long)

exitLongCondition = ta.crossover(customEnvelopeHigh, close)
if (exitLongCondition)
    strategy.close("Buy")