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

Schriftsteller:Das Gras, Erstellt: 2023-08-08 22:31:47, Aktualisiert: 2023-09-18 19:51:25

img

Der vorherige Artikel zeigt, warum Dynamic Adjustment von Parametern und wie man Schätzungen gut oder schlecht bewertet, indem er den Ankunftsintervall von Aufträgen untersucht. Dieser Artikel konzentriert sich auf tiefgreifende Daten und untersucht den mittleren Preis (oder Fair-Price, Micro-Price usw.).

Tiefe Daten

Binance bietet historische Best-Bid-Daten herunterladen, die best_bid_price enthalten: best_bid_qty: Best_bid_price, best_bid_qty: Best_ask_price: Best_ask_price: Best_ask_price, best_ask_qty: Best_sell_price, best_ask_price: Best_sell_price, best_ask_price: Best_ask_price, best_ask_price: Best_ask_price, best_ask_price: Best_sell_price, best_ask_price: Best_ask_price, best_ask_qty: Best_sell_price, best_ask_price: Best_sell_price, best_ask_price: Best_sell_price, best_ask_price: Best_sell_price, best_sell_price, best_sell_price, best_sell_sell_price, best_sell_sell_price, best

Zunächst betrachten wir den Markt für den Tag, der stark ansteigt und fällt, außerdem verändert sich die Tageshandelshöhe mit den Marktfluktuationen, insbesondere der Spread. Der Spread zeigt sehr deutlich die Volatilität des Marktes an. In den Statistiken über den YGG-Tagmarkt gibt es 20% Zeitstrecke, die größer als ein Ticken sind.

from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
books = pd.read_csv('YGGUSDT-bookTicker-2023-08-07.csv')
tick_size = 0.0001
books['date'] = pd.to_datetime(books['transaction_time'], unit='ms')
books.index = books['date']
books['spread'] = round(books['best_ask_price'] - books['best_bid_price'],4)
books['best_bid_price'][::10].plot(figsize=(10,5),grid=True);

img

books['best_bid_qty'][::10].rolling(10000).mean().plot(figsize=(10,5),grid=True);
books['best_ask_qty'][::10].rolling(10000).mean().plot(figsize=(10,5),grid=True);

img

(books['spread'][::10]/tick_size).rolling(10000).mean().plot(figsize=(10,5),grid=True);

img

books['spread'].value_counts()[books['spread'].value_counts()>500]/books['spread'].value_counts().sum()
0.0001    0.799169
0.0002    0.102750
0.0003    0.042472
0.0004    0.022821
0.0005    0.012792
0.0006    0.007350
0.0007    0.004376
0.0008    0.002712
0.0009    0.001657
0.0010    0.001089
0.0011    0.000740
0.0012    0.000496
0.0013    0.000380
0.0014    0.000258
0.0015    0.000197
0.0016    0.000140
0.0017    0.000112
0.0018    0.000088
0.0019    0.000063
Name: spread, dtype: float64

Ungleichgewichte Angebote

Von oben kann man sehen, dass sich die Anzahl der aufgelösten Bestellungen für den Großteil der Zeit stark unterscheidet, was eine starke Vorhersage für die kurzfristige Entwicklung des Marktes darstellt. Die Gründe, warum die Anzahl der aufgelösten Bestellungen häufig sinkt, sind ähnlich wie in den vorherigen Artikeln. Wenn die Anzahl der Aufträge auf der einen Seite signifikant kleiner ist als auf der anderen Seite, wird angenommen, dass die Anzahl der nachfolgenden aktiven Bestellungen nahe ist.imgQ_b steht für Best_bid_qty und Q_a für Best_ask_qty.

Definition von Mid-Price:img

Die folgende Abbildung zeigt die Beziehung zwischen der Veränderung des mittleren Preises und der Ungleichgewichts I nach 1 Intervall, und in Übereinstimmung mit der Erwartung, dass die Preise mit zunehmender Wahrscheinlichkeit steigen, und dass sich das Ausmaß der Preisschwankung näher an 1 beschleunigt. In Hochfrequenz-Handeln wird ein mittlerer Preis eingeführt, um die Veränderungen der zukünftigen Preise besser vorherzusagen, d. h. je kleiner die Differenz von den zukünftigen Preisen ist, desto besser ist der mittlere Preis definiert.img

books['I'] = books['best_bid_qty'] / (books['best_bid_qty'] + books['best_ask_qty'])
books['mid_price'] = (books['best_ask_price'] + books['best_bid_price'])/2
bins = np.linspace(0, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['price_change'] = (books['mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['price_change'].mean()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Average Mid Price Change Rate');
plt.grid(True)

img

books['weighted_mid_price'] = books['mid_price'] + books['spread']*books['I']/2
bins = np.linspace(-1, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['weighted_price_change'] = (books['weighted_mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['weighted_price_change'].mean()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Weighted Average Mid Price Change Rate');
plt.grid(True)

img

Anpassung der Gewichtungsmittelpreise

Auf der Abbildung sieht man, dass die Veränderung des gewichteten mittleren Preises relativ zu den verschiedenen I's sehr gering ist, was zeigt, dass der gewichtete mittlere Preis eine bessere Passform ist. Es gibt jedoch noch einige Regeln, wie z. B. eine größere Abweichung in der Nähe von 0,2 und 0,8. Dies zeigt, dass I immer noch zusätzliche Informationen beitragen kann. Da der gewichtete mittlere Preis die Preisrevision mit I als vollständig linear annehmt, entspricht dies offensichtlich nicht der Realität. Wie aus der Abbildung zu sehen ist, ist die Abweichung schneller, nicht linear.

Für mehr Intuition definiere ich das hier neu:

img

Derzeit:

img

Man kann feststellen, dass der gewichtete Mittelpreis eine Änderung des mittleren mittleren Preises ist, wobei der Koeffizient der Änderung Spread ist und der Änderungsfaktor eine Funktion von I ist. Der gewichtete Mittelpreis wird einfach angenommen, dass die Beziehung I/2 ist. Hier zeigt sich der Vorteil der angepassten Verteilung von I (−1,1) über die Symmetrie des Ursprungspunktes, die uns die Möglichkeit bietet, die Anpassungsbeziehung der Funktion zu finden.

img

Hier ist N eine positive und sogar paarfache Zahl, und nach praktischen Tests ist N bei 8 besser. Bis jetzt hat dieser Artikel einen modifizierten gewichteten Mittelwert vorgeschlagen:

img

Das Ergebnis ist zwar besser als ein einfacher gewichteter Mittelpreis, ist aber nicht in der Praxis anwendbar. Hier gibt es nur eine Idee. S. Stoikov in einem Artikel aus dem Jahr 2017 beschreibt die Markov-Kette.KleinstpreisDer Autor des Artikels schreibt: "Die meisten Menschen, die in der Welt leben, haben ein Problem mit dem Code, den sie verwenden.

books['I'] = (books['best_bid_qty'] - books['best_ask_qty']) / (books['best_bid_qty'] + books['best_ask_qty'])
books['weighted_mid_price'] = books['mid_price'] + books['spread']*books['I']/2
bins = np.linspace(-1, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['weighted_price_change'] = (books['weighted_mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['weighted_price_change'].sum()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Weighted Average Mid Price Change Rate');
plt.grid(True)

img

books['adjust_mid_price'] = books['mid_price'] + books['spread']*(books['I'])*(books['I']**8+1)/4
bins = np.linspace(-1, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['adjust_mid_price'] = (books['adjust_mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['adjust_mid_price'].sum()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Weighted Average Mid Price Change Rate');
plt.grid(True)

img

books['adjust_mid_price'] = books['mid_price'] + books['spread']*(books['I']**3)/2
bins = np.linspace(-1, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['adjust_mid_price'] = (books['adjust_mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['adjust_mid_price'].sum()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Weighted Average Mid Price Change Rate');
plt.grid(True)

img

Zusammenfassung

Der Zwischenpreis ist für die Hochfrequenzstrategie sehr wichtig und ist eine Vorhersage von zukünftigen kurzfristigen Preisen, daher sollte der Zwischenpreis so genau wie möglich sein. Die zuvor vorgestellten Zwischenpreise basieren auf Aufschlagsdaten, da nur eine Branche bei der Analyse verwendet wurde. Im realen Handel sollte die Strategie so viele Daten wie möglich verwenden, insbesondere bei Trades in Exchange, und die Vorhersage des Zwischenpreises sollte anhand der tatsächlichen Transaktionspreise überprüft werden.


Mehr

LouisIch kann es nicht mehr verstehen.

fmzeroDas ist ein Schlagzeug!