Überlegungen zu Hochfrequenzhandelsstrategien (1)

Schriftsteller:Lydia., Erstellt: 2023-08-04 13:47:39, Aktualisiert: 2023-09-12 15:50:10

img

Überlegungen zu Hochfrequenzhandelsstrategien (1)

Ich habe zwei Artikel über den Hochfrequenzhandel mit digitalen Währungen geschrieben, nämlich Digitale Währung Hochfrequenzstrategie Detaillierte Einführung und Verdienen Sie 80 Mal in 5 Tagen, die Macht der Hochfrequenzstrategie. Diese Artikel können jedoch nur als Erfahrungsaustausch betrachtet werden und einen allgemeinen Überblick geben. Diesmal plane ich, eine Reihe von Artikeln zu schreiben, um den Denkprozess hinter dem Hochfrequenzhandel von Grund auf einzuführen. Ich hoffe, es prägnant und klar zu halten, aber aufgrund meiner begrenzten Expertise ist mein Verständnis des Hochfrequenzhandels möglicherweise nicht sehr tiefgründig. Dieser Artikel sollte als Ausgangspunkt für eine Diskussion angesehen werden, und ich begrüße Korrekturen und Anleitungen von Experten.

Quelle von Hochfrequenzgewinnen

In meinen vorherigen Artikeln habe ich erwähnt, dass Hochfrequenzstrategien besonders für Märkte mit extrem volatilen Schwankungen geeignet sind. Die Preisänderungen eines Handelsinstruments innerhalb kurzer Zeit bestehen aus allgemeinen Trends und Schwankungen. Während es zwar profitabel ist, wenn wir Trendänderungen genau vorhersagen können, ist dies auch der schwierigste Aspekt. In diesem Artikel werde ich mich hauptsächlich auf Hochfrequenz-Maker-Strategien konzentrieren und nicht in die Trendvorhersage eintauchen. In schwankenden Märkten, indem man strategisch Gebote und Aufträge platziert, kann die Frequenz der Gebots- und Gewinnausgaben, wenn die Frequenz der Gebots- und Gewinnausgaben hoch genug ist und die Gewinnspanne beträchtlich ist, potenzielle Verluste decken, die durch Trends verursacht werden. Auf diese Weise kann die Rentabilität erreicht werden, ohne Marktbewegungen vorherzusagen. Derzeit bieten Börsen Rabatte für Maker-Trades, die auch eine Gewinnkompon

Probleme zu lösen

  1. Das erste Problem bei der Implementierung einer Strategie, die sowohl Kauf- als auch Verkaufsaufträge platziert, ist die Bestimmung, wo diese Aufträge platziert werden sollen. Je näher die Aufträge an der Markttiefe platziert werden, desto höher ist die Ausführungswahrscheinlichkeit. In sehr volatilen Marktbedingungen kann jedoch der Preis, zu dem eine Bestellung sofort ausgeführt wird, weit von der Markttiefe entfernt sein, was zu einem unzureichenden Gewinn führt. Auf der anderen Seite reduziert das Platzieren von Aufträgen zu weit die Ausführungswahrscheinlichkeit. Dies ist ein Optimierungsproblem, das angegangen werden muss.

  2. Eine Strategie kann keine übermäßigen Positionen für längere Zeiträume akkumulieren. Dies kann durch die Kontrolle der Entfernung und Menge der platzierten Aufträge sowie die Festlegung von Grenzen für die Gesamtpositionen angegangen werden.

Um die oben genannten Ziele zu erreichen, sind Modellierung und Schätzung für verschiedene Aspekte wie Ausführungswahrscheinlichkeiten, Gewinn aus Ausführungen und Marktschätzung erforderlich. Es gibt zahlreiche Artikel und Papiere zu diesem Thema, die Schlüsselwörter wie High-Frequency Trading und Orderbook verwenden. Viele Empfehlungen können auch online gefunden werden, obwohl weitere Ausführungen über den Geltungsbereich dieses Artikels hinausgehen. Darüber hinaus ist es ratsam, ein zuverlässiges und schnelles Backtesting-System zu etablieren.

Erforderliche Daten

Binance bietetDaten zum Herunterladenfür einzelne Trades und beste Bid/Ask-Orders. Tiefendaten können über ihre API heruntergeladen werden, indem sie auf der Whitelist stehen, oder sie können manuell gesammelt werden. Für Backtesting-Zwecke reichen aggregierte Handelsdaten aus. In diesem Artikel verwenden wir das Beispiel von HOOKUSDT-aggTrades-2023-01-27 Daten.

In [1]:

from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

Die einzelnen Handelsdaten umfassen Folgendes:

  1. Agg_trade_id: Die ID des aggregierten Handels.
  2. Preis: Der Preis, zu dem der Handel ausgeführt wurde.
  3. Menge: Die Menge des Handels.
  4. first_trade_id: In Fällen, in denen mehrere Transaktionen aggregiert werden, stellt dies die ID des ersten Handels dar.
  5. Last_trade_id: Die ID des letzten Handels in der Aggregation.
  6. Transaktionszeit: Zeitstempel der Transaktionsdurchführung.
  7. ist_buyer_maker: Gibt die Richtung des Handels an. True stellt einen als Maker ausgeführten Kaufbefehl dar, während ein Verkaufsbefehl als Taker ausgeführt wird.

Es kann festgestellt werden, dass an diesem Tag 660.000 Trades ausgeführt wurden, was auf einen sehr aktiven Markt hinweist.

In [4]:

trades = pd.read_csv('COMPUSDT-aggTrades-2023-07-02.csv')
trades

Ausgeschaltet[4]: Ich bin nicht derjenige, der das Problem hat. Ich bin derjenige, der das Problem hat. Ich bin derjenige, der es hat.

img

664475 Zeilen × 7 Spalten

Modellierung des individuellen Handelsbetrags

Erstens werden die Daten verarbeitet, indem die ursprünglichen Trades in zwei Gruppen aufgeteilt werden: als Maker ausgeführte Kauforders und als Taker ausgeführte Verkaufsorders. Darüber hinaus kombinieren die ursprünglichen aggregierten Handelsdaten Trades, die zur gleichen Zeit, zum gleichen Preis und in der gleichen Richtung in einen einzigen Datenpunkt ausgeführt wurden. Zum Beispiel kann ein einzelner Kaufbefehl mit einem Volumen von 100 in zwei Trades mit einem Volumen von 60 bzw. 40 aufgeteilt werden, wenn die Preise unterschiedlich sind. Dies kann die Schätzung der Kaufbefehlsmengen beeinflussen. Daher ist es notwendig, die Daten erneut auf der Grundlage der Transact_time zu aggregieren. Nach dieser zweiten Aggregation wird das Datenvolumen um 140.000 Aufzeichnungen reduziert.

In [6]:

trades['date'] = pd.to_datetime(trades['transact_time'], unit='ms')
trades.index = trades['date']
buy_trades = trades[trades['is_buyer_maker']==False].copy()
sell_trades = trades[trades['is_buyer_maker']==True].copy()
buy_trades = buy_trades.groupby('transact_time').agg({
    'agg_trade_id': 'last',
    'price': 'last',
    'quantity': 'sum',
    'first_trade_id': 'first',
    'last_trade_id': 'last',
    'is_buyer_maker': 'last',
    'date': 'last',
    'transact_time':'last'
})
sell_trades = sell_trades.groupby('transact_time').agg({
    'agg_trade_id': 'last',
    'price': 'last',
    'quantity': 'sum',
    'first_trade_id': 'first',
    'last_trade_id': 'last',
    'is_buyer_maker': 'last',
    'date': 'last',
    'transact_time':'last'
})
buy_trades['interval']=buy_trades['transact_time'] - buy_trades['transact_time'].shift()
sell_trades['interval']=sell_trades['transact_time'] - sell_trades['transact_time'].shift()

In [10]:

print(trades.shape[0] - (buy_trades.shape[0]+sell_trades.shape[0]))

Außen [10]: Zubereitungen

Ein Beispiel für einen Buy-Order ist das Histogramm. Es kann beobachtet werden, dass es einen signifikanten Long-Tail-Effekt gibt, wobei sich der Großteil der Daten auf den linksten Teil des Histogramms konzentriert.

In [36]:

buy_trades['quantity'].plot.hist(bins=200,figsize=(10, 5));

Außen [36]:

img

Für eine einfachere Beobachtung lassen Sie uns den Schwanz schneiden und die Daten analysieren.

In [37]:

buy_trades['quantity'][buy_trades['quantity']<200].plot.hist(bins=200,figsize=(10, 5));

Außen [37]:

img

Es wurden zahlreiche Studien zur Verteilung von Handelsbeträgen durchgeführt. Es wurde festgestellt, dass Handelsbeträgen einer Verteilung nach dem Potenzgesetz folgen, die auch als Pareto-Verteilung bekannt ist, was eine häufige Wahrscheinlichkeitsverteilung in der statistischen Physik und den Sozialwissenschaften ist. In einer Power-Law-Verteilung ist die Wahrscheinlichkeit einer Ereignisgröße (oder Häufigkeit) proportional zu einem negativen Exponenten dieser Ereignisgröße. Das Hauptmerkmal dieser Verteilung ist, dass die Häufigkeit großer Ereignisse (d. h. derjenigen, die weit vom Durchschnitt entfernt sind) in vielen anderen Verteilungen höher ist als erwartet. Dies ist genau das Merkmal der Handelsmengeverteilung.

Die folgende Grafik stellt die Wahrscheinlichkeit dar, dass Handelsbeträge einen bestimmten Wert überschreiten. Die blaue Linie stellt die tatsächliche Wahrscheinlichkeit dar, während die orange Linie die simulierte Wahrscheinlichkeit darstellt. Bitte beachten Sie, dass wir an dieser Stelle nicht in die spezifischen Parameter eingehen werden. Es kann beobachtet werden, dass die Verteilung tatsächlich einer Pareto-Verteilung folgt. Da die Wahrscheinlichkeit, dass Handelsbeträge größer als Null sind, 1 ist und um die Normalisierung zu befriedigen, sollte die Verteilungsgleichung wie folgt sein:

img

Hier ist N der Parameter für die Normalisierung. Wir wählen den durchschnittlichen Handelsbetrag, M, und setzen Alpha auf -2.06. Die spezifische Schätzung von Alpha kann durch Berechnung des P-Wertes erhalten werden, wenn D=N. Insbesondere alpha = log (((P(d>M)) /log ((2). Die Wahl verschiedener Punkte kann zu leichten Unterschieden im Wert von Alpha führen.

In [55]:

depths = range(0, 250, 2)
probabilities = np.array([np.mean(buy_trades['quantity'] > depth) for depth in depths])
alpha = np.log(np.mean(buy_trades['quantity'] > mean_quantity))/np.log(2)
mean_quantity = buy_trades['quantity'].mean()
probabilities_s = np.array([(1+depth/mean_quantity)**alpha for depth in depths])

plt.figure(figsize=(10, 5))
plt.plot(depths, probabilities)
plt.plot(depths, probabilities_s)
plt.xlabel('Depth')
plt.ylabel('Probability of execution')
plt.title('Execution probability at different depths')
plt.grid(True)

Aus [55]:

img

In [56]:

plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);

Aus [56]:

img

Diese Schätzung ist jedoch nur annähernd, wie in der Grafik gezeigt, wo wir die Differenz zwischen den simulierten und tatsächlichen Werten zeichnen. Wenn die Handelsmenge klein ist, ist die Abweichung signifikant, sogar nahe 10%. Obwohl die Auswahl verschiedener Punkte während der Parameterschätzung die Genauigkeit der Wahrscheinlichkeit dieses bestimmten Punktes verbessern kann, löst sie das Abweichungsproblem nicht insgesamt. Diese Diskrepanz entsteht durch die Differenz zwischen der Stromgesetzverteilung und der tatsächlichen Verteilung. Um genauere Ergebnisse zu erzielen, muss die Gleichung der Stromgesetzverteilung geändert werden. Der spezifische Prozess wird hier nicht erläutert, aber in der Zusammenfassung, nach einem Moment des Einblicks, wird festgestellt, dass die tatsächliche Gleichung wie folgt sein sollte:

img

Um es zu vereinfachen, verwenden wir r = q / M, um den normalisierten Handelsbetrag darzustellen. Wir können die Parameter mit der gleichen Methode wie zuvor schätzen. Die folgende Grafik zeigt, dass nach der Änderung die maximale Abweichung nicht mehr als 2% beträgt. Theoretisch können weitere Anpassungen vorgenommen werden, aber dieses Genauigkeitsniveau ist bereits ausreichend.

In [52]:

depths = range(0, 250, 2)
probabilities = np.array([np.mean(buy_trades['quantity'] > depth) for depth in depths])
mean = buy_trades['quantity'].mean()
alpha = np.log(np.mean(buy_trades['quantity'] > mean))/np.log(2.05)
probabilities_s = np.array([(((1+20**(-depth/mean))*depth+mean)/mean)**alpha for depth in depths])

plt.figure(figsize=(10, 5))
plt.plot(depths, probabilities)
plt.plot(depths, probabilities_s)
plt.xlabel('Depth')
plt.ylabel('Probability of execution')
plt.title('Execution probability at different depths')
plt.grid(True)

Aus dem Spiel:

img

In [53]:

plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);

Aus [53]:

img

Bei der geschätzten Gleichung für die Handelsmengeverteilung ist es wichtig zu beachten, dass die Wahrscheinlichkeiten in der Gleichung nicht die tatsächlichen Wahrscheinlichkeiten, sondern bedingte Wahrscheinlichkeiten sind. An dieser Stelle können wir die Frage beantworten: Was ist die Wahrscheinlichkeit, dass die nächste Bestellung größer als ein bestimmter Wert ist? Wir können auch die Wahrscheinlichkeit bestimmen, dass Aufträge in verschiedenen Tiefen ausgeführt werden (in einem idealen Szenario, ohne Bestellzusätze, Annullierungen und Warteschlangen in der gleichen Tiefe zu berücksichtigen).

Der Text ist jetzt schon ziemlich lang, und es gibt noch viele Fragen, die beantwortet werden müssen.


Mehr