Adaptive Kryptowährungs-Arbitrage-Strategie basierend auf Grid-Trading


Erstellungsdatum: 2024-01-19 14:17:50 zuletzt geändert: 2024-01-19 14:17:50
Kopie: 1 Klicks: 1123
1
konzentrieren Sie sich auf
1617
Anhänger

Adaptive Kryptowährungs-Arbitrage-Strategie basierend auf Grid-Trading

Überblick

Die Strategie ist eine anpassungsfähige Krypto-Arbitrage-Strategie, die auf der Grid-Trading-Konzeption basiert. Sie ist in der Lage, die Preisspanne für den Grid-Trading automatisch an die Marktfluktuation anzupassen und effizient innerhalb dieser Preisspanne zu handeln.

Strategieprinzip

Die Kernidee der Strategie lautet:

  1. Die Dynamik berechnet die Preisspanne eines Handelsnetzes anhand historischer Preiskalkulationen und -tiefpunkte.

  2. In diesem Preiskalender werden gleichzeitig N Transaktionsgitterlinien gesetzt.

  3. Wenn der Preis jede der Gitterlinien durchbricht, wird eine feste Anzahl von Positionen über- oder untergeschlagen.

  4. Es wird zwischen den benachbarten Gitterlinien arbitragiert und nach Gewinn ausgeglichen.

  5. Wenn der Preis wieder in die Gitter-Reihe eintritt, wird die Position weiterhin zum Randkostenpreis der Gitterlinie eröffnet.

  6. Der Zyklus führt zu einem Hochfrequenz-Abrieb im Rahmen des Netzpreises.

Insbesondere berechnet die Strategie zunächst die Preisobergrenze des Rasters in Echtzeit anhand der konfigurierten i_boundLookback-Fenster und der Parameter für den Fluktuationsbereich i_boundDev.

Dann werden N Gitterlinien zwischen den oberen und unteren Grenzen gespalten ((i_gridQty). Die Preise dieser Gitterlinien werden in die GridLineArr-Array gespeichert.

Wenn der Preis eine bestimmte Gitterlinie durchbricht, wird ein Plus- oder Minus-Position mit einer festen Menge (das Strategiekapital geteilt durch die Anzahl der Gitter) eröffnet. Die Bestellungen werden in der OrderArr-Array aufgezeichnet.

Wenn der Preis die benachbarte Gitterlinie erneut durchbricht, kann er mit dem vorherigen Auftrag einen Gewinn ausgleichen und eine Gewinnschwelle erzielen.

So läuft der Kreislauf hin und her, und es wird hochfrequenter Arbitrage im Rahmen von Preisschwankungen betrieben.

Analyse der Stärken

Der größte Vorteil dieser Strategie gegenüber herkömmlichen Gitterstrategien besteht darin, dass der Gitterbereich automatisch angepasst wird und sich an Marktschwankungen anpassen kann. Es hat folgende Eigenschaften:

  1. Die Anpassung erfolgt automatisch, ohne menschliche Intervention.

  2. Der Markt ist in der Lage, die Preisentwicklung zu erfassen und entsprechend zu handeln.

  3. Die Risiken sind kontrollierbar und verhindern einseitige Angriffe.

  4. Die Handelsfrequenz ist hoch, die Gewinnquote ist hoch.

  5. Einfach zu verstehen, einfach zu konfigurieren.

  6. Die Finanzierung ist gut ausgeschöpft und nicht leicht in Schwierigkeiten zu geraten.

  7. Das ist eine sehr gute Möglichkeit, um den Markt in Echtzeit zu reflektieren und Roboter zu handeln.

Risikoanalyse

Obwohl die Strategie viele Vorteile hat, gibt es auch einige Risiken, die sich auf folgende Bereiche konzentrieren:

  1. Bei starken Preisschwankungen besteht die Gefahr von größeren Verlusten.

  2. Die richtige Haltedauer und das richtige Handelspaar sind notwendig, um einen Gewinn zu erzielen.

  3. Die Übereinstimmung zwischen der Größe des Fonds und der Bandbreite der Schwankungen muss sorgfältig bewertet werden.

  4. Es kann sein, dass die Parameter regelmäßig überwacht und optimiert werden müssen, um den Betrieb zu gewährleisten.

Die Maßnahmen umfassen:

  1. Erweitern Sie den Rasterabstand, erweitern Sie den Rasterbereich.

  2. Wählen Sie ein Paar mit geringerem Schwankungspotential.

  3. Umfang und Liquidität des Fonds müssen angepasst werden.

  4. Einrichtung eines automatischen Überwachungs- und Alarmsystems.

Optimierungsrichtung

Diese Strategie kann in folgenden Bereichen optimiert werden:

  1. Dynamische GitterDie Grid-Parameter können automatisch an die Volatilität der Handelspare angepasst werden.

  2. Stop-Loss-MechanismenEs ist wichtig, dass die Verbraucher ihre Verluste in angemessenen Positionen festlegen, um die Gefahr von Extremen zu vermeiden.

  3. Verbundnetz: Grid-Kombinationen mit unterschiedlichen Parametern in verschiedenen Zeitspannen, um eine zeitliche Wiederholung zu ermöglichen.

  4. Maschinelles LernenDie Automatisierung von Parametern durch Verwendung von Alternativregeln wie z.B. Neural Networks.

  5. Cross-Market-ArbitrageEs gibt viele Möglichkeiten, wie man mit Bitcoin umgehen kann, aber es gibt auch viele Möglichkeiten, wie man mit Bitcoin umgehen kann.

Zusammenfassen

Die Strategie ist insgesamt eine sehr praktische, anpassungsfähige Arbitrage-Strategie für Kryptowährungsnetze. Die größte Eigenschaft der Strategie ist, dass die Gridspanne im Vergleich zu herkömmlichen Netzen automatisch angepasst wird und die eigene Handelsspanne nach Marktveränderungen konfiguriert werden kann. Die Strategie ist klar, leicht zu verstehen und zu konfigurieren und eignet sich für den Einsatz von Einzelinvestoren mit einer bestimmten Basis.

Strategiequellcode
/*backtest
start: 2024-01-11 00:00:00
end: 2024-01-18 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("(IK) Grid Script", overlay=true, pyramiding=14, close_entries_rule="ANY", default_qty_type=strategy.cash, initial_capital=100.0, currency="USD", commission_type=strategy.commission.percent, commission_value=0.1)
i_autoBounds    = input(group="Grid Bounds", title="Use Auto Bounds?", defval=true, type=input.bool)                             // calculate upper and lower bound of the grid automatically? This will theorhetically be less profitable, but will certainly require less attention
i_boundSrc      = input(group="Grid Bounds", title="(Auto) Bound Source", defval="Hi & Low", options=["Hi & Low", "Average"])     // should bounds of the auto grid be calculated from recent High & Low, or from a Simple Moving Average
i_boundLookback = input(group="Grid Bounds", title="(Auto) Bound Lookback", defval=250, type=input.integer, maxval=500, minval=0) // when calculating auto grid bounds, how far back should we look for a High & Low, or what should the length be of our sma
i_boundDev      = input(group="Grid Bounds", title="(Auto) Bound Deviation", defval=0.10, type=input.float, maxval=1, minval=-1)  // if sourcing auto bounds from High & Low, this percentage will (positive) widen or (negative) narrow the bound limits. If sourcing from Average, this is the deviation (up and down) from the sma, and CANNOT be negative.
i_upperBound    = input(group="Grid Bounds", title="(Manual) Upper Boundry", defval=0.285, type=input.float)                      // for manual grid bounds only. The upperbound price of your grid
i_lowerBound    = input(group="Grid Bounds", title="(Manual) Lower Boundry", defval=0.225, type=input.float)                      // for manual grid bounds only. The lowerbound price of your grid.
i_gridQty       = input(group="Grid Lines",  title="Grid Line Quantity", defval=8, maxval=15, minval=3, type=input.integer)       // how many grid lines are in your grid

f_getGridBounds(_bs, _bl, _bd, _up) =>
    if _bs == "Hi & Low"
        _up ? highest(close, _bl) * (1 + _bd) : lowest(close, _bl)  * (1 - _bd)
    else
        avg = sma(close, _bl)
        _up ? avg * (1 + _bd) : avg * (1 - _bd)

f_buildGrid(_lb, _gw, _gq) =>
    gridArr = array.new_float(0)
    for i=0 to _gq-1
        array.push(gridArr, _lb+(_gw*i))
    gridArr

f_getNearGridLines(_gridArr, _price) =>
    arr = array.new_int(3)
    for i = 0 to array.size(_gridArr)-1
        if array.get(_gridArr, i) > _price
            array.set(arr, 0, i == array.size(_gridArr)-1 ? i : i+1)
            array.set(arr, 1, i == 0 ? i : i-1)
            break
    arr

var upperBound      = i_autoBounds ? f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, true) : i_upperBound  // upperbound of our grid
var lowerBound      = i_autoBounds ? f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, false) : i_lowerBound // lowerbound of our grid
var gridWidth       = (upperBound - lowerBound)/(i_gridQty-1)                                                       // space between lines in our grid
var gridLineArr     = f_buildGrid(lowerBound, gridWidth, i_gridQty)                                                 // an array of prices that correspond to our grid lines
var orderArr        = array.new_bool(i_gridQty, false)                                                              // a boolean array that indicates if there is an open order corresponding to each grid line

var closeLineArr    = f_getNearGridLines(gridLineArr, close)                                                        // for plotting purposes - an array of 2 indices that correspond to grid lines near price
var nearTopGridLine = array.get(closeLineArr, 0)                                                                    // for plotting purposes - the index (in our grid line array) of the closest grid line above current price
var nearBotGridLine = array.get(closeLineArr, 1)                                                                    // for plotting purposes - the index (in our grid line array) of the closest grid line below current price
strategy.initial_capital = 50000
for i = 0 to (array.size(gridLineArr) - 1)
    if close < array.get(gridLineArr, i) and not array.get(orderArr, i) and i < (array.size(gridLineArr) - 1)
        buyId = i
        array.set(orderArr, buyId, true)
        strategy.entry(id=tostring(buyId), long=true, qty=(strategy.initial_capital/(i_gridQty-1))/close, comment="#"+tostring(buyId))
    if close > array.get(gridLineArr, i) and i != 0
        if array.get(orderArr, i-1)
            sellId = i-1
            array.set(orderArr, sellId, false)
            strategy.close(id=tostring(sellId), comment="#"+tostring(sellId))

if i_autoBounds
    upperBound  := f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, true)
    lowerBound  := f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, false)
    gridWidth   := (upperBound - lowerBound)/(i_gridQty-1)
    gridLineArr := f_buildGrid(lowerBound, gridWidth, i_gridQty)

closeLineArr    := f_getNearGridLines(gridLineArr, close)
nearTopGridLine := array.get(closeLineArr, 0)
nearBotGridLine := array.get(closeLineArr, 1)