Denken Sie über die Strategie des Hochfrequenz-Handels nach (1)

Schriftsteller:Das Gras, Erstellt: 2023-08-03 16:14:16, aktualisiert: 2023-12-08 16:37:21

img

Der Artikel untersucht die High-Frequency Trading-Strategien für digitale Währungen, einschließlich der Gewinnquellen (vor allem durch starke Marktfluktuationen und Exchange-Verfahren), Hanging Positions und Positionskontrollen, sowie die Modellierung von Transaktionen mit der Pareto-Distribution. Außerdem wird auf die von Binance bereitgestellten Einzeltransaktionen und Best-Langed-Order-Daten verwiesen, und es ist geplant, weitere Fragen der High-Frequency-Trading-Strategien in den folgenden Artikeln zu erörtern.

Ich habe zwei Artikel über hohe Frequenz-Transaktionen in digitalen Währungen geschrieben.Einführung in die High-Frequency-Strategie von Kryptowährungen, 5 Ventilatoren 80 mal stärker als die HochfrequenzstrategieIch habe vor, eine Reihe von Artikeln zu schreiben, die von Anfang an die Idee des Hochfrequenz-Handels vorstellen. Ich hoffe, dass ich es so kurz wie möglich machen kann, aber aufgrund meines begrenzten persönlichen Verständnisses von Hochfrequenz-Handel ist es nicht tiefgründig.

Quelle für Hochfrequenz-Gewinn

In früheren Artikeln wurde erwähnt, dass die Hochfrequenzstrategie besonders für Märkte geeignet ist, die sehr stark von oben nach unten schwanken. Untersuchen Sie eine Handelssorte, die von Preisänderungen in kurzer Zeit besteht, bestehend aus Gesamttrends und Erschütterungen. Natürlich können Sie Geld verdienen, wenn Sie die Veränderungen der Trends genau vorhersagen können, aber dies ist auch am schwierigsten.

Probleme zu lösen

1.策略同时挂买单和卖单,第一个问题就是在哪里挂单。挂的离盘口越近,成交的概率越高,但在剧烈波动的行情中,瞬间成交的价格可能离盘口较远,挂的那太近没有能吃到足够的利润。挂的太远的单子成交概率又低。这是一个需要优化的问题。

2.控制仓位。为了控制风险,策略就不能长时间累计过多的仓位。可以通过控制挂单距离、挂单量、总仓位限制等办法解决。

Um die oben genannten Ziele zu erreichen, ist es notwendig, Modellschätzungen für verschiedene Aspekte wie Transaktionswahrscheinlichkeitswahrscheinlichkeit, Transaktionsgewinn, Marktschätzung zu erstellen. Es gibt viele Artikel und Papiere zu diesem Thema, die unter den Schlüsselwörtern High-Frequency Trading, Orderbook und so weiter zu finden sind. Es gibt auch viele Empfehlungen im Internet.

Daten benötigt

Binance bietet Transaktionsdaten und die besten Daten für aufgeschlossene Bestellungen.HerunterladenDie Daten müssen in der Whitelist mit einer API heruntergeladen werden und können auch selbst gesammelt werden.

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

Die Transaktionen umfassen:

  1. Agg_trade_id: Die ID, die zu den Transaktionen zusammengefasst wird.
  2. Preis: Preis der Transaktion
  3. Quantity: Anzahl der Transaktionen
  4. first_trade_id: Eine zusammengefasste Transaktion kann mehrere Transaktionen gleichzeitig haben, wobei nur eine Datenbank, die erste Transaktions-id, erfasst wird
  5. Last_trade_id: Die ID der letzten Transaktion
  6. Transact_time: Zeit, zu der die Transaktion abgeschlossen wurde
  7. is_buyer_maker: Transaktionsrichtung, True steht für Käufer-Maker-Transaktion, Käufer ist der Taker

Sie können sehen, dass 660.000 Transaktionsdaten an diesem Tag vorhanden sind und dass die Transaktionen aktiv sind.

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

664475 Zeilen × 7 Spalten

Agg_trade_id Preis Anzahl erste_Handel_id Last_trade_id Transaktionszeit ist_Käufer_Hersteller
120719552 52.42 22.087 207862988 207862990 1688256004603 Nicht zutreffend
120719553 52.41 29.314 207862991 207863002 1688256004623 Das ist wahr.
120719554 52.42 0.945 207863003 207863003 1688256004678 Nicht zutreffend
120719555 52.41 13.534 207863004 207863006 1688256004680 Das ist wahr.
121384024 68.29 10.065 210364899 210364905 1688342399863 Nicht zutreffend
121384025 68.30 7.078 210364906 210364908 1688342399948 Nicht zutreffend
121384026 68.29 7.622 210364909 210364911 1688342399979 Das ist wahr.

Modelle für Transaktionen

Zuerst werden die Daten verarbeitet und die ursprünglichen Trades in die Transact-Initiative-Gruppe und in die Transact-Initiative-Gruppe geteilt. Die Daten der ursprünglichen Aggregat-Trade sind jedoch zur gleichen Zeit und zum gleichen Preis in der gleichen Richtung als eine Datenbank. Es kann eine aktive Transaktion von 100 passieren. Wenn mehrere Transaktionen in verschiedene Preise geteilt werden, wie zum Beispiel 60 und 40, werden zwei Daten produziert, die die Transaktionszahl beeinflussen.

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()
print(trades.shape[0] - (buy_trades.shape[0]+sell_trades.shape[0]))
146181

Als Beispiel für Zahlungen, die zuerst in einer Geraden dargestellt werden, kann man sehen, dass der Langschwanz-Effekt sehr deutlich ist, wobei sich der größte Teil der Daten auf der linken Seite konzentriert, aber auch eine geringe Anzahl großer Transaktionen auf der Rückseite verteilt ist.

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

png

为了观察方便,截掉尾部观察.可以看到成交量越大,出现频率越低,且减少的趋势更快。

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

png

Die Power-Law-Verteilung, auch bekannt als Pareto-Verteilung, ist eine in der statistischen Physik und in den Sozialwissenschaften verbreitete Form der Wahrscheinlichkeitsverteilung. In einer Pareto-Verteilung ist die Wahrscheinlichkeit einer Ereignisgröße (oder -frequenz) in einem negativen Index der Ereignisgröße.

Die folgende Abbildung zeigt die Wahrscheinlichkeit, dass ein Auftragsvolumen größer als ein bestimmter Wert ist, mit der blauen Linie für die tatsächliche Wahrscheinlichkeit und der schrägen Linie für die simulierte Wahrscheinlichkeit.

png

Hier ist N ein standardisierter Parameter. Hier wählt man den Durchschnittstransaktionswert M, hier wählt man Alpha-2.06. Die spezifische Alpha-Schätzung kann durch P-Werte, wenn D = N, zurückgerechnet werden.

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)

img

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

png

Aber diese Schätzung sieht nur so aus, als ob wir in der Abbildung oben die Differenz zwischen dem Analogwert und dem tatsächlichen Wert dargestellt haben. Wenn die Transaktionen kleiner sind, ist die Abweichung sehr groß, sogar nahezu 10%. Es kann durch die Parameterschätzung verschiedene Punkte ausgewählt werden, um die Wahrscheinlichkeit dieses Punktes genauer zu machen, aber auch die Abweichungsprobleme werden nicht gelöst.

png

Um es kurz zu machen: hier wird die standardisierte Transaktionsmenge mit r = q/M dargestellt. Die Parameter können in der gleichen Weise geschätzt werden wie oben. Die folgende Abbildung zeigt, dass die maximale Abweichung nach der Korrektur nicht mehr als 2% beträgt.

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)
plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);

png

Bei einer Schätzung der Verteilung der Transaktionen ist die Wahrscheinlichkeit der Gleichung nicht die wahre Wahrscheinlichkeit, sondern eine bedingte Wahrscheinlichkeit. Hier kann man die Frage beantworten, wie groß die Wahrscheinlichkeit ist, dass diese Bestellung größer ist als ein bestimmter Wert, wenn der nächste Auftrag stattfindet. Man kann auch sagen, wie groß die Wahrscheinlichkeit ist, dass Bestellungen unterschiedlicher Tiefen ausgeführt werden.

Ich bin fast fertig, aber es gibt noch viele Fragen, die ich beantworten möchte, und die folgenden Artikel werden versuchen, diese zu beantworten.


Mehr

Ock-Quantität 🐂🍺

fmzeroDas ist ein Schlagzeug!

Das GrasDie CSV ist zu groß, um selbst heruntergeladen zu werden.